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

namespace GMW.WebUserControls
{
  public partial class mod_PostTT : System.Web.UI.UserControl
  {
    /// <summary>
    /// evento richiesta update
    /// </summary>
    public event EventHandler eh_reqUpdate;
    /// <summary>
    /// flusso associato (hard coded) a RX
    /// </summary>
    protected string flusso = "TT";
    /// <summary>
    /// stato associato (hard coded) a Controllato RX
    /// </summary>
    protected string statoUDC = "Tratt";
    /// <summary>
    /// codice evento dell'UDC che si crea
    /// </summary>
    protected string codEventoUdc = "UDC_TRATT";
    /// <summary>
    /// Codice AL sorgente da avanzare RX --> TT
    /// </summary>
    protected string sourceAL
    {
      get
      {
        return lblAL.Text.Trim();
      }
      set
      {
        lblAL.Text = value;
      }
    }
    /// <summary>
    /// Numero trattamento
    /// </summary>
    protected string NumTratt
    {
      get
      {
        return txtNumTratt.Text.Trim();
      }
      set
      {
        txtNumTratt.Text = value;
      }
    }
    /// <summary>
    /// Anno trattamento
    /// </summary>
    protected string AnnoTratt
    {
      get
      {
        return txtAnno.Text.Trim();
      }
      set
      {
        txtAnno.Text = value;
      }
    }
    /// <summary>
    /// Durezza (ok/ko)
    /// </summary>
    public bool Durezza
    {
      get
      {
        return chkDurezza.Checked;
      }
      set
      {
        chkDurezza.Checked = value;
      }
    }
    /// <summary>
    /// caricamento pagina
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void Page_Load(object sender, EventArgs e)
    {
      if (!Page.IsPostBack)
      {
        resetIN();
        Postazione.messaggiText = "";
        Postazione.warningText = "";
      }
      checkBarcode();
    }
    /// <summary>
    /// restta input
    /// </summary>
    private void resetIN()
    {
      AnnoTratt = DateTime.Now.Year.ToString();
      sourceAL = "";
      NumTratt = "";
      Durezza = false;
      txtNote.Text = "";
      txtPunzone.Text = "";
    }
    /// <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 AL
            if (checkAL(barcodeIn))
            {
              resetIN();
              sourceAL = barcodeIn;
            }
            doUpdate();
            break;
          case tipoCodiceBarcode.UDC:
            // verifico UDC
            if (checkUDC(barcodeIn))
            {
              string AL = "";
              // recupero da UDC
              try
              {
                AL = MagClass.magazzino.taAL2UDC.getByUDC(barcodeIn)[0].AL;
              }
              catch
              {
                Postazione.warningText = traduci("ErroreUdcNonAl");
                Postazione.CssClass = "stileComandoKo";
              }
              if (AL != "")
              {
                // verifico AL
                if (checkAL(AL))
                {
                  sourceAL = AL;
                }
              }
            }
            doUpdate();
            break;
          case tipoCodiceBarcode.Comando:
            // se è reset cancello tutto!
            if (barcodeIn == memLayer.ML.cdv("cmdReset"))
            {
              resetIN();
              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"></param>
    /// <returns></returns>
    protected bool checkAL(string AL)
    {
      bool answ = false;
      try
      {
        answ = MagClass.magazzino.taEA.getByAL_TipoAttivo(AL, "R").Rows.Count > 0;
      }
      catch
      { }
      if (!answ)
      {
        Postazione.warningText = traduci("ErroreAlNonRxAttivo");
        Postazione.CssClass = "stileComandoKo";
        // reimporto AL comunque..
        sourceAL = "";
      }
      else
      {
        Postazione.warningText = "";
        Postazione.CssClass = "stileComandoOk";
      }
      return answ;
    }
    /// <summary>
    /// Verifica l'UDC se sia ok x procedere:
    /// - esista e sia IdxPosizione > 0
    /// - presente in un AL
    /// </summary>
    /// <param name="UDC"></param>
    /// <returns></returns>
    protected bool checkUDC(string UDC)
    {
      bool answ = false;
      //faccio 3 controlli...
      bool udcOk = MagClass.magazzino.checkUDC(UDC);
      bool udcMov = MagClass.magazzino.checkUDC_mov(UDC);
      bool udcInAL = (MagClass.magazzino.taAL2UDC.getByUDC(UDC).Rows.Count > 0);
      // condizioni tutte soddisfatte?
      answ = (udcOk && udcMov && udcInAL);
      if (!answ)
      {
        Postazione.warningText = traduci("ErroreUdcRx");
      }
      else
      {
        Postazione.warningText = "";
      }
      return answ;
    }
    /// <summary>
    /// aggiorna componenti + focus a barcode
    /// </summary>
    public void doUpdate()
    {
      if (Durezza)
      {
        chkDurezza.Text = "OK";
        lblDurezza.Attributes.Remove("class");
        lblDurezza.Attributes.Add("class", "btn btn-success");
      }
      else
      {
        chkDurezza.Text = "KO";
        lblDurezza.Attributes.Remove("class");
        lblDurezza.Attributes.Add("class", "btn btn-danger");
      }
      grViewSource.DataBind();
      updateBtns();
      // raise dell'evento
      if (eh_reqUpdate != null)
      {
        eh_reqUpdate(this, new EventArgs());
      }
      // controllo SE ho AL allora seleziono NumTratt o Durezza...
      if (string.IsNullOrEmpty(sourceAL))
      {
        txtBarcode.Focus();
      }
      else
      {
        if (string.IsNullOrEmpty(NumTratt))
        {
          txtNumTratt.Focus();
        }
        else
        {
          if (!Durezza)
          {
            chkDurezza.Focus();
          }
          else
          {
            if (string.IsNullOrEmpty(txtNote.Text.Trim()))
            {
              txtNote.Focus();
            }
            else
            {
              lbtStampaAL.Focus();
            }
          }
        }
      }
    }
    /// <summary>
    /// fix visibilità btnStampa
    /// </summary>
    private void updateBtns()
    {
      // posso stampare se ho AL, ho num tratt e durezza..
      bool btnVis = (sourceAL != "");
      divNumTratt.Visible = btnVis;
      divDurezza.Visible = btnVis;
      divPunzone.Visible = btnVis;
      // posso stampare se ho AL, ho num tratt e durezza..
      btnVis = (sourceAL != "" && NumTratt != "" && Durezza);
      divStampa.Visible = btnVis;
    }
    /// <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 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 != "")
      {
        /* generazione e stampa AL */
        string AL = "";
        string noteTrim = txtNote.Text.Trim();
        // ricalcolo numtratt come stringa formattata (anno + num 6 cifre)
        string codTratt = MagClass.magazzino.getCompTrattamenti(AnnoTratt, NumTratt);
        // punzone
        string punzone = txtPunzone.Text.Trim();
        // creazione AL ed associazione UDC / spostamento...
        try
        {
          AL = MagClass.magazzino.creaAssociaAlTT(sourceAL, tipoAL.AL_TT, MagClass.magazzino.CodSoggCurrUser, noteTrim, codTratt, Convert.ToInt32(Durezza), punzone);
        }
        catch
        { }
        if (AL != "")
        {
          // lancio stampa
          MagClass.magazzino.stampaAL(AL, Postazione.printer, Request.UserHostName);
          // registro creazione AL
          MagClass.magazzino.taSAO.insertQuery(DateTime.Now, MagClass.magazzino.CodSoggCurrUser, Postazione.name, Postazione.IP, AL, "", "creaAL", string.Format("Creato AL TT su linea {0}, note: {1} ", Postazione.currCodLinea, noteTrim));
          Postazione.CssClass = "stileAttesa";
          Postazione.warningText = "";
          Postazione.messaggiText = traduci("cartAlStampato");
          // resetto 
          resetIN();
        }
        else
        {
          Postazione.CssClass = "stileComandoKo";
          Postazione.warningText = traduci("ErroreCreazioneALTT");
          Postazione.messaggiText = "";
        }
        doUpdate();
      }
      else
      {
        // ricarico che mi manca postazione!
        Postazione.CssClass = "stileAttesa";
        Postazione.warningText = traduci("ERR-POS-001");
        Postazione.messaggiText = "";
        Response.Redirect(user_std.pagCorrente);
      }
    }
    /// <summary>
    /// inserito num trattamento
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void txtNumTratt_TextChanged(object sender, EventArgs e)
    {
      // controllo numero trattamento...
      string codTratt = MagClass.magazzino.getCompTrattamenti(AnnoTratt, NumTratt);
      // cerco se ci sia già (do errore...)
      if (MagClass.magazzino.taET.getByTratt(codTratt).Rows.Count > 0)
      {
        Postazione.warningText = traduci("ERR-NTT-001");
        Postazione.CssClass = "stileComandoKo";
        NumTratt = "";
      }
      else
      {
        Postazione.warningText = "";
        Postazione.CssClass = "stileComandoOk";
      }
      Postazione.messaggiText = codTratt;
      doUpdate();
    }
    /// <summary>
    /// modificata durezza
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void chkDurezza_CheckedChanged(object sender, EventArgs e)
    {
      doUpdate();
    }
  }
}