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

namespace GMW.WebUserControls
{
  public partial class mod_rimuoviNC : SteamWare.ApplicationUserControl
  {
    protected string cssBtnNorm = "btn btn-default fa-2x";
    protected string cssBtnSel = "btn btn-default fa-2x active";
    protected override void OnLoad(EventArgs e)
    {
      // controllo se ho QueryString modalità operativa...
      if (!Page.IsPostBack)
      {
        if (string.IsNullOrEmpty(memLayer.ML.QSS("RNC_Mode")))
        {
          // reinvio impostando modalità Delibera Semplice...
          Response.Redirect(string.Format("{0}?RNC_Mode=sim", user_std.pagCorrente), false);
        }
      }
      fixBtn();
      checkBarcode();
    }
    /// <summary>
    /// imposto grafica buttons modalità operativa
    /// </summary>
    private void fixBtn()
    {
      lbtDelSimp.CssClass = cssBtnNorm;
      lbtDelContr.CssClass = cssBtnNorm;
      lbtRemDel.CssClass = cssBtnNorm;
      switch (memLayer.ML.QSS("RNC_Mode"))
      {
        case "sim":
          lbtDelSimp.CssClass = cssBtnSel;
          break;
        case "con":
          lbtDelContr.CssClass = cssBtnSel;
          break;
        case "rem":
          lbtRemDel.CssClass = cssBtnSel;
          break;
        default:
          Response.Redirect(string.Format("{0}?RNC_Mode=sim", user_std.pagCorrente), false);
          break;
      }
    }
    /// <summary>
    /// gestione click
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void lbtMode_Click(object sender, EventArgs e)
    {
      string RNC_Mode = ((LinkButton)sender).CommandArgument;
      Response.Redirect(string.Format("{0}?RNC_Mode={1}", user_std.pagCorrente, RNC_Mode), false);
    }
    /// <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()
    {
      if (barcodeIn != "")
      {
        Postazione.messaggiText = string.Format("{0}: {1}", traduci("BCodeIns"), barcodeIn);
        switch (MagClass.tipoBCode_L5(barcodeIn))
        {
          case tipoCodiceBarcode.Comando:
            // verifico se contenga uno dei 3 tipi di selezione operativa...
            string RNC_Mode = barcodeIn.Replace(memLayer.ML.AppConf["prefComandi"], "");
            if (RNC_Mode != "")
            {
              Postazione.CssClass = "stileComandoOk";
              Postazione.messaggiText = "";
              Postazione.warningText = "";
              Response.Redirect(string.Format("{0}?RNC_Mode={1}", user_std.pagCorrente, RNC_Mode));
            }
            doUpdate();
            break;
          case tipoCodiceBarcode.UDC:
            // verifico UDC a seconda di azione richiesta...
            string attrRes = "";
            string attr2chk = "";
            // controllare valori..
            if (memLayer.ML.QSS("RNC_Mode") == "rem")
            {
              attrRes = "NC";
              attr2chk = "DC";
            }
            else
            {
              attrRes = "DC";
              attr2chk = "NC";
            }
            if (checkUDC(barcodeIn, attrRes, attr2chk))
            {
              string valAttr = "";
              bool modeAdd = true;
              bool canRemDc = false;
              Postazione.messaggiText = "";
              // a seconda di cosa sia selezionato imposto valore attributo e modo
              switch (memLayer.ML.QSS("RNC_Mode"))
              {
                case "sim":
                  valAttr = traduci("valAttrDel");
                  modeAdd = true;
                  break;
                case "con":
                  valAttr = traduci("valAttrDelContr");
                  modeAdd = true;
                  break;
                case "rem":
                  valAttr = traduci("rimLastDc");
                  modeAdd = false;
                  // verifico se si possa rimuovere DC, ovvero meno di x gg da inserimento DC...
                  try
                  {
                    DataRow riga = MagClass.magazzino.taAtt2UDC.getByUdc(barcodeIn).Select("CodAttr = 'DC'", "DateAttr DESC")[0];
                    DateTime dataDc = Convert.ToDateTime(riga["DateAttr"]);
                    DateTime adesso = DateTime.Now;
                    if (adesso.Subtract(dataDc).Days < memLayer.ML.CRI("ggRimozDelibNC"))
                    {
                      canRemDc = true;
                    }
                  }
                  catch
                  { }
                  break;
                default:
                  break;
              }
              if (canRemDc || memLayer.ML.QSS("RNC_Mode") != "rem")
              {
                // proseguo assegnado/togliendo attributo...
                DataProxy.obj.taUDC2NC.toggleDC(barcodeIn, valAttr, MagClass.magazzino.CodSoggCurrUser, modeAdd);

                Postazione.messaggiText = string.Format("UDC {0}: {1}", barcodeIn, valAttr);
                Postazione.warningText = "";
                Postazione.CssClass = "stileComandoOk";
              }
              else
              {
                // non posso rimuovere x scadenza tempo massimo...
                Postazione.messaggiText = string.Format("UDC {0}: {1}", barcodeIn, valAttr);
                Postazione.warningText = traduci("expiredMaxGgRimDc");
                Postazione.CssClass = "stileComandoKo";
              }
            }
            else
            {
              string warningText = "";
              string valAttr = "";
              // predispongo messaggio di errore a seconda di cosa sia selezionato
              switch (memLayer.ML.QSS("RNC_Mode"))
              {
                case "sim":
                  valAttr = traduci("valAttrDel");
                  warningText = traduci("noNcDaDeliberare");
                  break;
                case "con":
                  valAttr = traduci("valAttrDelContr");
                  warningText = traduci("noNcDaDeliberare");
                  break;
                case "rem":
                  valAttr = traduci("rimLastDc");
                  warningText = traduci("noDcDaRimuovere");
                  break;
                default:
                  break;
              }
              Postazione.messaggiText = string.Format("UDC {0}: {1}", barcodeIn, valAttr);
              Postazione.warningText = warningText;
              Postazione.CssClass = "stileComandoKo";
            }
            doUpdate();
            break;
          default:
            Postazione.messaggiText = "";
            Postazione.warningText = traduci("ERR-UNK-001");
            Postazione.CssClass = "stileComandoND";
            break;
        }
        barcodeIn = "";
      }
      else
      {
        Postazione.messaggiText = traduci("AttesaBCode");
        Postazione.CssClass = "stileAttesa";
      }
      doUpdate();
    }
    /// <summary>
    /// aggiorna componenti + focus a barcode
    /// </summary>
    public void doUpdate()
    {
      grView.DataBind();
      fixBtn();
      txtBarcode.Focus();
    }
    /// <summary>
    /// Verifica l'UDC se sia ok x procedere:
    /// - esista
    /// - abbia un attributo cercato AttrCheck (NC/DC) successivo all'ultimo reset AttrRes (DC/NC) 
    /// </summary>
    /// <param name="UDC"></param>
    /// <param name="AttrRes"></param>
    /// <param name="AttrCheck"></param>
    /// <returns></returns>
    protected bool checkUDC(string UDC, string AttrRes, string AttrCheck)
    {
      bool answ = false;
      // faccio controlli...
      bool udcOk = MagClass.magazzino.checkUDC(UDC);
      bool udcHasNC = (DataProxy.obj.taUDC2NC.getNcPending(UDC, AttrRes, AttrCheck).Rows.Count > 0);
      // condizioni tutte soddisfatte?
      answ = (udcOk && udcHasNC);
      if (!answ)
      {
        Postazione.warningText = "";
        if (!udcOk)
        {
          Postazione.warningText += " " + traduci("ErroreUdcRNC_udcOk");
        }

        if (!udcHasNC)
        {
          Postazione.warningText += " " + traduci("ErroreUdcRNC_udcHasNc");
        }
      }
      else
      {
        Postazione.warningText = "";
      }
      return answ;
    }
  }
}