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

namespace GMW.WebUserControls
{
  public partial class mod_consKitAnime : System.Web.UI.UserControl
  {
    /// <summary>
    /// caricamento pagina
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void Page_Load(object sender, EventArgs e)
    {
      if (!Page.IsPostBack)
      {
        disableConfirm = false;
        traduciObj();
        lblALSel.Text = "...";
      }
      doChecks();
      if (currAL_KA != "")
      {
        lblALSel.Text = string.Format("AL KIT: <b>{0}</b>", currAL_KA);
      }
      if (string.IsNullOrEmpty(lblALSel.Text))
      {
        lblALSel.Text = "...";
      }
    }
    /// <summary>
    /// effettua controlli visibilità
    /// </summary>
    private void doChecks()
    {
      checkBarcode();
      checkConsuma();
    }
    /// <summary>
    /// sistemo labels oggetti
    /// </summary>
    private void traduciObj()
    {
      // buttons
      btnConsuma.Text = traduci("btnConsumaAL_KA");
      // fix button gestione disabilitazione conferme
      fixBtnDisableConf();
    }
    /// <summary>
    /// sistema btn abilitazione/disabilitazione conferma comandi
    /// </summary>
    private void fixBtnDisableConf()
    {
      btnConsuma.Visible = true;
      if (disableConfirm)
      {
        btnDisableConf.Text = traduci("confirmDisabled");
        btnDisableConf.CssClass = "btn btn-danger";
      }
      else
      {
        btnDisableConf.Text = traduci("confirmEnabled");
        btnDisableConf.CssClass = "btn btn-success";
      }
    }
    /// <summary>
    /// wrapper traduzione
    /// </summary>
    /// <param name="lemma"></param>
    /// <returns></returns>
    public string traduci(object lemma)
    {
      return user_std.UtSn.Traduci(lemma.ToString());
    }
    /// <summary>
    /// indica AL selezionato
    /// </summary>
    protected string currAL_KA
    {
      get
      {
        return memLayer.ML.StringSessionObj(string.Format("currAL_KA.{0}", this.ID));
      }
      set
      {
        memLayer.ML.setSessionVal(string.Format("currAL_KA.{0}", this.ID), value, false);
      }
    }
    /// <summary>
    /// indica se i caratteri vadano forzati a maiuscoli
    /// </summary>
    public bool forceUppercase
    {
      get
      {
        return memLayer.ML.confReadBool("forceUppercase");
      }
    }
    /// <summary>
    /// indica se siano disabilitate le conferme x avere operazioni veloci
    /// </summary>
    public bool disableConfirm
    {
      get
      {
        return memLayer.ML.BoolSessionObj(string.Format("disableConfirm.{0}", this.ID));
      }
      set
      {
        memLayer.ML.setSessionVal(string.Format("disableConfirm.{0}", this.ID), value);
        fixBtnDisableConf();
      }
    }
    /// <summary>
    /// valore barcode
    /// </summary>
    public string barcodeIn
    {
      get
      {
        return txtBarcode.Text.Trim();
      }
      set
      {
        txtBarcode.Text = value;
      }
    }
    /// <summary>
    /// valore barcode precedente
    /// </summary>
    public string prevBarcodeIn
    {
      get
      {
        return memLayer.ML.StringSessionObj(string.Format("prevBarcodeIn.{0}", this.ID));
      }
      set
      {
        memLayer.ML.setSessionVal(string.Format("prevBarcodeIn.{0}", this.ID), value, false);
      }
    }
    /// <summary>
    /// controlla se ci sia un barcode
    /// </summary>
    private void checkBarcode()
    {
      if (barcodeIn != "")
      {
        prevBarcodeIn = barcodeIn;
        DS_magazzino.ElencoAssiemiRow rigaAL;
        bool isAlAnime = false;
        bool isAttivo = false;
        lblMessaggi.Text = string.Format("Barcode digitato: {0}", barcodeIn);
        switch (MagClass.tipoBCode_L4(barcodeIn))
        {
          case tipoCodiceBarcode.AL:
            // procedo solo se AL esistente
            if (MagClass.magazzino.checkAL(barcodeIn))
            {
              // cerco di recuperare riga AL
              try
              {
                rigaAL = MagClass.magazzino.taEA.getByAL(barcodeIn)[0];
                if (rigaAL.CodKIT != "" && rigaAL.TipoAL == "A")
                {
                  isAlAnime = true;
                  isAttivo = rigaAL.Attivo;
                }
              }
              catch
              { }
              // controllo sia valido x anime (con cod kit + tipo "A"
              if (isAlAnime)
              {
                // controllo sia attivo (= scaricabile)
                if (isAttivo)
                {
                  // salvo AL selezionato
                  currAL_KA = barcodeIn;
                  pnlAll.CssClass = "stileAttesa";
                  // controllo: se sono in fast mode SCARICO!
                  if (disableConfirm)
                  {
                    scaricaAlKIT(false);
                  }
                }
                else
                {
                  lblMessaggi.Text += " - AL KIT Anime <b>NON ATTIVO</b>, impossibile scaricare.";
                  pnlAll.CssClass = "stileComandoKo";
                }
              }
              else
              {
                lblMessaggi.Text += " - AL <b>non valido</b> come KIT Anime!";
                pnlAll.CssClass = "stileComandoKo";
              }
            }
            break;
          case tipoCodiceBarcode.Comando:
            // se richiesto scarico rapido lo gestisco
            if (barcodeIn.ToUpper() == memLayer.ML.cdv("cmdFast").ToUpper())
            {
              disableConfirm = !disableConfirm;
              lblMessaggi.Text = traduci("enDisFastMode");
            }
            break;
          default:
            lblMessaggi.Text += " - codice <b>non riconosciuto</b>!";
            pnlAll.CssClass = "stileComandoND";
            break;
        }
        barcodeIn = "";
      }
      else
      {
        if (prevBarcodeIn != "")
        {
          prevBarcodeIn = "";
        }
        else
        {
          //currAL_KA = "";
          //lblALSel.Text = "---";
          lblMessaggi.Text = traduci("AttesaBCode");
          pnlAll.CssClass = "stileAttesa";
        }
      }
      //grView.DataBind();
      txtBarcode.Focus();
    }
    /// <summary>
    /// controllo abilitazione consumo
    /// </summary>
    private void checkConsuma()
    {
      bool consumaOk = false;
      if (!disableConfirm)
      {
        if (currAL_KA != "")
        {
          consumaOk = true;
        }
      }
      btnConsuma.Enabled = consumaOk;
      btnConsuma.CssClass = "btn btn-default";
      if (!consumaOk)
      {
        btnConsuma.CssClass += " disabled";
      }
    }
    /// <summary>
    /// consuma UDC
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void btnConsuma_Click(object sender, EventArgs e)
    {
      scaricaAlKIT(false);
    }
    /// <summary>
    /// effettua scaricamento UDC FROM
    /// </summary>
    /// <param name="forzaOperazione">true/false se forzare operazione anche se 
    /// - NON in posizione LPA010101
    /// - non già presente in LDP (nel qual caso lo toglie)
    /// perché vogliamo che sia prima in posizione nota (quindi prima spostamento in LP a mano e poi scaricamento)</param>
    private void scaricaAlKIT(bool forzaOperazione)
    {
      DS_magazzino.ElencoAssiemiRow rigaAL;
      bool isAlAnime = false;
      bool isAttivo = false;
      if (currAL_KA != "")
      {
        // procedo solo se AL esistente
        if (MagClass.magazzino.checkAL(currAL_KA))
        {
          // cerco di recuperare riga AL
          try
          {
            rigaAL = MagClass.magazzino.taEA.getByAL(currAL_KA)[0];
            if (rigaAL.CodKIT != "" && rigaAL.TipoAL == "A")
            {
              isAlAnime = true;
              isAttivo = rigaAL.Attivo;
            }
          }
          catch
          {
          }
        }
        // controllo AL sia attivo... 
        if (isAlAnime)
        {
          if (isAttivo)
          {
            // recupero elenco UDC
            DS_magazzino.AL2UDCDataTable tabUDC = MagClass.magazzino.taAL2UDC.getByAL(currAL_KA);
            if (tabUDC.Rows.Count > 0)
            {
              string currUdc = "";
              List<string> messaggi = new List<string>();
              int errorCount = 0;
              int errorCountPos = 0;
              bool needForzaCons_inLDP = false;
              // ciclo su tutti gli UDC...
              foreach (var item in tabUDC)
              {
                // leggo udc corrente
                currUdc = item.UDC;
                needForzaCons_inLDP = false;
                // controllo se UDC non sia già consumato...
                if (MagClass.magazzino.udcMpIsConsumabile(currUdc))
                {
                  // controllo UDC sia corretto (in giusta posizione...)
                  if (MagClass.magazzino.IdxPosizioneUdc(currUdc) == memLayer.ML.cdvi("IdxPosizioneAnime"))
                  {
                    // controllo UDC sia in posizione LDP anime LPA010101...
                    if (MagClass.magazzino.checkUdc_OkLPAX(currUdc) || forzaOperazione)
                    {
                      // controllo che non sia già in una LDP
                      if (!MagClass.magazzino.udcInLdp(currUdc) || forzaOperazione)
                      {
                        // indico UDC consumato!     
                        messaggi.Add(string.Format("{0} {1}", traduci("effettuatoConsumoUDC"), currUdc));
                        pnlAll.CssClass = "stileComandoOk";
                      }
                      else
                      {
                        // è già in una LDP: mostro button x forzare...   
                        messaggi.Add(string.Format("{0} {1}", traduci("UDC_impegnatoLDP"), currUdc));
                        errorCount++;
                        needForzaCons_inLDP = true;
                      }
                    }
                    else
                    {
                      // non è in posizione LPA: mostro button x forzare...       
                      messaggi.Add(string.Format("!!! {0} {1} !!!", traduci("UDC_nonPrel"), currUdc));
                      errorCount++;
                      errorCountPos++;
                    }
                    // ora consumo DAVVERO UDC
                    MagClass.magazzino.scaricaUdcMpWip(currUdc, Request.UserHostName);
                    // se richiesto (era in LDP)
                    if (needForzaCons_inLDP)
                    {
                      // elimino part da altre LDP
                      MagClass.magazzino.taRigheListePrelievo.eliminaByUdc(currUdc);
                    }
                  }
                  else
                  {
                    // registro errore UDC sbagliato!
                    messaggi.Add(string.Format("{0} {1}", traduci("UDC_posizErrataAnime"), currUdc));
                    errorCount++;
                  }
                }
                else
                {
                  // registro errore UDC consumato!
                  messaggi.Add(string.Format("{0} {1}", traduci("UDC_giaConsumato"), currUdc));
                  errorCount++;
                }
              }
              // controllo se ho errori... e preparo messaggio
              if ((errorCount > 0) && (errorCount > errorCountPos))
              {
                // segnalo errore
                pnlAll.CssClass = "stileComandoKo";
              }
              lblMessaggi.Text = "------------ ESITO OPERAZIONE ------------</br>";
              foreach (var messaggio in messaggi)
              {
                lblMessaggi.Text += string.Format("{0}</br>", messaggio);
              }
              lblMessaggi.Text += "-----------------------------------------</br>";
              lblALSel.Text = "---";
            }
            else
            {
              // indico AL senza UDC!
              lblMessaggi.Text = string.Format("Errore: AL KIT Anime SENZA UDC associati: {0}", currAL_KA);
              pnlAll.CssClass = "stileComandoKo";
            }
            // disattivo AL
            MagClass.magazzino.taEA.DisattivaAL(currAL_KA);
            currAL_KA = "";
          }
          else
          {
            // indico AL NON attivo!                                                                
            lblMessaggi.Text = string.Format("Errore: AL KIT Anime NON ATTIVO: {0}", currAL_KA);
            pnlAll.CssClass = "stileComandoKo";
          }
        }
        else
        {
          // indico AL non KIT ANIME!
          lblMessaggi.Text = string.Format("Errore: AL NON KIT Anime: {0}", currAL_KA);
          pnlAll.CssClass = "stileComandoKo";
        }
        lblALSel.Text = "";
      }
    }
    /// <summary>
    /// cambia la modalità di scarico UDC dis/abilitando conferme
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void btnDisableConf_Click(object sender, EventArgs e)
    {
      disableConfirm = !disableConfirm;
    }
  }
}