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

namespace GMW.WebUserControls
{
  public partial class mod_selLineaNtDt : GMW_data.UserControl
  {
    /// <summary>
    /// codice Linea corrente (x scambio norm/Dtx)
    /// </summary>
    public string codLinea
    {
      get
      {
        return memLayer.ML.StringSessionObj(string.Format("codLinea{0}", user_std.pagCorrente));
      }
      set
      {
        memLayer.ML.setSessionVal(string.Format("codLinea{0}", user_std.pagCorrente), value);
      }
    }
    /// <summary>
    /// NOME Linea corrente (x scambio norm/Dtx)
    /// </summary>
    public string nomeLinea
    {
      get
      {
        return memLayer.ML.StringSessionObj(string.Format("nomeLinea{0}", user_std.pagCorrente));
      }
      set
      {
        memLayer.ML.setSessionVal(string.Format("nomeLinea{0}", user_std.pagCorrente), value);
      }
    }
    /// <summary>
    /// codice Cella corrente (x scambio norm/Dtx)
    /// </summary>
    public string codCella
    {
      get
      {
        return memLayer.ML.StringSessionObj(string.Format("Cella{0}", user_std.pagCorrente));
      }
      set
      {
        memLayer.ML.setSessionVal(string.Format("Cella{0}", user_std.pagCorrente), value);
      }
    }
    /// <summary>
    /// idx Cella corrente (x scambio norm/Dtx)
    /// </summary>
    public int idxCella
    {
      get
      {
        return memLayer.ML.IntSessionObj(string.Format("IdxCella{0}", user_std.pagCorrente));
      }
      set
      {
        memLayer.ML.setSessionVal(string.Format("IdxCella{0}", user_std.pagCorrente), value);
      }
    }
    /// <summary>
    /// evento x richiesta refresh: selezione linea effettuata
    /// </summary>
    public event EventHandler eh_lineSelected;
    /// <summary>
    /// evento x richiesta refresh: selezione linea effettuata
    /// </summary>
    public event EventHandler eh_showHideStorico;
    /// <summary>
    /// caricamento pagina!
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void Page_Load(object sender, EventArgs e)
    {
      if (!Page.IsPostBack)
      {
        Postazione.warningText = "";
        Postazione.messaggiText = "";

        // in base alla pagina scelgo cosa mostrare active o meno e quale filtro linea...
        if (user_std.pagCorrente == urlNT)
        {
          preCodLinea = preCodLineNT;
          lbtNT.CssClass = cssSelected;
          lbtDT.CssClass = cssNormal;
        }
        else
        {
          preCodLinea = preCodLineDT;
          lbtNT.CssClass = cssNormal;
          lbtDT.CssClass = cssSelected;
        }
        // resetto linea e faccio update!
        resetLinea();
        checkLinea();
        fixStorico();
      }
      if (lemmaSx == null) lemmaSx = "modoNT";
      if (lemmaDx == null) lemmaDx = "modoDT";
      if (cssBtnSx == null) cssBtnSx = "fa fa-barcode";
      if (cssBtnDx == null) cssBtnDx = "fa fa-qrcode";
    }

    protected override void OnUnload(EventArgs e)
    {
      base.OnUnload(e);
      //if (codLinea != "")
      //{
      //    refreshBloccoPost(Postazione.currCodLinea);
      //}
    }

    /// <summary>
    /// verifica se ci sia linea in sessione, altrimenti su db, altrimenti reset!
    /// </summary>
    private void resetLinea()
    {
      string condLinea = string.Format(" TipoLinea = '{0}' ", tipoInOut);
      // cerco in sessione
      if (codCella != "")
      {
        Postazione.currCodLinea = codLinea;
        Postazione.currNomeLinea = nomeLinea;
        Postazione.currCodCella = codCella;
        Postazione.currIdxCella = idxCella;
      }
      // altrimenti su db...
      else if (MagClass.magazzino.taAL.getByPostBlocco(Postazione.name, preCodLinea).Select(condLinea).Length > 0)
      {
        DS_magazzino.AnagLineeRow riga = MagClass.magazzino.taAL.getByPostBlocco(Postazione.name, preCodLinea)[0];
        Postazione.currCodLinea = riga.CodLinea;
        Postazione.currNomeLinea = riga.Descrizione;
        Postazione.currCodCella = riga.CodCella;
        Postazione.currIdxCella = MagClass.magazzino.taCelle.getByCodCella(riga.CodCella)[0].IdxCella;
      }
      else
      // altrimenti reset!
      {
        Postazione.currCodLinea = codLinea;
        Postazione.currNomeLinea = nomeLinea;
        Postazione.currCodCella = codCella;
        Postazione.currIdxCella = idxCella;
      }
      Postazione.warningText = "";
      Postazione.messaggiText = "";
    }
    /// <summary>
    /// verifica linea corretta
    /// </summary>
    private void checkLinea()
    {
      // se c'è imposto linea da sessione
      if (Postazione.currCodLinea != "")
      {
        MagClass.magazzino.taAL.updatePost(Postazione.currCodLinea, Postazione.name);
        checkSelDDL(Postazione.currCodLinea, false);
      }
      else
      {
        // resetto uso postazione...
        resetPostazione();
      }
    }
    /// <summary>
    /// sistema visualizzazione storico
    /// </summary>
    private void fixStorico()
    {
      if (Postazione.showStorico)
      {
        lbtShowHideStorico.CssClass = cssSelected;
        lblShowHideStorico.Text = traduci("btnHideStorico");
      }
      else
      {
        lbtShowHideStorico.CssClass = cssNormal;
        lblShowHideStorico.Text = traduci("btnShowStorico");
      }
    }
    /// <summary>
    /// URL pagina NT
    /// </summary>
    public string urlNT { get; set; }
    /// <summary>
    /// URL pagina DT
    /// </summary>
    public string urlDT { get; set; }
    /// <summary>
    /// lemma link SX
    /// </summary>
    public string lemmaSx { get; set; }
    /// <summary>
    /// lemma link DX
    /// </summary>
    public string lemmaDx { get; set; }
    /// <summary>
    /// css button link SX
    /// </summary>
    public string cssBtnSx { get; set; }
    /// <summary>
    /// css button link DX
    /// </summary>
    public string cssBtnDx { get; set; }
    /// <summary>
    /// prefisso cod linea pagina NT
    /// </summary>
    public string preCodLineNT { get; set; }
    /// <summary>
    /// prefisso cod linea  pagina DT
    /// </summary>
    public string preCodLineDT { get; set; }
    /// <summary>
    /// css x caso "selected"
    /// </summary>
    public string cssSelected { get; set; }
    /// <summary>
    /// css x caso "normal"
    /// </summary>
    public string cssNormal { get; set; }
    /// <summary>
    /// valore per filtraggio TIPO linee (IN/OUT)
    /// </summary>
    public string tipoInOut
    {
      get
      {
        string answ = "";
        try
        {
          answ = txtTipoInOut.Text.Trim();
        }
        catch
        { }
        if (string.IsNullOrEmpty(answ)) answ = "IO";
        return answ;
      }
      set
      {
        txtTipoInOut.Text = value;
      }
    }
    /// <summary>
    /// valore per filtraggio codFamLinea
    /// </summary>
    public string CodFamLinea
    {
      get
      {
        return txtCodFam.Text.Trim();
      }
      set
      {
        txtCodFam.Text = value;
      }
    }
    /// <summary>
    /// valore per filtraggio selezione linee
    /// </summary>
    public string preCodLinea
    {
      get
      {
        return txtCodBlocco.Text.Trim();
      }
      set
      {
        txtCodBlocco.Text = value;
      }
    }
    /// <summary>
    /// determina se deve resettare SOLO BLOCCO o tutto (default=blocco)
    /// </summary>
    public bool resetPostByBlocco
    {
      get
      {
        bool answ = true;
        try
        {
          if (txtResetBlocco.Text != "")
          {
            answ = Convert.ToBoolean(txtResetBlocco.Text);
          }
        }
        catch
        { }
        return answ;
      }
      set
      {
        txtResetBlocco.Text = value.ToString();
      }
    }
    /// <summary>
    /// valore per filtraggio selezione linee
    /// </summary>
    public string formatoDmtx
    {
      get
      {
        return txtFormatoDmtx.Text.Trim();
      }
      set
      {
        txtFormatoDmtx.Text = value;
      }
    }
    /// <summary>
    /// gestione click modalità NT
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void lbtNT_Click(object sender, EventArgs e)
    {
      if (user_std.pagCorrente == urlNT)
      {
        if (eh_lineSelected != null)
        {
          eh_lineSelected(this, new EventArgs());
        }
      }
      else
      {
        codLinea = Postazione.currCodLinea;
        nomeLinea = Postazione.currNomeLinea;
        codCella = Postazione.currCodCella;
        idxCella = Postazione.currIdxCella;
        Response.Redirect(urlNT, false);
      }
    }
    /// <summary>
    /// gestione click modalità NT
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void lbtDT_Click(object sender, EventArgs e)
    {
      if (user_std.pagCorrente == urlDT)
      {
        if (eh_lineSelected != null)
        {
          eh_lineSelected(this, new EventArgs());
        }
      }
      else
      {
        // copio dati x blocco SOLO SE è linea "IO" doppio uso...
        if (tipoInOut == "IO")
        {
          codLinea = Postazione.currCodLinea;
          codCella = Postazione.currCodCella;
          idxCella = Postazione.currIdxCella;
        }
        Response.Redirect(urlDT, false);
      }
    }
    /// <summary>
    /// gestisco evento show/hide storico
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void btnShowHideStorico_Click(object sender, EventArgs e)
    {
      Postazione.showStorico = !Postazione.showStorico;
      fixStorico();
      if (eh_showHideStorico != null)
      {
        eh_showHideStorico(this, new EventArgs());
      }
    }
    /// <summary>
    /// selezione di una linea da elenco DropDownList
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void ddlLinea_SelectedIndexChanged(object sender, EventArgs e)
    {
      checkSelDDL(ddlLinea.SelectedValue, true);
    }
    /// <summary>
    /// tenta di selezionare la linea indicata
    /// </summary>
    /// <param name="p"></param>
    private void checkSelDDL(string codLinea, bool doSave)
    {
      /*******************************************************
      * controllo se la linea sia libera .. OVVERO:
      * - nessuna postazione la occupa
      * - è bloccata da + di "minutiBloccoLinea" (e quindi sovrascrivo)
      * 
      *******************************************************/
      bool lineaLibera = false;
      Postazione.warningText = "";
      Postazione.messaggiText = "";
      if (codLinea != "")
      {
        try
        {
          DS_magazzino.AnagLineeRow riga = MagClass.magazzino.taAL.getByKey(codLinea)[0];
          if (string.IsNullOrEmpty(riga.codPostazione) || riga.codPostazione == Postazione.name)
          {
            lineaLibera = true;
          }
          else
          {
            // controllo se è bloccata da tempo > minutiBloccoLinea --> ignoro blocco!
            if (DateTime.Now >= riga.dtAccess.AddMinutes(memLayer.ML.confReadInt("minutiBloccoLinea")))
            {
              lineaLibera = true;
            }
          }
        }
        catch
        { }
      }
      if (lineaLibera)
      {
        // se ho preCodLinea...
        if (preCodLinea != "")
        {
          Postazione.messaggiText = "";
          //...aggiorno ddl
          try
          {
            ddlLinea.SelectedValue = codLinea;
            Postazione.CssClass = "stileAttesa";
          }
          catch
          {
            // mostro errore
            Postazione.messaggiText = string.Format("Errore selezione linea: codice {0} non trovato!", codLinea);
            Postazione.CssClass = "stileComandoKo";
          }
          if (doSave)
          {
            refreshBloccoPost(codLinea);
            // continuo
            Postazione.currCodLinea = codLinea;
          }
          // salvo codice cella!
          try
          {
            Postazione.currCodCella = MagClass.magazzino.taAL.getByKey(Postazione.currCodLinea)[0].CodCella;
            Postazione.currNomeLinea = MagClass.magazzino.taAL.getByKey(Postazione.currCodLinea)[0].Descrizione;
            Postazione.currIdxCella = MagClass.magazzino.taCelle.getByCodCella(Postazione.currCodCella)[0].IdxCella;
          }
          catch
          {
            Postazione.currCodCella = "";
            Postazione.currNomeLinea = "";
            Postazione.currIdxCella = 0;
            resetPostazione();
          }
        }
      }
      else
      {
        Postazione.currCodCella = "";
        Postazione.currNomeLinea = "";
        Postazione.currIdxCella = 0;
        resetPostazione();
        // mostro errore
        Postazione.messaggiText = string.Format("Errore: linea {0} già impegnata, sbloccare postazione o attendere timeout!", codLinea);
        Postazione.CssClass = "stileComandoKo";
        ddlLinea.DataBind();
        if (ddlLinea.Items.Count > 0) ddlLinea.SelectedIndex = 0;
      }
      if (eh_lineSelected != null)
      {
        eh_lineSelected(this, new EventArgs());
      }
    }
    /// <summary>
    /// Reset postazione occupata
    /// </summary>
    private void resetPostazione()
    {
      if (resetPostByBlocco)
      {
        MagClass.magazzino.taAL.resetPostBlocco(Postazione.name, preCodLinea); // resetto solo x blocco!
      }
      else
      {
        MagClass.magazzino.taAL.resetPost(Postazione.name);
      }
    }

    /// <summary>
    /// effettua refresh (su db) del blocco postazione
    /// </summary>
    /// <param name="codLinea"></param>
    public void refreshBloccoPost(string codLinea)
    {
      // resetto usi linee precedenti..
      resetPostazione();
      if (codLinea != "")
      {
        // se la linea non è "base" = "Sel linea", finisce x "00"
        if (codLinea.Substring(codLinea.Length - 2) != "00")
        {
          // salvo su DB che sto occupando linea...
          MagClass.magazzino.taAL.updatePost(codLinea, Postazione.name);
        }
      }
      try
      {
        // ricarico elenco postazioni...
        ddlLinea.DataBind();
      }
      catch
      {
        //// preCodLInea è ""
        //ddlLinea.SelectedIndex = 0;
        //ddlLinea.SelectedValue = string.Format("{0}00", preCodLinea);
        //ddlLinea.DataBind();
      }
    }
    /// <summary>
    /// definisce visibilità selettore linea...
    /// </summary>
    public bool showSelPostazione
    {
      get
      {
        return ddlLinea.Visible;
      }
      set
      {
        ddlLinea.Visible = value;
      }
    }
    /// <summary>
    /// determina visibilità selettori NT/DT
    /// </summary>
    public bool showSelNtDt
    {
      get
      {
        return divDtNt.Visible;
      }
      set
      {
        divDtNt.Visible = value;
      }
    }
    /// <summary>
    /// determina visibilità btn storico
    /// </summary>
    public bool showStorico
    {
      get
      {
        return lbtShowHideStorico.Visible;
      }
      set
      {
        lbtShowHideStorico.Visible = value;
      }
    }
    /// <summary>
    /// Aggiorna
    /// </summary>
    public void doUpdate()
    {
      try
      {
        ddlLinea.DataBind();
        checkSelDDL(ddlLinea.SelectedValue, true);
      }
      catch (Exception exc)
      {
        logger.lg.scriviLog(string.Format("eccezione in update: {0}", exc), tipoLog.EXCEPTION);
      }
    }
    /// <summary>
    /// Label Postazione 
    /// </summary>
    public string lblPostazione
    {
      get
      {
        return lblPost.Text;
      }
      set
      {
        lblPost.Text = value;
      }
    }
  }
}