using GMW_data;
using SteamWare;
using System;
using System.Globalization;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace GMW.WebUserControls
{
  public partial class mod_PostRX_NT : System.Web.UI.UserControl
  {
    /// <summary>
    /// flusso associato (hard coded) a RX
    /// </summary>
    protected string flusso = "RX";
    /// <summary>
    /// stato associato (hard coded) a Controllato RX
    /// </summary>
    protected string statoUDC = "ContrRx";
    /// <summary>
    /// codice evento dell'UDC che si crea
    /// </summary>
    protected string codEventoUdc = "UDC_RX";
    public event EventHandler eh_reqUpdate;
    /// <summary>
    /// stringa UID univoca
    /// </summary>
    public string uid
    {
      get
      {
        return this.UniqueID.Replace("$", "_").Replace("-", "_");
      }
    }
    /// <summary>
    /// caricamento pagina
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void Page_Load(object sender, EventArgs e)
    {
      if (!Page.IsPostBack)
      {
        currParticolare = ""; Postazione.messaggiText = "";
        lblDTFus.Text = string.Format("{0:ddd dd/MM/yyyy, HH:mm}", dataFus);
        lblLinFus.Text = lineaFus;
        Postazione.warningText = "";
        fixTipoInput();
        fixCella();
        traduciObj();
      }
      doChecks();
    }
    /// <summary>
    /// qta pezzi x UDC
    /// </summary>
    public int qta
    {
      get
      {
        int qta = 0;
        try
        {
          qta = Convert.ToInt32(txtQta.Text.Trim());
        }
        catch
        { }
        return qta;
      }
      set
      {
        txtQta.Text = value.ToString();
      }
    }
    /// <summary>
    /// data fusione impostata SALVATA SU DB...
    /// </summary>
    public DateTime dataFus
    {
      get
      {
        DateTime answ = Convert.ToDateTime("1900-01-01");
        try
        {

          answ = Convert.ToDateTime(utils.obj.RTVal(user_std.pagCorrente, "dataFus" + Postazione.currCodLinea));
        }
        catch
        { }
        return answ;
      }
      set
      {
        utils.obj.taRTPV.upsert(user_std.pagCorrente, "dataFus" + Postazione.currCodLinea, string.Format("{0:yyyy/MM/dd HH:mm}", value));
        lblDTFus.Text = string.Format("{0:ddd dd/MM/yyyy, HH:mm}", value);
      }
    }
    /// <summary>
    /// LINEA fusione impostata SALVATA SU DB...
    /// </summary>
    public string lineaFus
    {
      get
      {
        string answ = "";
        try
        {

          answ = utils.obj.RTVal(user_std.pagCorrente, "lineaFus" + Postazione.currCodLinea);
        }
        catch
        { }
        return answ;
      }
      set
      {
        utils.obj.taRTPV.upsert(user_std.pagCorrente, "lineaFus" + Postazione.currCodLinea, value);
        lblLinFus.Text = value;
      }
    }
    /// <summary>
    /// aggiorna visualizzazioen dati particolare
    /// </summary>
    private void updatePart()
    {
      if (currParticolare != "")
      {
        lblParticolareAttivo.Text = string.Format("{0} <b>{1}</b>", traduci("particSel"), currParticolare);
        // aggiungo descrizione del particolare
        string descr = "";
        string disegno = "";
        try
        {
          DS_magazzino.AnagParticolariRow riga = MagClass.magazzino.taAnagPart.likeSearch(currParticolare, memLayer.ML.StringSessionObj("CodCS"))[0];
          descr = riga.DescParticolare;
          disegno = string.Format("( {0} )", riga.DisegnoGrezzo);
        }
        catch
        { }
        lblDescrAttivo.Text = descr;
        lblDisegno.Text = disegno;
      }
      else
      {
        lblParticolareAttivo.Text = "...";
        lblDescrAttivo.Text = "";
        lblDisegno.Text = "";
      }
    }
    /// <summary>
    /// sistema modalità input
    /// </summary>
    private void fixTipoInput()
    {
      bool barcodeEnabled = false;
      if (rblInputMode.SelectedValue.ToUpper() == "BARCODE")
      {
        barcodeEnabled = true;
      }
      Postazione.messaggiText = traduci("attesaInput");
      Postazione.warningText = "";
      divElenco.Visible = !barcodeEnabled;
      divBarcode.Visible = barcodeEnabled;
      doUpdate();
    }
    /// <summary>
    /// verifica se si debab mostrare un campo ricerca UDC attivo...
    /// </summary>
    private void fixCella()
    {
      lblIdxCella.Text = Postazione.currIdxCella.ToString();
    }
    /// <summary>
    /// richiesta (ri)stampa UDC
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    public void ristampa()
    {
      MagClass.magazzino.stampaAL(udcReq, Postazione.printer, Request.UserHostName);
      // registro ri-stampa UDC
      MagClass.magazzino.taSAO.insertQuery(DateTime.Now, MagClass.magazzino.CodSoggCurrUser, Postazione.name, Postazione.IP, udcReq, "", "creaAL", "Ri-Stampato AL Rx NT");
    }
    /// <summary>
    /// udc da stampare
    /// </summary>
    protected string udcReq
    {
      get
      {
        return memLayer.ML.StringSessionObj("udcSelSAO");
      }
    }
    /// <summary>
    /// effettua controlli visibilità
    /// </summary>
    private void doChecks()
    {
      checkBarcode();
    }
    /// <summary>
    /// sistemo labels oggetti
    /// </summary>
    private void traduciObj()
    {

    }
    /// <summary>
    /// wrapper traduzione
    /// </summary>
    /// <param name="lemma"></param>
    /// <returns></returns>
    public string traduci(object lemma)
    {
      return user_std.UtSn.Traduci(lemma.ToString());
    }
    /// <summary>
    /// indica se i caratteri vadano forzati a maiuscoli
    /// </summary>
    public bool forceUppercase
    {
      get
      {
        return memLayer.ML.confReadBool("forceUppercase");
      }
    }
    /// <summary>
    /// valore barcode
    /// </summary>
    public string barcodeIn
    {
      get
      {
        return txtBarcode.Text.Trim();
      }
      set
      {
        txtBarcode.Text = value;
      }
    }
    /// <summary>
    /// controlla se ci sia un barcode
    /// </summary>
    private void checkBarcode()
    {
      bool okDTL = false;
      if (barcodeIn != "")
      {
        Postazione.messaggiText = string.Format("{0}: {1}", traduci("BCodeIns"), barcodeIn);
        switch (MagClass.tipoBCode_L5(barcodeIn))
        {
          case tipoCodiceBarcode.DateTime:
            // imposto NUOVA dataora fusione...   
            okDTL = getDateTimeLine(false);
            if (okDTL)
            {
              Postazione.messaggiText = traduci("SetDataFus");
              Postazione.warningText = "";
              Postazione.CssClass = "stileComandoOk";
            }
            else
            {
              Postazione.messaggiText = traduci("ERR-BCD-004");
              Postazione.warningText = "";
              Postazione.CssClass = "stileComandoKo";
            }
            break;
          case tipoCodiceBarcode.DateTimeLine:
            okDTL = getDateTimeLine(true);
            if (okDTL)
            {
              Postazione.messaggiText = traduci("SetDataFus");
              Postazione.warningText = "";
              Postazione.CssClass = "stileComandoOk";
            }
            else
            {
              Postazione.messaggiText = traduci("ERR-BCD-004");
              Postazione.warningText = "";
              Postazione.CssClass = "stileComandoKo";
            }
            break;
          case tipoCodiceBarcode.Particolare:
            // imposto il particolare corrente
            currParticolare = barcodeIn;
            // controllo esista il particolare scansionato
            if (DataProxy.obj.taAnagParticolari.getByParticolare(currParticolare).Rows.Count == 0)
            {
              currParticolare = "";
              Postazione.messaggiText = traduci("partNotFound");
              Postazione.CssClass = "stileComandoKo";
            }
            else
            {
              Postazione.messaggiText = traduci("partSelected");
              Postazione.warningText = "";
              Postazione.CssClass = "stileComandoOk";
            }
            // leggo la qta dell'ultimo UDC del particolare, SE C'E', e la imposto...
            if (pezziUdc > 0)
            {
              qta = pezziUdc;
            }
            else // rimette default
            {
              qta = memLayer.ML.cdvi("QtaImballoRX");
            }
            break;
          default:
            Postazione.warningText = traduci("ERR-UNK-001");
            Postazione.CssClass = "stileComandoND";
            break;
        }
        barcodeIn = "";
      }
      else
      {
        Postazione.messaggiText = traduci("AttesaBCode");
        Postazione.CssClass = "stileAttesa";
      }
      doUpdate();
    }
    /// <summary>
    /// recupera da barcode dataOra e linea fusione (SE presenti)
    /// </summary>
    /// <param name="readline"></param>
    /// <returns></returns>
    private bool getDateTimeLine(bool readline)
    {
      bool okData = false;
      bool okLinea = false;
      DateTime oldDataFus = new DateTime(1900, 1, 1);
      // imposto NUOVA dataora fusione...
      string newData = "";
      string newLinea = "";
      // tento di recuperare e verifico validità dei 2 valori separatamente...
      try
      {
        newData = barcodeIn.Replace(memLayer.ML.AppConf["prefDateTime"], "").Substring(0, 10);
        if (newData != "")
        {
          dataFus = DateTime.ParseExact(newData, "yyMMddHHmm", CultureInfo.InvariantCulture);
          okData = true;
        }
      }
      catch
      {
        dataFus = oldDataFus;
      }
      if (readline)
      {
        if (okData)
        {
          try
          {
            newLinea = barcodeIn.Replace(memLayer.ML.AppConf["prefDateTime"], "").Substring(10, barcodeIn.Length - 10 - memLayer.ML.AppConf["prefDateTime"].Length);
            if ((newLinea != "") && (DataProxy.obj.taElPost.getByCod(newLinea).Rows.Count > 0))
            {
              lineaFus = newLinea;
              okLinea = true;
            }
            else
            {
              lineaFus = "";
              dataFus = oldDataFus;
            }
          }
          catch
          {
            lineaFus = "";
            dataFus = oldDataFus;
          }
        }
        else
        {
          lineaFus = "";
        }
      }
      else
      {
        okLinea = true;
      }
      // registro se necessario attributi sui vari UDC che fossero caricati...
      int numUdcCella = 0;
      DS_magazzino.v_UdcDetailDataTable tabUdcIn = new DS_magazzino.v_UdcDetailDataTable();
      try
      {
        tabUdcIn = MagClass.magazzino.taDettUDC.getUdcDetailByIdxCella(Postazione.currIdxCella);
        numUdcCella = tabUdcIn.Rows.Count;
      }
      catch
      { }
      if (numUdcCella > 0)
      {
        DateTime adesso = DateTime.Now;
        foreach (DS_magazzino.v_UdcDetailRow riga in tabUdcIn)
        {
          // 2014.07.10 aggiungo attributo della data di fusione...
          MagClass.magazzino.taAtt2UDC.upsertVal(riga.UDC, "DF", string.Format("{0:yyyy/MM/dd HH:mm}", dataFus), adesso, MagClass.magazzino.CodSoggCurrUser);
          // 2015.06.03 aggiunto attributo linea fusione!
          MagClass.magazzino.taAtt2UDC.upsertVal(riga.UDC, "LF", string.Format("{1} - {0:yy/MM/dd HH:mm}", dataFus, lineaFus), adesso, MagClass.magazzino.CodSoggCurrUser);
        }
      }
      return okData && okLinea;
    }
    /// <summary>
    /// aggiorna tabella + focus a barcode
    /// </summary>
    public void doUpdate()
    {
      fixCella();
      grView.DataBind();
      // fix dataFus
      lblDTFus.Text = string.Format("{0:ddd dd/MM/yyyy, HH:mm}", dataFus);
      updatePart();
      // raise dell'evento
      if (eh_reqUpdate != null)
      {
        eh_reqUpdate(this, new EventArgs());
      }
      verificaBtnStampa();
      txtBarcode.Focus();
    }
    /// <summary>
    /// effettua reset dati
    /// </summary>
    private void doResetData()
    {
      // resetto i dati QtaTot e particolare...
      doChecks();
    }
    /// <summary>
    /// indica il codice articolo correntemente selezionato
    /// </summary>
    protected string currParticolare
    {
      get
      {
        return memLayer.ML.StringSessionObj(string.Format("currParticolare_{0}", uid));
      }
      set
      {
        memLayer.ML.setSessionVal(string.Format("currParticolare_{0}", uid), value, memLayer.ML.confReadBool("keepParticolareSel"));
      }
    }
    /// <summary>
    ///  num pezzi dell'ultimo UDC del particolare generato
    /// </summary>
    public int pezziUdc
    {
      get
      {
        int answ = 0;
        try
        {
          answ = (int)MagClass.magazzino.taCartellini.getLastByParticolareStato(memLayer.ML.StringSessionObj("CodCS"), currParticolare, statoUDC, false)[0].Qta;
        }
        catch
        { }
        return answ;
      }
    }
    /// <summary>
    /// traduce gli header delle colonne
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void grView_DataBound(object sender, EventArgs e)
    {
      if (grView.Rows.Count > 0)
      {
        LinkButton lb;
        // aggiorno gli headers        
        foreach (TableCell cella in grView.HeaderRow.Cells)
        {
          try
          {
            lb = (LinkButton)cella.Controls[0];
            lb.Text = traduci(lb.Text);
          }
          catch
          { }
        }
        int totRecord = grView.Rows.Count + grView.PageSize * (grView.PageCount - 1);
        lblNumRec.Text = string.Format("{0} / 6", totRecord);
      }
      else
      {
        lblNumRec.Text = "";
      }
    }
    /// <summary>
    /// cambiato tipo di richiesta di input
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void rblInputMode_SelectedIndexChanged(object sender, EventArgs e)
    {
      fixTipoInput();
    }
    /// <summary>
    /// salvo il particolare selezionato...
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void lbtAddPart_Click(object sender, EventArgs e)
    {
      // imposto il particolare corrente
      currParticolare = ddlPart.SelectedValue;
      Postazione.messaggiText = traduci("partSelected");
      Postazione.warningText = "";
      Postazione.CssClass = "stileComandoOk";
      // leggo la qta dell'ultimo UDC del particolare, SE C'E', e la imposto...
      if (pezziUdc > 0)
      {
        qta = pezziUdc;
      }
      else // rimette default
      {
        qta = memLayer.ML.cdvi("QtaImballoRX");
      }
      doUpdate();
    }
    /// <summary>
    /// creo il nuovo UDC da particolare corrente!
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void lbtAddUdc_Click(object sender, EventArgs e)
    {
      // controlli preliminari
      if (Postazione.currCodCella != "")
      {
        if (currParticolare != "")
        {
          if (qta > 0)
          {
            checkCreaUDC();
          }
          else
          {
            Postazione.warningText = traduci("ErroreNoQta");
            Postazione.CssClass = "stileComandoKo";
          }
        }
        else
        {
          Postazione.warningText = traduci("ErroreNoPart");
          Postazione.CssClass = "stileComandoKo";
        }
      }
      else
      {
        Postazione.warningText = traduci("ErroreNoSelLinea");
        Postazione.CssClass = "stileComandoKo";
      }
      doUpdate();
    }
    /// <summary>
    /// crea eventualmente UDC per particolare
    /// </summary>
    /// <param name="qty"></param>
    /// <param name="particolare"></param>
    private void checkCreaUDC()
    {
      string newUdcChild = "";
      string noteTrim = "";
      DateTime adesso = DateTime.Now;
      // verifico se ho già quel particolare tra quelli inseriti in linea...
      try
      {
        newUdcChild = DataProxy.obj.taCartellini.getByParticolareIdxPosIdxCella(currParticolare, memLayer.ML.cdvi("IdxPosizioneRxTemp"), Postazione.currIdxCella)[0].UDC;
      }
      catch
      {
        newUdcChild = "";
      }
      if (string.IsNullOrEmpty(newUdcChild))
      {
        // controllo NON ci siano troppi UDC in posizione... da capienza ed assegnati
        DS_magazzino.V_statoCelleCapienzaAssegnatiRow riga;
        bool piena = false;
        try
        {
          riga = MagClass.magazzino.taStatoCelle.getByIdxCella(Postazione.currIdxCella)[0];
          if (riga.UdcAssegnati >= riga.Capienza) piena = true;
        }
        catch
        {
        }
        if (!piena)
        {
          try
          {
            // creo nuovo UDC RX
            newUdcChild = MagClass.magazzino.creaUdc(flusso, "", currParticolare, "", "", "", "", "", 0, memLayer.ML.cdv("CodImballoRX"), "U", MagClass.magazzino.CodSoggCurrUser, qta, 0, 0, adesso, 0, statoUDC, memLayer.ML.cdvi("IdxPosizioneRxTemp"), "IdxPosizioneRxTemp", codEventoUdc, noteTrim, "", adesso.Year, Request.UserHostName);
          }
          catch (Exception exc)
          {
            logger.lg.scriviLog(string.Format("Errore in creazione UDC temp RX: {0}{1}", Environment.NewLine, exc));
          }
        }
        else
        {
          Postazione.warningText = traduci("ErroreAL-Full");
          doUpdate();
        }
      }
      else
      {
        // aggiorno quantità!
        MagClass.magazzino.taCartellini.updateQty(newUdcChild, MagClass.magazzino.CodSoggCurrUser, "U", codEventoUdc, qta);
      }
      if (newUdcChild != "")
      {
        // lo posiziono nella cella corrente...
        MagClass.magazzino.spostaUDC(memLayer.ML.StringSessionObj("CodCS"), newUdcChild, Postazione.currIdxCella, memLayer.ML.confReadBool("spostaUdcResettaLdp"), Request.UserHostName);
        Postazione.CssClass = "stileAttesa";
        Postazione.warningText = "";
        Postazione.messaggiText = traduci("partAdded");

        // 2014.07.10 aggiungo attributo della data di fusione...
        MagClass.magazzino.taAtt2UDC.upsertVal(newUdcChild, "DF", string.Format("{0:yyyy/MM/dd HH:mm}", dataFus), adesso, MagClass.magazzino.CodSoggCurrUser);
        // 2015.06.03 aggiunto attributo linea fusione!
        MagClass.magazzino.taAtt2UDC.upsertVal(newUdcChild, "LF", string.Format("{1} - {0:yy/MM/dd HH:mm}", dataFus, lineaFus), adesso, MagClass.magazzino.CodSoggCurrUser);

        currParticolare = "";
        doUpdate();
      }
    }
    /// <summary>
    /// evento selezione: ricarico dati!
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void grView_SelectedIndexChanged(object sender, EventArgs e)
    {
      // ricarico dati dell'UDC come particolare e quantità...
      string UDC = grView.SelectedDataKey["UDC"].ToString();
      if (MagClass.magazzino.checkUDC(UDC))
      {
        currParticolare = DataProxy.obj.taCartellini.stp_getByUdc(UDC)[0].Particolare;
        qta = Convert.ToInt32(DataProxy.obj.taCartellini.stp_getByUdc(UDC)[0].Qta);
      }
      Postazione.messaggiText = traduci("partSelected");
      Postazione.warningText = "";
      Postazione.CssClass = "stileComandoOk";
      doUpdate();
    }
    /// <summary>
    /// Numero cesta inserito
    /// </summary>
    public string numCesta
    {
      get
      {
        return txtCesta.Text.Trim();
      }
      set
      {
        txtCesta.Text = value;
      }
    }
    /// <summary>
    /// evento cambio num cesta/grappolo
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void txtCesta_TextChanged(object sender, EventArgs e)
    {
      txtCesta.Text = txtCesta.Text.ToUpper().Trim().PadLeft(4, '0').Substring(0, 4);
      doUpdate();
    }
    /// <summary>
    /// verifica visibilità btn stampa UDC
    /// </summary>
    private void verificaBtnStampa()
    {
      bool showBtnStampa = false;
      // se ho ALMENO 1 UDC
      DS_magazzino.V_statoCelleCapienzaAssegnatiRow riga;
      bool hasUdc = false;
      try
      {
        riga = MagClass.magazzino.taStatoCelle.getByIdxCella(Postazione.currIdxCella)[0];
        if (riga.UdcAssegnati > 0) hasUdc = true;
      }
      catch
      {
      }
      if (hasUdc)
      {
        // se ho num cesta...
        if (numCesta != "")
        {
          showBtnStampa = true;
        }
      }
      divNote.Visible = showBtnStampa;
    }
    /// <summary>
    /// genera e stampa AL
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void lbtGeneraAl_Click(object sender, EventArgs e)
    {
      // verifico postazione sia valida...
      if (Postazione.name != "" && Postazione.IP != "" && Postazione.currCodCella != "")
      {
        /* generazione e stampa AL */
        string AL = "";
        string noteTrim = txtNote.Text.Trim();
        // creazione AL ed associazione UDC / spostamento...
        try
        {
          AL = MagClass.magazzino.creaAssociaAlRxNt(tipoAL.AL_RxNt, Postazione.currCodCella, MagClass.magazzino.CodSoggCurrUser, DateTime.Now.Year, numCesta, noteTrim);
        }
        catch
        { }
        // lancio stampa
        MagClass.magazzino.stampaAL(AL, Postazione.printer, Request.UserHostName);
        // registro creazione AL
        MagClass.magazzino.taSAO.insertQuery(DateTime.Now, MagClass.magazzino.CodSoggCurrUser, Postazione.name, Postazione.IP, AL, "", "creaAL", string.Format("Creato AL RX su linea {0}, note: {1} ", Postazione.currCodLinea, noteTrim));
        Postazione.CssClass = "stileAttesa";
        Postazione.warningText = "";
        Postazione.messaggiText = traduci("cartAlStampato");
        txtCesta.Text = "";
        // resetto particolare...
        currParticolare = "";
        doUpdate();
      }
      else
      {
        // ricarico che mi manca postazione!
        Postazione.CssClass = "stileAttesa";
        Postazione.warningText = traduci("ERR-POS-001");
        Postazione.messaggiText = "";
        Response.Redirect(user_std.pagCorrente);
      }
    }
  }
}