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

namespace GMW.WebUserControls
{
  public partial class mod_fusiTK : System.Web.UI.UserControl
  {
    /// <summary>
    /// flusso associato (hard coded) a FUSI
    /// </summary>
    protected string flusso = "FU";
    /// <summary>
    /// stato associato (hard coded) a  FUSI
    /// </summary>
    protected string statoUDC = "Fusi";
    /// <summary>
    /// attributo per indicazione LINEA di produzione/consumo
    /// </summary>
    protected string attrLINEA = "LI";
    /// <summary>
    /// dati x verifica CodSoggetto / matricola
    /// </summary>
    protected string preCodSogg = memLayer.ML.AppConf["prefCodSogg"];
    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)
      {
        traduciObj();
        checkNumKeyIn();
      }
      doChecks();
      if (currParticolare != "")
      {
        lblParticolareAttivo.Text = string.Format("Particolare selezionato <b>{0}</b>", 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;
        // default: qta a zero
        decimal qtaPart = 0;
        // leggo la qta dell'ultimo UDC del particolare, SE C'E', e la imposto...
        try
        {
          qtaPart = MagClass.magazzino.taCartellini.getLastByParticolareStato(memLayer.ML.StringSessionObj("CodCS"), currParticolare, statoUDC, false)[0].Qta;
        }
        catch
        { }
        if ((qtaPart > 0) && (qta == 0))
        {
          qta = Convert.ToInt32(qtaPart);
        }
      }
      else
      {
        lblParticolareAttivo.Text = "...";
        lblDescrAttivo.Text = "";
        lblDisegno.Text = "";
      }
    }
    /// <summary>
    /// verifico se ci sia in sessione un input da NumKeyb e nel caso lometto in barcodeIn e processo...
    /// </summary>
    private void checkNumKeyIn()
    {
      if (memLayer.ML.isInSessionObject("numKeyIn"))
      {
        barcodeIn = memLayer.ML.StringSessionObj("numKeyIn");
        // svuoto valore in sessione...
        memLayer.ML.emptySessionVal("numKeyIn");
        // controllo barcode...
        checkBarcode();
      }
    }
    /// <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 Fusi {0}", udcReq), tipoLog.EXCEPTION);
      }
      if (fatto) MagClass.magazzino.taSAO.insertQuery(adesso, MagClass.magazzino.CodSoggCurrUser, Postazione.name, Postazione.IP, udcReq, particolare, "stampaUDC", "Ri-Stampato UDC Fusi");
      doUpdate();
    }
    /// <summary>
    /// udc da stampare
    /// </summary>
    protected string udcReq
    {
      get
      {
        return memLayer.ML.StringSessionObj("udcSelSAO");
      }
    }
    /// <summary>
    /// effettua controlli visibilità
    /// </summary>
    private void doChecks()
    {
      checkBarcode();
      checkStampa();
    }
    /// <summary>
    /// sistemo labels oggetti
    /// </summary>
    private void traduciObj()
    {
      //txtBox
      qta = memLayer.ML.cdvi("QtaImballoFusi");
      // buttons
      btnEmptyNote.Text = traduci("btnEmptyNote");
    }
    /// <summary>
    /// wrapper traduzione
    /// </summary>
    /// <param name="lemma"></param>
    /// <returns></returns>
    public string traduci(object lemma)
    {
      return user_std.UtSn.Traduci(lemma.ToString());
    }

    /// <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>
    /// indica se i caratteri vadano forzati a maiuscoli
    /// </summary>
    public bool forceUppercase
    {
      get
      {
        return memLayer.ML.confReadBool("forceUppercase");
      }
    }
    /// <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>
    /// decodifica il tipo barcode acquisito
    /// </summary>
    public tipoCodiceBarcode tipoBCode
    {
      get
      {
        tipoCodiceBarcode answ = tipoCodiceBarcode.ND;
        int trovati = 0;
        int matricola = -1;
        // provo a convertire in intero barcode x verifica eventuale matricola...
        try
        {
          matricola = Convert.ToInt32(barcodeIn);
        }
        catch
        { }
        // controllo non si tratti di un comando...
        string preCmd = memLayer.ML.AppConf["prefComandi"];
        if (barcodeIn.StartsWith(preCmd))
        {
          answ = tipoCodiceBarcode.Comando;
        }
        // controllo se sia un FUSO Tipo P
        else if (TermClass.Ter.riconosciBarcode(barcodeIn) == tipoCodiceBarcode.Particolare && TermClass.Ter.isParticolare(barcodeIn)) // è un particolare...
        {
          answ = tipoCodiceBarcode.Particolare;
        }
        else if (barcodeIn.StartsWith(preCodSogg))
        {
          // cerco cod soggetto...
          if (DataProxy.obj.taTrascSogg.getByKey(barcodeIn, 0).Rows.Count == 1)
          {
            answ = tipoCodiceBarcode.Operatore;
          }
        }
        else if (matricola >= 0)
        {
          if (DataProxy.obj.taTrascSogg.getByKey("", matricola).Rows.Count == 1)
          {
            answ = tipoCodiceBarcode.Operatore;
          }
        }
        else
        {
          try
          {
            // cerco tra gitterbox (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>
    /// 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>
    /// controlla se ci sia un barcode
    /// </summary>
    private void checkBarcode()
    {
      if (barcodeIn != "")
      {
        Postazione.messaggiText = string.Format("Barcode digitato: {0}", barcodeIn);
        switch (tipoBCode)
        {
          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("ERR-FUS-001");
              Postazione.CssClass = "stileComandoKo";
            }
            else
            {
              Postazione.messaggiText += traduci("partSelected");
              Postazione.CssClass = "stileComandoOk";
            }
            // default: qta a zero
            decimal qtaPart = 0;
            // leggo la qta dell'ultimo UDC del particolare, SE C'E', e la imposto...
            try
            {
              qtaPart = MagClass.magazzino.taCartellini.getLastByParticolareStato(memLayer.ML.StringSessionObj("CodCS"), currParticolare, statoUDC, false)[0].Qta;
            }
            catch
            { }
            if (qtaPart > 0)
            {
              qta = Convert.ToInt32(qtaPart);
            }
            else // rimette default
            {
              qta = memLayer.ML.cdvi("QtaImballoFusi");
            }
            break;
          case tipoCodiceBarcode.UDC:
            // procedo solo se UDC esistente
            if (MagClass.magazzino.checkUDC(barcodeIn))
            {
              // recupero il particolare dai dati del cartellino preesistente
              currParticolare = DataProxy.obj.taCartellini.stp_getByUdc(barcodeIn)[0].Particolare;
              // controllo esista!!!
              bool partExists = DataProxy.obj.taAnagParticolari.getByParticolare(currParticolare).Rows.Count != 0;
              // controllo sia anima!!!
              bool isPart = TermClass.Ter.isParticolare(currParticolare);
              // controllo esista il particolare e sia anima
              if (partExists && isPart)
              {
                Postazione.messaggiText += traduci("partSelected");
                Postazione.CssClass = "stileComandoOk";
              }
              else
              {
                currParticolare = "";
                Postazione.messaggiText += traduci("ERR-FUS-001");
                Postazione.CssClass = "stileComandoKo";
              }
            }

            break;
          case tipoCodiceBarcode.Operatore:
            // calcolo matricola utente
            int MatrUtente = -1;
            string preCodSogg = memLayer.ML.AppConf["prefCodSogg"];
            if (barcodeIn.StartsWith(preCodSogg))
            {
              MatrUtente = DataProxy.obj.taTrascSogg.getByKey(barcodeIn, 0)[0].CodMatricola;
            }
            else
            {
              MatrUtente = Convert.ToInt32(barcodeIn);
            }
            if (MatrUtente >= 0)
            {
              // salvo in sessione operatore con AUTH
              OpAuth.startOpAuth(MatrUtente);
              // mostro che ho autorizzato...
              Postazione.messaggiText += traduci("userAuthRec");
              Postazione.CssClass = "stileComandoOk";
              currParticolare = "";
              qta = 0;
              Response.Redirect(user_std.pagCorrente);
            }
            else
            {
              Postazione.messaggiText += traduci("ERR-BCD-001");
              Postazione.CssClass = "stileComandoND";
            }
            break;
          default:
            // cerco se sia "0" = reset utente...
            if (barcodeIn == memLayer.ML.CRS("resetCodSogg"))
            {
              // salvo in sessione operatore con AUTH
              OpAuth.stopAuth();
              // mostro che ho autorizzato...
              Postazione.messaggiText += traduci("userAuthRem");
              Postazione.CssClass = "stileComandoOk";
              Response.Redirect(user_std.pagCorrente);
            }
            Postazione.messaggiText += traduci("ERR-BCD-001");
            Postazione.CssClass = "stileComandoND";
            break;
        }
        barcodeIn = "";
      }
      doUpdate();
    }
    /// <summary>
    /// aggiorna tabella + focus a barcode
    /// </summary>
    public void doUpdate()
    {
      updatePart();
      // raise dell'evento
      if (eh_reqUpdate != null)
      {
        eh_reqUpdate(this, new EventArgs());
      }
      checkStampa();
      txtBarcode.Focus();
    }
    /// <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>
    /// controllo l'abilitazione alla stampa UDC:
    /// - particolare ok
    /// - qta > 0
    /// altrimenti disabilito btn stampa
    /// </summary>
    private void checkStampa()
    {
      bool stampaOk = false;
      if (currParticolare != "" && qta > 0)
      {
        stampaOk = true;
      }
      divNote.Visible = stampaOk;
    }
    /// <summary>
    /// genera i barcode di
    /// - trattamenti
    /// - nuovo x pezzi liquidi
    /// e lancia la relativa stampa
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void lbtStampaUDC_Click(object sender, EventArgs e)
    {
      bool needsRedirect = false;
      // verifico postazione x procedere...
      if (Postazione.printer != "n.d.")
      {
        // verifico auth utente OPPURE se NON sia richiesta...
        if (OpAuth.isAuth || !OpAuth.opAuthReq)
        {
          // se linea non selezionata ERRORE!!!
          if (Postazione.currCodLinea == "W3000" || string.IsNullOrEmpty(Postazione.currCodLinea))
          {
            Postazione.messaggiText += " - Attenzione, IMPOSTARE LINEA!";
            Postazione.CssClass = "stileComandoKo";
          }
          else
          {
            string newUdcChild = "";
            string noteTrim = txtNote.Text.Trim();
            // effettuo controlli che cod_soggetto e cod particolare siano disponibili...
            string codSogg = "";
            string particolare = "";
            try
            {
              codSogg = MagClass.magazzino.CodSoggCurrUser;
              particolare = currParticolare;
            }
            catch
            {
            }
            if (codSogg != "" && particolare != "")
            {
              // genero cartellino liquidi
              DateTime adesso = DateTime.Now;
              try
              {
                // aggiungo codice linea alle note
                noteTrim = string.Format("{0}{1}{2}", Postazione.currNomeLinea, Environment.NewLine, noteTrim);
                // creo nuovo UDC del trattamento liquidi
                newUdcChild = MagClass.magazzino.creaUdc(flusso, "", particolare, "", "", "", "", "", 0, memLayer.ML.cdv("CodImballoFusi"), "U", codSogg, qta, 0, 0, adesso, 0, statoUDC, memLayer.ML.cdvi("IdxPosizioneFusi"), "IdxPosizioneFusi", "UDC_FUSI", noteTrim, "", adesso.Year, Request.UserHostName);

                if (OpAuth.isAuth)
                {
                  // salvo attributo dell'OpAuth...
                  MagClass.magazzino.taAtt2UDC.Insert(newUdcChild, memLayer.ML.CRS("attrOpAuth"), OpAuth.currAuth.CodSoggetto, DateTime.Now, codSogg);
                  // consumo una auth...
                  OpAuth.currAuth.remAuth--;
                  if (OpAuth.currAuth.remAuth == 0)
                  {
                    OpAuth.stopAuth();
                    needsRedirect = true;
                  }
                }

                // registro creazione nuovo UDC
                MagClass.magazzino.taSAO.insertQuery(adesso, codSogg, Postazione.name, Postazione.IP, newUdcChild, particolare, "creaUDC", string.Format("Creato nuovo UDC Fusi - qta:{0} {1}", qta, noteTrim));
                // per ora attributo linea tolto, messo nelle note...
#if false
                            // salvo attributo linea con UDC
                            MagClass.magazzino.taAtt2UDC.Insert(newUdcChild, attrLINEA, Postazione.currCodLinea, DateTime.Now, codSogg); 
#endif
              }
              catch (Exception exc)
              {
                httpLog(string.Format("Errore creazione UDC Fusi: {0}", exc), tipoLog.EXCEPTION);
              }
              // se ho cart stampo!
              if (newUdcChild != "")
              {
                // ora stampo il nuovo cartellino!!!
                MagClass.magazzino.stampaUdc(newUdcChild, Postazione.printer, tipoCartellino.cartFusi, Request.UserHostName);
                // incremento timing...
                adesso = DateTime.Now;
                adesso = adesso.AddSeconds(1);
                // registro stampa nuovo UDC
                MagClass.magazzino.taSAO.insertQuery(adesso, codSogg, Postazione.name, Postazione.IP, newUdcChild, particolare, "stampaUDC", "Stampato UDC Fusi");
              }
            }
            else
            {
              httpLog(string.Format("Errore persi utente/particolare, ricarico!"), tipoLog.ERROR);
              Response.Redirect("~/login.aspx");
            }

          }
        }
        else
        {
          Postazione.messaggiText = traduci("noOpAuth");
          Postazione.CssClass = "stileComandoKo";
          httpLog(string.Format("Errore manca OpAuth x UDC anime"), tipoLog.ERROR);
        }
      }
      else
      {
        Response.Redirect("~/menu.aspx");
      }
      // raise dell'evento
      if (eh_reqUpdate != null)
      {
        eh_reqUpdate(this, new EventArgs());
      }
      if (needsRedirect)
      {
        Response.Redirect(user_std.pagCorrente);
      }
      doUpdate();
    }
    /// <summary>
    /// wrapper per log con salvataggio dell'IP del chiamante
    /// </summary>
    /// <param name="_testoPre"></param>
    /// <returns></returns>
    public bool httpLog(string _testoPre)
    {
      bool answ = false;
      logger.lg.scriviLog(Postazione.IP + _testoPre);
      return answ;
    }
    /// <summary>
    /// wrapper per log con salvataggio dell'IP del chiamante
    /// </summary>
    /// <param name="_testoPre"></param>
    /// <returns></returns>
    public bool httpLog(string testoLog, tipoLog tipo)
    {
      bool answ = false;
      logger.lg.scriviLog(Postazione.IP + testoLog, tipo);
      return answ;
    }
    /// <summary>
    /// svuoto le note
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void btnEmptyNote_Click(object sender, EventArgs e)
    {
      txtNote.Text = "";
      Postazione.messaggiText = traduci("AttesaBCode");
      Postazione.CssClass = "stileAttesa";
      // raise dell'evento
      if (eh_reqUpdate != null)
      {
        eh_reqUpdate(this, new EventArgs());
      }
    }

  }
}