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

namespace GMW.WebUserControls
{
  public partial class mod_storicoAzioniOperatore : System.Web.UI.UserControl
  {

    /// <summary>
    /// Parametro privato x cancellazione AL
    /// </summary>
    protected bool _enableDelAl;
    /// <summary>
    /// Determina SE SIA abilitata la cancellazione degli AL
    /// </summary>
    public bool enableDelAl
    {
      get
      {
        return _enableDelAl;
      }
      set
      {
        _enableDelAl = value;
      }
    }
    /// <summary>
    /// Verifica se il valore indicato con udcReq x azione SIA un AL (e non UDC...)
    /// </summary>
    protected bool isAL
    {
      get
      {
        return udcReq.StartsWith("AL");
      }
    }
    /// <summary>
    /// Parametro privato x cancellazione AL
    /// </summary>
    protected string _prefAL;
    /// <summary>
    /// Prefisso AL abilitato alla cancellazione (SE abilitata)
    /// </summary>
    public string prefAL
    {
      get
      {
        return _prefAL;
      }
      set
      {
        _prefAL = value;
      }
    }
    /// <summary>
    /// evento richiesta stampa UDC
    /// </summary>
    public event EventHandler eh_stampa;

    /// <summary>
    /// caricamento pagina
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void Page_Load(object sender, EventArgs e)
    {
      if (!Page.IsPostBack)
      {
        memLayer.ML.setSessionVal("dataFromPost", DateTime.Now.AddDays(-7).ToString("s"));
        memLayer.ML.setSessionVal("dataToPost", DateTime.Now.AddDays(1).ToString("s"));
        idxEvento = -1;
        traduciObj();
      }
      setBtnState();
    }
    /// <summary>
    /// fix traduzioni
    /// </summary>
    private void traduciObj()
    {
      //btnShowHideStorico.Text = traduci("btnHideStorico");
    }
    /// <summary>
    /// sistema visibilità/abilitazione buttons
    /// </summary>
    private void setBtnState()
    {
      bool showDelUdc = memLayer.ML.confReadBool("userCanDelUdc") && showDelete;
      btnElimina.Visible = true;
      btnStampa.Visible = true;
#if false
      btnElimina.Visible = false; 
#endif
      bool abilita = false;
      string css = "btn btn-default disabled";
      // se ho udc selezionato verifico se sia eliminabile
      if (udcSel != "" && showDelUdc)
      {
        // controllo con stored SE sia possibile cancellare UDC: 
        // inizio stringa può essere    OK  --> mostro delete (e POTREI aggiungere nota su cosa sia e che posso cancellare)
        //                              ERR --> NON mostro delete ma solo errore

        string answ = "";
        MagClass.magazzino.taUdcChk4Del.GetData(udcSel, ref answ);
        // controllo esito
        if (answ.StartsWith("OK"))
        {
          showDelUdc = true;
        }
        else
        {
          showDelUdc = false;
        }
#if false
        btnElimina.Enabled = showDelUdc; 
#endif
      }
      if (idxEvento > 0 && udcSel != "")
      {
        if (MagClass.magazzino.checkUDC(udcSel) || (MagClass.magazzino.checkAL(udcSel) && udcSel.StartsWith("A")))
        {
          abilita = true;
          css = "btn btn-default";
        }
      }
      btnStampa.CssClass = css;
      btnElimina.CssClass = css;
      // se è AL NON permetto ristampa (SE consumato)
      if (udcSel.StartsWith("A"))
      {
        btnStampa.Enabled = showDelUdc;
      }
      else
      {
        btnStampa.Enabled = abilita;
      }
      // elimina richeide invece ENTRAMBE le condizioni
      btnElimina.Enabled = abilita && showDelUdc;
    }
    /// <summary>
    /// indica name della postazione corrente
    /// </summary>
    protected string postazione_name
    {
      get
      {
        return memLayer.ML.StringSessionObj("postazione_name");
      }
      set
      {
        memLayer.ML.setSessionVal("postazione_name", value);
      }
    }
    /// <summary>
    /// restituisce url immagine da cod azione
    /// </summary>
    /// <param name="codAzione"></param>
    /// <returns></returns>
    public string imgAzione(object codAzione)
    {
      string answ = "";
      try
      {
        answ = string.Format("~/images/{0}_m.png", codAzione);
      }
      catch
      { }
      return answ;
    }
    /// <summary>
    /// reset della selezione
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void btnReset_Click(object sender, EventArgs e)
    {
      resetSelezione();
    }
    /// <summary>
    /// resetta la selezione dei valori in caso di modifiche su altri controlli
    /// </summary>
    public void resetSelezione()
    {
      memLayer.ML.emptySessionVal("udcSelSAO");
      grView.SelectedIndex = -1;
      idxEvento = -1;
      grView.DataBind();
      setBtnState();
    }
    /// <summary>
    /// gestione evento select
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void grView_SelectedIndexChanged(object sender, EventArgs e)
    {
      // salvo idxEvento x abilitare buttons
      idxEvento = Convert.ToInt32(grView.SelectedDataKey["idxEvento"]);
      // salvo UDC x reprint
      string udc = "";
      try
      {
        udc = MagClass.magazzino.taSAO.getByIdxEvento(idxEvento)[0].UDC;
      }
      catch
      { }
      if (udc != "")
      {
        // verifico UDC valido (non cancellato!!!)
        if (MagClass.magazzino.checkUDC(udc))
        {
          udcSel = udc;
        }
        else if (udc.StartsWith("A"))
        {
          udcSel = udc;
        }
        else
        {
          udcSel = "";
        }
      }
      else
      {
        udcSel = "";
      }
      setBtnState();
    }
    /// <summary>
    /// forza update controllo
    /// </summary>
    public void doUpdate()
    {
      memLayer.ML.setSessionVal("dataFromPost", DateTime.Now.AddDays(-7));
      memLayer.ML.setSessionVal("dataToPost", DateTime.Now.AddDays(1));
      grView.DataBind();
    }
    /// <summary>
    /// idxEvento selezionato
    /// </summary>
    protected int idxEvento
    {
      get
      {
        return memLayer.ML.IntSessionObj(string.Format("idxEvento_{0}", this.ID));
      }
      set
      {
        memLayer.ML.setSessionVal(string.Format("idxEvento_{0}", this.ID), value);
      }
    }
    /// <summary>
    /// udc correntemente selezionato
    /// </summary>
    protected string udcSel
    {
      get
      {
        return memLayer.ML.StringSessionObj("udcSelSAO");
      }
      set
      {
        memLayer.ML.setSessionVal("udcSelSAO", value);
      }
    }
    /// <summary>
    /// IdxPosizione abilitata x cancellazione
    /// </summary>
    public int IdxPosizione2del
    {
      get
      {
        return memLayer.ML.IntSessionObj(string.Format("IdxPosizione_{0}", this.ID));
      }
      set
      {
        memLayer.ML.setSessionVal(string.Format("IdxPosizione_{0}", this.ID), value);
      }
    }
    /// <summary>
    /// richiede stampa
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void btnStampa_Click(object sender, EventArgs e)
    {
      // chiamo evento ri-stampa UDC
      if (eh_stampa != null)
      {
        eh_stampa(this, new EventArgs());
      }
      // reset finale
      resetSelezione();
    }
    /// <summary>
    /// udc da stampare
    /// </summary>
    protected string udcReq
    {
      get
      {
        return memLayer.ML.StringSessionObj("udcSelSAO");
      }
    }
    /// <summary>
    /// Procedura eliminazione UDC
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void btnElimina_Click(object sender, EventArgs e)
    {
      /**********************************************
       * controllo che l'UDC 
       * - esista
       * - NON SIA in liste di prelievo
       * - IdxPosizione = IdxPosizione2del
       **********************************************/
      // check condizioni
      bool okLDP = false;
      bool okIdxPos = false;
      string particolare = "";
      DS_magazzino.ElencoCartelliniRow rigaUDC;
      // controllo UDC esista
      if (MagClass.magazzino.checkUDC(udcReq))
      {
        try
        {
          rigaUDC = MagClass.magazzino.taCartellini.getByUdc(udcReq)[0];
          if (rigaUDC.IdxPosizione == IdxPosizione2del)
          {
            okIdxPos = true;
          }
          particolare = rigaUDC.Particolare;
        }
        catch
        { }
        try
        {
          // non sia in alcuna LDP
          okLDP = (MagClass.magazzino.taRigheListePrelievo.getByUdc(udcReq).Count == 0);
        }
        catch
        { }

        if (okLDP && okIdxPos)
        {
          // a questo punto elimino UDC
          MagClass.magazzino.taCartellini.deleteUDC(udcReq);
          // registro eliminazione nuovo UDC
          DateTime adesso = DateTime.Now;
          MagClass.magazzino.taSAO.insertQuery(adesso, MagClass.magazzino.CodSoggCurrUser, postazione_name, postazione_IP, udcReq, particolare, "eliminaUDC", "Eliminato UDC");
        }
        // reset finale
        resetSelezione();
      }
      // se NON TROVA UDC ed è abilitato AL...
      else if (enableDelAl && isAL)
      {
        // posso procedere con eliminazione DI TUTTI gli UDC 
        foreach (var rigaAL2UDC in MagClass.magazzino.taAL2UDC.getByAL(udcReq))
        {
          eliminaUDC(rigaAL2UDC.UDC);
        }
        // ...e poi posso anche DISATTIVARE l'AL...
        MagClass.magazzino.taEA.DisattivaAL(udcReq);

        // registro eliminazione AL                                       
        string codKIT = MagClass.magazzino.taEA.getByAL(udcReq)[0].CodKIT;
        DateTime adesso = DateTime.Now;
        MagClass.magazzino.taSAO.insertQuery(adesso, MagClass.magazzino.CodSoggCurrUser, postazione_name, postazione_IP, udcReq, codKIT, "eliminaUDC", "Eliminato UDC + disattivato AL");
        // reset finale
        resetSelezione();
      }
    }
    /// <summary>
    /// Elimino ogni UDC dell'AL...
    /// </summary>
    /// <param name="UDC"></param>
    private void eliminaUDC(string UDC)
    {
      DS_magazzino.ElencoCartelliniRow rigaUDC;
      bool okLDP = false;
      bool okIdxPos = false;
      string particolare = "";
      try
      {
        rigaUDC = MagClass.magazzino.taCartellini.getByUdc(UDC)[0];
        if (rigaUDC.IdxPosizione == IdxPosizione2del)
        {
          okIdxPos = true;
        }
        particolare = rigaUDC.Particolare;
      }
      catch (Exception exc)
      {
        logger.lg.scriviLog(string.Format("Eccezione in eliminaUDC{0}{1}", Environment.NewLine, exc));
      }
      try
      {
        // non sia in alcuna LDP
        okLDP = (MagClass.magazzino.taRigheListePrelievo.getByUdc(UDC).Count == 0);
      }
      catch
      { }

      if (okLDP && okIdxPos)
      {
        // a questo punto elimino UDC
        MagClass.magazzino.taCartellini.deleteUDC(UDC);
      }
    }

    /// <summary>
    /// indica ip della postazione corrente
    /// </summary>
    protected string postazione_IP
    {
      get
      {
        return memLayer.ML.StringSessionObj("postazione_IP");
      }
      set
      {
        memLayer.ML.setSessionVal("postazione_IP", value);
      }
    }
    /// <summary>
    /// wrapper traduzione
    /// </summary>
    /// <param name="lemma"></param>
    /// <returns></returns>
    public string traduci(object lemma)
    {
      return user_std.UtSn.Traduci(lemma.ToString());
    }
    /// <summary>
    /// definisce se visualizzare o meno btn elimina
    /// </summary>
    public bool showDelete { get; set; }
  }
}