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

namespace GMW.WebUserControls
{
  public partial class mod_lavMeccIN : GMW_data.UserControl
  {
    public event EventHandler eh_nuovaRicerca;
    public event EventHandler eh_reqUpdate;
    /// <summary>
    /// caricamento pagina
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void Page_Load(object sender, EventArgs e)
    {
      if (!Page.IsPostBack)
      {
        fixRicercaUdc();
        traduciObj();
        idxCella = Postazione.currIdxCella;
      }
      doChecks();
    }
    /// <summary>
    /// IDX cella associata alla linea corrente
    /// </summary>
    protected int idxCella
    {
      get
      {
        int answ = 0;
        if (memLayer.ML.isInSessionObject("IdxCellaLineaLM_IN"))
        {
          answ = memLayer.ML.IntSessionObj("IdxCellaLineaLM_IN");
        }
        return answ;
      }
      set
      {
        memLayer.ML.setSessionVal("IdxCellaLineaLM_IN", value);
      }
    }
    /// <summary>
    /// verifica se si debab mostrare un campo ricerca UDC attivo...
    /// </summary>
    private void fixRicercaUdc()
    {
      if (memLayer.ML.isInSessionObject("valoreCercatoLMI"))
      {
        testoRicerca = memLayer.ML.StringSessionObj("valoreCercatoLMI");
      }
    }
    /// <summary>
    /// richiesta (ri)stampa UDC
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    public void ristampa()
    {
      bool fatto = false;
      // registro ri-stampa UDC
      DateTime adesso = DateTime.Now;
      // calcolo particolare...
      DS_magazzino.ElencoCartelliniRow rigaUDC;
      string particolare = "";
      try
      {
        rigaUDC = MagClass.magazzino.taCartellini.getByUdc(udcReq)[0];
        particolare = rigaUDC.Particolare;
        fatto = MagClass.magazzino.ristampaUdc(udcReq, Postazione.printer, Request.UserHostName);
      }
      catch
      {
        logger.lg.scriviLog(string.Format("Errore recupero particolare UDC Finito LM IN {0}", udcReq), tipoLog.EXCEPTION);
      }
      if (fatto) MagClass.magazzino.taSAO.insertQuery(adesso, MagClass.magazzino.CodSoggCurrUser, Postazione.name, Postazione.IP, udcReq, particolare, "stampaUDC", "Ri-Stampato UDC Finito LM IN");
    }
    /// <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()
    {
      btnCerca.Text = traduci("btnSearch");
    }
    /// <summary>
    /// decodifica il tipo barcode acquisito
    /// </summary>
    public tipoCodiceBarcode tipoBCode
    {
      get
      {
        tipoCodiceBarcode answ = tipoCodiceBarcode.ND;
        int trovati = 0;
        // controllo non si tratti di un comando...
        string preCmd = memLayer.ML.AppConf["prefComandi"];
        if (barcodeIn.StartsWith(preCmd))
        {
          answ = tipoCodiceBarcode.Comando;
        }
        else if ((TermClass.Ter.riconosciBarcode(barcodeIn) == tipoCodiceBarcode.Particolare) && TermClass.Ter.isAnima(barcodeIn)) // è un particolare... ed un anima...
        {
          answ = tipoCodiceBarcode.Particolare;
        }
        else
        {
          try
          {
            // cerco tra UDC
            trovati = MagClass.magazzino.taCartellini.getByUdc(barcodeIn).Rows.Count;
            if (trovati > 0)
            {
              answ = tipoCodiceBarcode.UDC;
            }
          }
          catch
          {
          }
        }
        return answ;
      }
    }
    /// <summary>
    /// valore barcode
    /// </summary>
    public string barcodeIn
    {
      get
      {
        return txtBarcode.Text.Trim();
      }
      set
      {
        txtBarcode.Text = value;
      }
    }
    /// <summary>
    /// valore barcode
    /// </summary>
    public string lastBarcodeIn
    {
      get
      {
        return hfLastBCode.Value;
      }
      set
      {
        hfLastBCode.Value = value;
      }
    }
    /// <summary>
    /// controlla se ci sia un barcode
    /// </summary>
    private void checkBarcode()
    {
      if (barcodeIn != "")
      {
        Postazione.messaggiText = string.Format("Barcode digitato: {0}", barcodeIn);
        Postazione.warningText = "";
        switch (tipoBCode)
        {
          case tipoCodiceBarcode.UDC:
            // se linea non selezionata ERRORE!!!
            if (Postazione.currCodLinea == "W2000")
            {
              Postazione.messaggiText += " - Attenzione, IMPOSTARE LINEA!";
              Postazione.CssClass = "stileComandoKo";
            }
            else
            {
              // procedo solo se UDC esistente
              if (MagClass.magazzino.checkUDC(barcodeIn))
              {
                // controllo se NON ci siano NC "pending"
                if (MagClass.magazzino.checkUDC_NC(barcodeIn) != checkUdcNc.HasNc)
                {
                  // controllo IdxPosizione dell'UDC e confronto con posizione in webconfig x trattati (pre lavorazioni meccaniche)
                  int IdxPosizione = DataProxy.obj.taCartellini.stp_getByUdc(barcodeIn)[0].IdxPosizione;
                  if (IdxPosizione == memLayer.ML.cdvi("IdxPosizioneTrattati"))
                  {
                    int idxCellaCurr = 0;
                    try
                    {
                      idxCellaCurr = MagClass.magazzino.taPosUdcCorr.getByUDC(barcodeIn)[0].IdxCella;
                    }
                    catch
                    { }
                    // controllo se UDC non sia già stato spostato in posizione... ds magazzino, posiz udc corrente, get By udc
                    if (idxCellaCurr == Postazione.currIdxCella)
                    {
                      Postazione.messaggiText += " - Attenzione, UDC già caricato!";
                      Postazione.CssClass = "stileComandoKo";
                    }
                    else
                    {
                      // altrimenti procedo...
                      string codSogg = "";
                      string particolare = DataProxy.obj.taCartellini.stp_getByUdc(barcodeIn)[0].Particolare;
                      decimal qta = DataProxy.obj.taCartellini.stp_getByUdc(barcodeIn)[0].Qta;
                      string noteTrim = "";
                      try
                      {
                        codSogg = MagClass.magazzino.CodSoggCurrUser;
                      }
                      catch
                      { }
                      try
                      {
                        noteTrim = DataProxy.obj.taCartellini.stp_getByUdc(barcodeIn)[0].Note.Trim();
                      }
                      catch
                      {
                        noteTrim = "";
                      }
                      DateTime adesso = DateTime.Now;
                      // se ho cod cella sposto!
                      MagClass.magazzino.spostaUDC(memLayer.ML.StringSessionObj("CodCS"), barcodeIn, Postazione.currIdxCella, memLayer.ML.confReadBool("spostaUdcResettaLdp"), Request.UserHostName);
                      // registro spostamento UDC
                      MagClass.magazzino.taSAO.insertQuery(adesso, codSogg, Postazione.name, Postazione.IP, barcodeIn, particolare, "spostaUDC", string.Format("Caricato UDC Trattati su linea {2}, qta: {0} {1} ", qta, noteTrim, Postazione.currCodLinea));
                      Postazione.CssClass = "stileComandoOk";
                    }
                  }
                  else
                  {
                    // udc NON corretto, mostro errore...
                    Postazione.messaggiText += " - Attenzione, UDC NON VALIDO (IdxPosizione)!";
                    Postazione.CssClass = "stileComandoKo";
                  }

                  // controllo SE PER CASO ci fosse NC e ci sia stata deroga, cambio MSG...
                  if (MagClass.magazzino.checkUDC_NC(barcodeIn) == checkUdcNc.ChkDis_HasNc)
                  {
                    Postazione.CssClass = "stileComandoKo";
                    Postazione.messaggiText += string.Format("<br />{0}", traduci("ERR-NC-001"));
                    // recupero l'NC associata...
                    Postazione.warningText += string.Format("<br />{0}", MagClass.magazzino.getDescrNc2Udc(barcodeIn));
                  }
                }
                else
                {
                  Postazione.CssClass = "stileComandoKo";
                  Postazione.messaggiText += string.Format("<br />{0}", traduci("ERR-NC-001"));
                  // recupero l'NC associata...
                  Postazione.warningText += string.Format("<br />{0}", MagClass.magazzino.getDescrNc2Udc(barcodeIn));
                }
              }
            }

            break;
          default:
            Postazione.messaggiText += " - codice <b>non riconosciuto</b>!";
            Postazione.CssClass = "stileComandoND";
            break;
        }
        barcodeIn = "";
        lastBarcodeIn = "-";
      }
      else
      {
        if (string.IsNullOrEmpty(lastBarcodeIn))
        {
          Postazione.messaggiText = traduci("AttesaBCode");
          Postazione.CssClass = "stileAttesa";
        }
        lastBarcodeIn = "";
      }
      doUpdate();
    }
    /// <summary>
    /// aggiorna tabella + focus a barcode
    /// </summary>
    public void doUpdate()
    {
      idxCella = Postazione.currIdxCella;
      grView.DataBind();
      txtBarcode.Focus();
      // raise dell'evento
      if (eh_reqUpdate != null)
      {
        eh_reqUpdate(this, new EventArgs());
      }
    }
    /// <summary>
    /// effettua reset dati
    /// </summary>
    public void doResetData()
    {
      // resetto i dati QtaTot e particolare...
      testoRicerca = "";
      doChecks();
    }
    /// <summary>
    /// cambiato valore in ricerca
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void txtCerca_TextChanged(object sender, EventArgs e)
    {
      salvaCerca();
    }
    /// <summary>
    /// effettuato reset
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void lnkReset_Click(object sender, EventArgs e)
    {
      testoRicerca = "";
      salvaCerca();
    }
    /// <summary>
    /// pressione del button di ricerca
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void btnCerca_Click(object sender, EventArgs e)
    {
      salvaCerca();
    }

    /// <summary>
    /// testo ricerca trimmato da spazi
    /// </summary>
    protected string testoRicerca
    {
      get
      {
        return txtCerca.Text.Trim();
      }
      set
      {
        txtCerca.Text = value;
      }
    }
    protected void salvaCerca()
    {
      if (string.IsNullOrEmpty(testoRicerca))
      {
        SteamWare.memLayer.ML.emptySessionVal("valoreCercatoLMI");
      }
      else
      {
        SteamWare.memLayer.ML.setSessionVal("valoreCercatoLMI", testoRicerca);
      }
      // raise dell'evento
      if (eh_nuovaRicerca != null)
      {
        eh_nuovaRicerca(this, new EventArgs());
      }
      doUpdate();
    }
    protected void grView_PageIndexChanged(object sender, EventArgs e)
    {
      // fix dell'ODS
      checkFixOds();
    }
    protected void grView_Sorted(object sender, EventArgs e)
    {
      // fix dell'ODS
      checkFixOds();
    }
    /// <summary>
    /// aggiorno ods al binding..
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void ods_DataBinding(object sender, EventArgs e)
    {
      // fix dell'ODS
      checkFixOds();
    }
    /// <summary>
    /// verifica se attivo filtro company e imposta ods di conseguenza...
    /// </summary>
    private void checkFixOds()
    {
    }
    /// <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} records of ~ {1}", grView.Rows.Count, totRecord);
      }
      else
      {
        lblNumRec.Text = "";
      }
    }
  }
}