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

namespace GMW.WebUserControls
{
  public partial class mod_sanpos_creazioneF18 : System.Web.UI.UserControl
  {
    /// <summary>
    /// flusso associato (hard coded) a F18
    /// </summary>
    protected string flusso = "Li";
    /// <summary>
    /// stato associato (hard coded) a F18
    /// </summary>
    protected string statoUDC = "FinLiq";
    /// <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();
      }
      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;
      }
      else
      {
        lblParticolareAttivo.Text = "...";
        lblDescrAttivo.Text = "";
        lblDisegno.Text = "";
      }
    }
    /// <summary>
    /// richiesta (ri)stampa UDC
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    public void ristampa()
    {
      // registro ri-stampa UDC
      DateTime adesso = DateTime.Now;
      // calcolo particolare...
      DS_magazzino.ElencoCartelliniRow rigaUDC = null;
      string particolare = "";
      // cerco il tipo cartellino dato l'attuale stato e l'imballo del cartellino
      tipoCartellino cart = tipoCartellino.cartMP;
      try
      {
        rigaUDC = MagClass.magazzino.taCartellini.getByUdc(udcReq)[0];
        particolare = rigaUDC.Particolare;
        switch (rigaUDC.CodImballo)
        {
          case "IF10":
            cart = tipoCartellino.cartLiquidiF10;
            break;
          case "IF18":
            cart = tipoCartellino.cartLiquidiF18;
            break;
          default:
            break;
        }
      }
      catch
      {
        logger.lg.scriviLog(string.Format("Errore recupero particolare UDC Controllo Liquidi {0}", udcReq), tipoLog.EXCEPTION);
      }
      // stampo
      MagClass.magazzino.stampaUdc(udcReq, Postazione.printer, cart, Request.UserHostName);
      // registro azione
      MagClass.magazzino.taSAO.insertQuery(adesso, MagClass.magazzino.CodSoggCurrUser, Postazione.name, Postazione.IP, udcReq, particolare, "stampaUDC", "Ri-Stampato UDC F18");
    }
    /// <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()
    {
      // labels
#if false
            lblPostazione.Text = string.Format("{2}: {0} ({1})", postazione_name, postazione_IP, traduci("postazione"));
            lblPrinter.Text = string.Format("{1}: {0}", postazione_printer, traduci("stampante")); 
            lblCurrentPage.Text = traduci(PagCorrente);
#endif
      lblUDC.Text = traduci("lblUDC");
      lblQta.Text = traduci("lblQuantita");
      lblNote.Text = traduci("lblNote");
      //txtBox
      txtQta.Text = memLayer.ML.cdv("QtaImballoLiquidiDaSpedire");
      // buttons
      btnStampa.Text = traduci("btnStampa");
      btnEmptyNote.Text = traduci("btnEmptyNote");
#if false
            // fix storico
            fixStorico(); 
#endif
    }
    /// <summary>
    /// restituisce il nome della pagina corrente
    /// </summary>
    protected string PagCorrente
    {
      get
      {
        string answ = "";
        Uri MyUrl = Request.Url;
        string delimStr = "/";
        char[] delimiter = delimStr.ToCharArray();
        string[] finalUrl = MyUrl.LocalPath.ToString().Split(delimiter);
        int n = finalUrl.Length;
        answ = finalUrl[n - 1].ToString();
        DataLayer_AnagGen.PermessiRow riga = (DataLayer_AnagGen.PermessiRow)user_std.UtSn.permessi.Select(string.Format("URL = '{0}'", answ))[0];
        answ = riga.NOME;
        return answ;
      }
    }
    /// <summary>
    /// wrapper traduzione
    /// </summary>
    /// <param name="lemma"></param>
    /// <returns></returns>
    public string traduci(object lemma)
    {
      return user_std.UtSn.Traduci(lemma.ToString());
    }
#if false
        /// <summary>
        /// calcola postazione corrente (ip, name, printer)
        /// </summary>
        private void calcolaPostazione()
        {
            postazione_IP = Request.UserHostName;
            postazione_name = dnsUtils.DetermineCompName(postazione_IP);
            // cerco stampante x postazione
            postazione_printer = "n.d.";
            try
            {
                DS_Applicazione.ElencoPostazioniDataTable tabPost = DataProxy.obj.taElPost.getByCod(postazione_name);
                if (tabPost.Rows.Count > 0)
                {
                    postazione_printer = tabPost[0].stampante;
                }
                //else
                //{
                //    tabPost = DataProxy.obj.taElPost.getByCod("default");
                //    postazione_printer = tabPost[0].stampante;
                //}
            }
            catch
            { }
            // mostro warning se postazione non configurata...
            lblWarning.Visible = (postazione_printer == "n.d.");
        } 
        /// <summary>
        /// indica name della postazione corrente
        /// </summary>
        protected string postazione_name
        {
            get
            {
                return memLayer.ML.StringSessionObj("postazione_name");
            }
            set
            {
                memLayer.ML.setSessionVal("postazione_name", value);
            }
        }
        /// <summary>
        /// indica ip della postazione corrente
        /// </summary>
        protected string postazione_IP
        {
            get
            {
                return memLayer.ML.StringSessionObj("postazione_IP");
            }
            set
            {
                memLayer.ML.setSessionVal("postazione_IP", value);
            }
        }
        /// <summary>
        /// indica stampante associata alla postazione corrente
        /// </summary>
        protected string postazione_printer
        {
            get
            {
                return memLayer.ML.StringSessionObj("postazione_printer");
            }
            set
            {
                memLayer.ML.setSessionVal("postazione_printer", value);
            }
        }
#endif
    /// <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;
        // controllo non si tratti di un comando...
        string preCmd = memLayer.ML.AppConf["prefComandi"];
        if (barcodeIn.StartsWith(preCmd))
        {
          answ = tipoCodiceBarcode.Comando;
        }
        // controllo se sia un particolare Tipo P
        else if (TermClass.Ter.riconosciBarcode(barcodeIn) == tipoCodiceBarcode.Particolare && TermClass.Ter.isParticolare(barcodeIn)) // è un particolare...
        {
          answ = tipoCodiceBarcode.Particolare;
        }
        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 += " - codice particolare non valido / non trovato in RILPRO.";
              Postazione.CssClass = "stileComandoKo";
            }
            else
            {
              Postazione.messaggiText += " - impostato particolare!";
              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.getLastByParticolare(memLayer.ML.StringSessionObj("CodCS"), currParticolare)[0].Qta;
            }
            catch
            { }
            if (qtaPart > 0)
            {
              txtQta.Text = Convert.ToInt32(qtaPart).ToString();
            }
            else // rimette default
            {
              txtQta.Text = memLayer.ML.cdv("QtaImballoLiquidiDaSpedire");
            }
            break;
          case tipoCodiceBarcode.UDC:
            // procedo solo se UDC esistente
            if (MagClass.magazzino.checkUDC(barcodeIn))
            {
              // VECCHIA VERSIONE: caricava particolare da UDC
#if false
                            // recupero il particolare dai dati del cartellino preesistente
                            currParticolare = DataProxy.obj.taCartellini.stp_getByUdc(barcodeIn)[0].Particolare;
                            // controllo esista il particolare
                            if (DataProxy.obj.taAnagParticolari.getByParticolare(currParticolare).Rows.Count == 0)
                            {
                                currParticolare = "";
                                Postazione.messaggiText += " - codice particolare da UDC non valido / non trovato in RILPRO.";
                                pnlAll.CssClass = "stileComandoKo";
                            }
                            else
                            {
                                Postazione.messaggiText += " - impostato particolare!";
                                pnlAll.CssClass = "stileComandoOk";
                            } 
#endif
              checkUdc4elenco(barcodeIn);
            }

            break;
          default:
            Postazione.messaggiText += " - codice <b>non riconosciuto</b>!";
            Postazione.CssClass = "stileComandoND";
            break;
        }
        barcodeIn = "";
      }
      else
      {
        Postazione.messaggiText = traduci("AttesaBCode");
        Postazione.CssClass = "stileAttesa";
      }
      //grView.DataBind();
      txtBarcode.Focus();
    }
    /// <summary>
    /// controllo l'abilitazione alla stampa UDC:
    /// - particolare ok
    /// - qta > 0
    /// - almeno 1 trattamento
    /// altrimenti disabilito btn stampa
    /// </summary>
    private void checkStampa()
    {
      bool stampaOk = false;
      if (currParticolare != "" && qta > 0)
      {
        if (elencoUDC.Count > 0)
        {
          updateListBoxUDC();
          stampaOk = true;
        }
      }
      btnStampa.Enabled = stampaOk;
    }
    /// <summary>
    /// elenco dictionary dei trattamenti da associare ad UDC
    /// </summary>
    public Dictionary<string, string> elencoUDC
    {
      get
      {
        try
        {
          return (Dictionary<string, string>)memLayer.ML.objSessionObj("elencoUDC");
        }
        catch
        {
          return new Dictionary<string, string>();
        }
      }
      set
      {
        memLayer.ML.setSessionVal("elencoUDC", value, false);
      }
    }
    /// <summary>
    /// aggiungo un oggetto trattamento alla lista..
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void btnAdd_Click(object sender, EventArgs e)
    {
      if (txtUDC.Text.Trim() != "")
      {
        string valore = txtUDC.Text.Trim().ToUpper();
        // controllo esista UDC..
        checkUdc4elenco(valore);
      }
#if false
            fixStorico(); 
#endif
      doChecks();
    }
    /// <summary>
    /// controlla validità UDC x inserire in elenco...
    /// </summary>
    /// <param name="valore"></param>
    private void checkUdc4elenco(string valore)
    {
      if (MagClass.magazzino.checkUDC(valore))
      {
        // controllo sia un cartellino F10...
        DS_Applicazione.ElencoCartelliniRow rigaCart;
        string tipoImballo = "";
        try
        {
          rigaCart = DataProxy.obj.taCartellini.stp_getByUdc(valore)[0];
          tipoImballo = rigaCart.CodImballo;
        }
        catch
        { }
        // controllo il tipo imballo dell'UDC per decidere se sia F10...
        if (tipoImballo == memLayer.ML.cdv("CodImballoLiquidi"))
        {
          Dictionary<string, string> elenco = elencoUDC;
          // controllo il valore non ci sia già...
          if (!elenco.ContainsKey(valore))
          {
            elenco.Add(valore, valore);
            elencoUDC = elenco;
          }
          txtUDC.Text = "";
          lblWarnUdc.Visible = false;
          updateListBoxUDC();
        }
        else
        {
          // elimino UDC con imballo non valido!
          txtUDC.Text = "";
          lblWarnUdc.Text = traduci("UdcImballoErrato");
          lblWarnUdc.Visible = true;
        }
      }
      else
      {
        // elimino UDC non valido!
        txtUDC.Text = "";
        lblWarnUdc.Text = traduci("UdcNonTrovato");
        lblWarnUdc.Visible = true;
      }
    }
    /// <summary>
    /// aggiorna la listbox
    /// </summary>
    private void updateListBoxUDC()
    {
      lbUdc.DataSource = elencoUDC;
      lbUdc.DataTextField = "Value";
      lbUdc.DataValueField = "Key";
      lbUdc.DataBind();
    }
    /// <summary>
    /// svuota elenco trattamenti
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void btnSvuota_Click(object sender, EventArgs e)
    {
      Dictionary<string, string> elenco = new Dictionary<string, string>();
      elencoUDC = elenco;
      txtUDC.Text = "";
      lblWarnUdc.Visible = false;
      updateListBoxUDC();
      doChecks();
    }
    /// <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 btnStampa_Click(object sender, EventArgs e)
    {
#if false
            // calcolo postazione
            calcolaPostazione(); 
#endif
      // verifico postazione x procedere...
      if (Postazione.printer != "n.d.")
      {
        string newUdcChild = "";
        int qta = memLayer.ML.cdvi("QtaImballoLiquidiDaSpedire");
        string noteTrim = txtNote.Text.Trim();
        try
        {
          qta = Convert.ToInt32(txtQta.Text);
        }
        catch
        { }
        // 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
          {
            // creo nuovo UDC del trattamento liquidi
            newUdcChild = MagClass.magazzino.creaUdc(flusso, "", currParticolare, "", "", "", "", "", 0, memLayer.ML.cdv("CodImballoLiquidiDaSpedire"), "U", codSogg, qta, 0, 0, adesso, 0, statoUDC, memLayer.ML.cdvi("IdxPosizioneLiquidi"), "IdxPosizioneLiquidi", memLayer.ML.cdv("nuovoUdcLiquidiF18"), noteTrim, "", adesso.Year, Request.UserHostName);
            // registro creazione nuovo UDC
            MagClass.magazzino.taSAO.insertQuery(adesso, codSogg, Postazione.name, Postazione.IP, newUdcChild, particolare, "creaUDC", string.Format("Creato nuovo UDC Liquidi F18 - qta:{0} {1}", qta, noteTrim));
          }
          catch (Exception exc)
          {
            httpLog(string.Format("Errore creazione UDC Liquidi F18 San Possidonio: {0}", exc), tipoLog.EXCEPTION);
          }
          // stampo!
          if (newUdcChild != "")
          {
            // controllo se ci sono UDC F10 da associare... e x ognuno associo!
            foreach (KeyValuePair<string, string> kvp in elencoUDC)
            {
              // associo i 2 cartellini
              MagClass.magazzino.associaUdcParent(newUdcChild, kvp.Key);
            }
            // ora stampo il nuovo cartellino!!!
            MagClass.magazzino.stampaUdc(newUdcChild, Postazione.printer, tipoCartellino.cartLiquidiF18, 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 Liquidi F18");
          }
        }
        else
        {
          httpLog(string.Format("Errore persi utente/particolare, ricarico!"), tipoLog.ERROR);
          Response.Redirect("~/login.aspx");
        }
#if false
                mod_storicoAzioniOperatore1.doUpdate(); 
#endif
      }
      else
      {
        Response.Redirect("~/menu.aspx");
      }
    }
    /// <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;
      string postazione_IP = "";
      try
      {
        postazione_IP = string.Format(" | {0} | ", Request.UserHostName);
      }
      catch
      { }
      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;
      string postazione_IP = "";
      try
      {
        postazione_IP = string.Format(" | {0} | ", Request.UserHostName);
      }
      catch
      { }
      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 = "";
    }
#if false
        /// <summary>
        /// toggle controllo storico
        /// </summary>
        private void fixStorico()
        {
            pnlSAO.Visible = storicoVisibile;
            if (storicoVisibile)
            {
                btnShowHideStorico.Text = traduci("btnHideStorico");
            }
            else
            {
                btnShowHideStorico.Text = traduci("btnShowStorico");
            }
        } 
        /// <summary>
        /// imposto visibilità pannelo storico
        /// </summary>
        protected bool storicoVisibile
        {
            get
            {
                return memLayer.ML.BoolSessionObj(string.Format("showHist_{0}", this.ID));
            }
            set
            {
                memLayer.ML.setSessionVal(string.Format("showHist_{0}", this.ID), value);
            }
        }
        /// <summary>
        /// gestisco evento show/hide storico
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void btnShowHideStorico_Click(object sender, EventArgs e)
        {
            storicoVisibile = !storicoVisibile;
            fixStorico();
        }
#endif
  }
}