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

namespace GMW.WebUserControls
{
  public partial class mod_PostTT_Pre_DT : System.Web.UI.UserControl
  {
    /// <summary>
    /// Oggetto locale gestione classe datamatrix...
    /// </summary>
    protected DataMatrix DataMatrix_mgr = new DataMatrix();
    /// <summary>
    /// evento richiesta update
    /// </summary>
    public event EventHandler eh_reqUpdate;
    /// <summary>
    /// flusso associato (hard coded) a RX
    /// </summary>
    protected string flusso = "RX";
    /// <summary>
    /// stato associato (hard coded) a Controllato RX
    /// </summary>
    protected string statoUDC = "ContrRx";
    /// <summary>
    /// codice evento dell'UDC che si crea
    /// </summary>
    protected string codEventoUdc = "UDC_RX_TT_DT";
    /// <summary>
    /// Tipo AL accettabile (RX = R)
    /// </summary>
    protected string codTipoAL = "R";
    /// <summary>
    /// stringa UID univoca
    /// </summary>
    public string uid
    {
      get
      {
        return this.UniqueID.Replace("$", "_").Replace("-", "_");
      }
    }
    /// <summary>
    /// Codice AL target
    /// </summary>
    protected string destAL
    {
      get
      {
        return lblAL.Text.Trim();
      }
      set
      {
        lblAL.Text = value;
      }
    }
    /// <summary>
    /// Codice UDC sorgente
    /// </summary>
    protected string sourceUDC
    {
      get
      {
        return lblUdc.Text.Trim();
      }
      set
      {
        lblUdc.Text = value;
      }
    }
    /// <summary>
    /// Codice AL sorgente
    /// </summary>
    protected string sourceAL
    {
      get
      {
        return lblAlFrom.Text.Trim();
      }
      set
      {
        lblAlFrom.Text = value;
      }
    }
    /// <summary>
    /// caricamento pagina
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void Page_Load(object sender, EventArgs e)
    {
      if (!Page.IsPostBack)
      {
        sourceAL = "";
        sourceUDC = "";
        destAL = "";
        Postazione.messaggiText = "";
        Postazione.warningText = "";
      }
      checkBarcode();
    }
    /// <summary>
    /// resetta AL destinazione ed AL/UDC sorgente
    /// </summary>
    public void resetSourceDestAL()
    {
      sourceAL = "";
      sourceUDC = "";
      destAL = "";
    }
    /// <summary>
    /// wrapper traduzione
    /// </summary>
    /// <param name="lemma"></param>
    /// <returns></returns>
    public string traduci(object lemma)
    {
      return user_std.UtSn.Traduci(lemma.ToString());
    }
    /// <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.AL:
            // verifico codice AL sia coerente: ACCETTO SOLO ALR...
            if (checkAL(barcodeIn))
            {
              // verifico se è accettabile (DTX)
              if (DataMatrix_mgr.taDtx2UDC.getByAL(barcodeIn).Rows.Count > 0)
              {
                // imposto AL corrente...
                destAL = barcodeIn;
                Postazione.CssClass = "stileAttesa";
                Postazione.warningText = "";
              }
              else
              {
                Postazione.warningText = traduci("ErrAL_NoDtx");
                Postazione.CssClass = "stileComandoKo";
              }
            }
            break;
          case tipoCodiceBarcode.UDC:
            // verifico se è accettabile (DTX)
            if (DataMatrix_mgr.taDtx2UDC.getByUDC(barcodeIn).Rows.Count > 0)
            {
              // imposto UDC corrente...
              sourceUDC = barcodeIn;
              string newAL = MagClass.magazzino.taAL2UDC.getByUDC(barcodeIn)[0].AL;
              // verifico codice AL sia coerente: ACCETTO SOLO ALR...
              if (checkAL(newAL))
              {
                // imposto AL sorgente
                sourceAL = newAL;
                //sourceAL = MagClass.magazzino.taAL2UDC.getByUDC(barcodeIn)[0].AL;
                Postazione.CssClass = "stileAttesa";
                Postazione.warningText = "";
              }
            }
            else
            {
              Postazione.warningText = traduci("ErrUDC_NoDtx");
              Postazione.CssClass = "stileComandoKo";
            }
            break;
          case tipoCodiceBarcode.Comando:
            // se è reset cancello tutto!
            if (barcodeIn == memLayer.ML.cdv("cmdReset"))
            {
              sourceUDC = "";
              destAL = "";
              Postazione.messaggiText = "";
              Postazione.warningText = "";
              doUpdate();
            }
            Postazione.CssClass = "stileAttesa";
            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>
    /// Verifica l'AL se sia ok x procedere:
    /// - Tipo "R"
    /// - Attivo
    /// </summary>
    /// <param name="AL">The al.</param>
    /// <returns></returns>
    protected bool checkAL(string AL)
    {
      bool answ = false;
      // verifico codice AL sia coerente: ACCETTO SOLO ALR...
      if (AL.StartsWith("AL" + codTipoAL))
      {
        try
        {
          answ = MagClass.magazzino.taEA.getByAL_TipoAttivo(AL, codTipoAL).Rows.Count > 0;
        }
        catch
        { }
        if (!answ)
        {
          Postazione.warningText = traduci("ErroreAlNonRxAttivo");
          Postazione.CssClass = "stileComandoKo";
        }
        else
        {
          Postazione.warningText = "";
          Postazione.CssClass = "stileComandoOk";
        }
      }
      else
      {
        Postazione.warningText = traduci("ErrAL_TipoErrato");
        Postazione.CssClass = "stileComandoKo";
      }
      return answ;
    }
    /// <summary>
    /// aggiorna componenti + focus a barcode
    /// </summary>
    public void doUpdate()
    {
      grViewDest.DataBind();
      grViewSource.DataBind();
      updateBtns();
      // raise dell'evento
      if (eh_reqUpdate != null)
      {
        eh_reqUpdate(this, new EventArgs());
      }
      txtBarcode.Focus();
    }
    /// <summary>
    /// fix visibilità btnMove
    /// </summary>
    private void updateBtns()
    {
      bool btnVis = false;
      // se ho source e dest mostro travasa...
      if (destAL != "" && sourceAL != "")
      {
        DS_magazzino.V_statoCelleCapienzaAssegnatiRow riga;
        int capienza = 6; // hard coded...
        try
        {
          riga = MagClass.magazzino.taStatoCelle.getByIdxCella(Postazione.currIdxCella)[0];
          capienza = riga.Capienza;
        }
        catch
        {
          capienza = 6; // hard coded...
        }
        // se ho somma UDC < (capienza) tra AL sorgente e destinazione
        if (MagClass.magazzino.taAnagPart.getDistinctByAlSourceDest(sourceAL, destAL).Rows.Count < capienza)
        {
          btnVis = true;
        }
        else
        {
          Postazione.warningText = traduci("ErrAlPieno");
        }
      }
      divTravasa.Visible = btnVis;
      divStampa.Visible = btnVis;
    }
    /// <summary>
    /// sposto la qta richiesta, eventualmente creando nuovo UDC
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void lbtMove_Click(object sender, EventArgs e)
    {
      MagClass.magazzino.travasoAL(sourceAL, destAL, Postazione.IP);
      Postazione.warningText = "";
      Postazione.messaggiText = string.Format("{0} AL {1} --> AL {2}", traduci("Spostato"), sourceAL, destAL);
      doUpdate();
    }
    /// <summary>
    /// richiesta (ri)stampa UDC
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    public void ristampa()
    {
      MagClass.magazzino.stampaAL(udcReq, Postazione.printer, Request.UserHostName);
      // registro ri-stampa UDC
      MagClass.magazzino.taSAO.insertQuery(DateTime.Now, MagClass.magazzino.CodSoggCurrUser, Postazione.name, Postazione.IP, udcReq, "", "stampaAL", "Ri-Stampato AL Rx DT in post PRE TT");
      Postazione.CssClass = "stileAttesa";
    }
    /// <summary>
    /// udc da stampare
    /// </summary>
    protected string udcReq
    {
      get
      {
        return memLayer.ML.StringSessionObj("udcSelSAO");
      }
    }
    /// <summary>
    /// (ri)stampa AL
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void lbtStampaAL_Click(object sender, EventArgs e)
    {
      // verifico postazione sia valida...
      if (Postazione.name != "" && Postazione.IP != "" && Postazione.currCodCella != "")
      {
        // lancio stampa
        MagClass.magazzino.stampaAL(destAL, Postazione.printer, Request.UserHostName);
        Postazione.CssClass = "stileAttesa";
        Postazione.warningText = "";
        Postazione.messaggiText = traduci("cartAlStampato");
        sourceUDC = "";
        sourceAL = "";
        destAL = "";
        doUpdate();
      }
      else
      {
        // ricarico che mi manca postazione!
        Postazione.CssClass = "stileAttesa";
        Postazione.warningText = traduci("ERR-POS-001");
        Postazione.messaggiText = "";
        Response.Redirect(user_std.pagCorrente);
      }
    }
  }
}