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_viewRigheListaPrelievo : SteamWare.ApplicationUserControl
  {
    #region area da NON modificare

    #region area protected

    protected string _idxGridView;
    protected string _idxGridViewExt;
    protected string _tabCache;

    /// <summary>
    /// aggiorna controlli datagrid e numero righe in pagina
    /// </summary>
    protected override void aggiornaControlliDataGL()
    {
      base.aggiornaControlliDataGL();
      grView.PageSize = _righeDataGridMed;
    }
    /// <summary>
    /// traduce gli header delle colonne
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void grView_DataBound(object sender, EventArgs e)
    {
      if (grView.Rows.Count > 0)
      {
        LinkButton lb;
        // aggiorno gli headers        
        foreach (TableCell cella in grView.HeaderRow.Cells)
        {
          try
          {
            lb = (LinkButton)cella.Controls[0];
            lb.Text = traduci(lb.Text);
          }
          catch
          { }
        }
        int totRecord = grView.Rows.Count + grView.PageSize * (grView.PageCount - 1);
        lblNumRec.Text = string.Format("{0} records of ~ {1}", grView.Rows.Count, totRecord);
      }
      else
      {
        lblNumRec.Text = "";
      }
    }
    /// <summary>
    /// reset della selezione
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void btnReset_Click(object sender, EventArgs e)
    {
      resetSelezione();
    }


    /// <summary>
    /// collega i controlli
    /// </summary>
    protected override void bindControlli()
    {
      base.bindControlli();
      caricaTabelle();
    }

    #endregion

    #region gestione eventi

    public event EventHandler eh_resetSelezione;
    public event EventHandler eh_nuovoValore;
    public event EventHandler eh_selValore;

    #endregion

    #region public

    /// <summary>
    /// effettua update del modulo
    /// </summary>
    public void doUpdate()
    {
      resetSelezione();
    }


    #endregion

    #endregion

    #region area codice variabile

    /// <summary>
    /// carico le tabelle
    /// </summary>
    private void caricaTabelle()
    {
    }
    /// <summary>
    /// elenco colonne del datagrid
    /// </summary>
    /// <returns></returns>
    protected DataColumnCollection colonneObj()
    {
      DS_magazzino.V_DettMagPartDataTable tabella = new DS_magazzino.V_DettMagPartDataTable();
      DataColumnCollection colonne = tabella.Columns;
      return colonne;
    }
    /// <summary>
    /// segnalo nuovo valore filtro attivo...
    /// </summary>
    private void checkFixOds()
    {
      grView.DataBind();
    }
    /// <summary>
    /// aggiorno visualizzazione
    /// </summary>
    private void updateOdsDaFiltro()
    {
      grView.DataBind();
    }
    /// <summary>
    /// chiamata post page change gridview
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void grView_PageIndexChanged(object sender, EventArgs e)
    {
      // sistemazione dell'ods post evento cambio pagina
      checkFixOds();
    }
    /// <summary>
    /// chiamata post sort gridview
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void grView_Sorted(object sender, EventArgs e)
    {
      // sistemazione dell'ods post evento sort
      checkFixOds();
    }
    /// <summary>
    /// gestione cambio selezione valore
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void grView_SelectedIndexChanged(object sender, EventArgs e)
    {
      // sollevo evento nuovo valore...
      if (eh_selValore != null)
      {
        eh_selValore(this, new EventArgs());
      }
    }

    /// <summary>
    /// resetta la selezione dei valori in caso di modifiche su altri controlli
    /// </summary>
    public void resetSelezione()
    {
      grView.SelectedIndex = -1;
      grView.DataBind();
      lblWarning.Visible = false;
      if (eh_resetSelezione != null)
      {
        eh_resetSelezione(this, new EventArgs());
      }
    }
    /// <summary>
    /// fornisce verifica se l'udc sia già stato prelevato altrove...
    /// </summary>
    /// <param name="udc"></param>
    /// <returns></returns>
    public bool udcPrelevato(object udc)
    {
      return GMW_data.MagClass.magazzino.taRigheListePrelievo.getPrelevateByUdc(udc.ToString()).Rows.Count > 0;
    }
    /// <summary>
    /// verifica se sia prelevabile
    /// </summary>
    /// <param name="statoPrelevata"></param>
    /// <param name="udc"></param>
    /// <returns></returns>
    public bool prelevaEnabled(object statoPrelevata, object udc)
    {
      bool answ = prelievoEnabled;
      if (prelievoEnabled)
      {
        // controllo se non risulti prelevato l'UDC in un altra lista...
        if (udcPrelevato(udc))
        {
          answ = false;
        }
        else
        {
          try
          {
            answ = !Convert.ToBoolean(statoPrelevata);
          }
          catch
          { }
        }
      }
      return answ;
    }
    /// <summary>
    /// verifica se sia scambiabile
    /// </summary>
    /// <param name="statoPrelevata"></param>
    /// <param name="udc"></param>
    /// <returns></returns>
    public bool scambiaEnabled(object statoPrelevata, object udc)
    {
      bool answ = (intStatoLista <= ((int)statoLista.completata));
      if (answ)
      {
        // controllo se non risulti prelevato l'UDC in un altra lista...
        if (!udcPrelevato(udc))
        {
          answ = false;
        }
        else
        {
          try
          {
            answ = !Convert.ToBoolean(statoPrelevata);
          }
          catch
          { }
        }
      }
      return answ;
    }
    /// <summary>
    /// verifica se sia visibile icona scambia (ovvero UDC utilizzato...)
    /// </summary>
    /// <param name="statoPrelevata"></param>
    /// <param name="udc"></param>
    /// <returns></returns>
    public bool scambiaVisible(object statoPrelevata, object udc)
    {
      bool answ = false;
      // 1° controllo: visibile SOLO se NON completata
      if (intStatoLista < (int)statoLista.completata)
      {
        if (udcPrelevato(udc))
        {
          //answ = true;
          answ = !Convert.ToBoolean(statoPrelevata);
        }
      }
      return answ;
    }
    /// <summary>
    /// verifica se sia editabile
    /// </summary>
    /// <param name="statoPrelevata"></param>
    /// <param name="udc"></param>
    /// <returns></returns>
    public bool editEnabled(object statoPrelevata, object udc)
    {
      bool answ = editRigheEnabled;
      if (editRigheEnabled)
      {
        try
        {
          answ = !Convert.ToBoolean(statoPrelevata);
        }
        catch
        { }
      }
      return answ;
    }
    /// <summary>
    /// verifica se sia cancellabile
    /// </summary>
    /// <param name="statoPrelevata"></param>
    /// <param name="udc"></param>
    /// <returns></returns>
    public bool delEnabled(object statoPrelevata, object udc)
    {
      bool answ = editRigheEnabled;
      if (editRigheEnabled)
      {
        try
        {
          answ = !Convert.ToBoolean(statoPrelevata);
        }
        catch
        { }
      }
      return answ;
    }
    /// <summary>
    /// verifica se sia annullabile il prelievo
    /// </summary>
    /// <param name="annullaPrelevata"></param>
    /// <returns></returns>
    public bool annullaEnabled(object annullaPrelevata)
    {
      bool answ = prelievoEnabled;
      if (prelievoEnabled)
      {
        try
        {
          answ = Convert.ToBoolean(annullaPrelevata);
        }
        catch
        { }
      }
      return answ;
    }
    /// <summary>
    /// verifica se sia annullabile il prelievo
    /// </summary>
    /// <returns></returns>
    public bool nuovoEnabled()
    {
      bool answ = editRigheEnabled;
      return answ;
    }
    /// <summary>
    /// salvo in session che il prox comando è confermare prelievo...
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void imgPrelevato_Click(object sender, ImageClickEventArgs e)
    {
      SteamWare.memLayer.ML.setSessionVal("nextObjCommand", "confermaPrelievo");
    }
    /// <summary>
    /// salvo in session che il prox comando è annullare prelievo...
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void imgAnnullato_Click(object sender, ImageClickEventArgs e)
    {
      SteamWare.memLayer.ML.setSessionVal("nextObjCommand", "annullaPrelievo");
    }
    /// <summary>
    /// salvo in session che il prox comando è confermare prelievo...
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void imgScambia_Click(object sender, ImageClickEventArgs e)
    {
      SteamWare.memLayer.ML.setSessionVal("nextObjCommand", "scambiaFifo");
    }
    /// <summary>
    /// in caso di aggiornamento verifico se sia salvato un comando inizia o completa lista prelievo...
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void grView_RowUpdating(object sender, GridViewUpdateEventArgs e)
    {
      // carico l'idx dell'oggetto
      string codLista = e.Keys["CodLista"].ToString();
      string UDC = e.Keys["UDC"].ToString();
      // quale comando?
      string _comando = "";
      if (SteamWare.memLayer.ML.isInSessionObject("nextObjCommand"))
      {
        _comando = SteamWare.memLayer.ML.StringSessionObj("nextObjCommand");
        SteamWare.memLayer.ML.emptySessionVal("nextObjCommand");
      }
      // verifico il tipo di richiesta (up/down level, clona o update normale
      switch (_comando)
      {
        case "confermaPrelievo":
          // controllo SE sia ancora prelevabile questo UDC...
          if (!udcPrelevato(UDC))
          {
            GMW_data.MagClass.magazzino.confermaUdcPrelevatoPerLista(codLista, UDC);
          }
          updateOdsDaFiltro();
          grView.EditIndex = -1;
          grView.DataBind();
          // sollevo evento nuovo valore...
          if (eh_nuovoValore != null)
          {
            eh_nuovoValore(this, new EventArgs());
          }
          // blocco update!
          e.Cancel = true;
          break;
        case "annullaPrelievo":
          GMW_data.MagClass.magazzino.annullaUdcPrelevatoPerLista(codLista, UDC);
          updateOdsDaFiltro();
          grView.EditIndex = -1;
          grView.DataBind();
          // sollevo evento nuovo valore...
          if (eh_nuovoValore != null)
          {
            eh_nuovoValore(this, new EventArgs());
          }
          // blocco update!
          e.Cancel = true;
          break;
        case "scambiaFifo":
          GMW_data.MagClass.magazzino.scambiaUdcPerLista(codLista);
          updateOdsDaFiltro();
          grView.EditIndex = -1;
          grView.DataBind();
          // sollevo evento nuovo valore...
          if (eh_nuovoValore != null)
          {
            eh_nuovoValore(this, new EventArgs());
          }
          // blocco update!
          e.Cancel = true;
          break;
        default:
          // faccio update!
          break;
      }
    }
    /// <summary>
    /// gestione evento richiesta nuovo valore (mostra footer, ...)
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void btnNew_Click(object sender, EventArgs e)
    {
      GMW_data.MagClass.magazzino.addUdcPerLista(memLayer.ML.StringSessionObj("CodLista_sel"));
      // sollevo evento nuovo valore...
      if (eh_nuovoValore != null)
      {
        eh_nuovoValore(this, new EventArgs());
      }
    }
    /// <summary>
    /// post update...
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void ods_Updated(object sender, ObjectDataSourceStatusEventArgs e)
    {
      // sollevo evento nuovo valore...
      if (eh_nuovoValore != null)
      {
        eh_nuovoValore(this, new EventArgs());
      }
      grView.DataBind();
    }
    /// <summary>
    /// determina se sia permesso modificare le righe di prelievo con altri UDC equivalenti
    /// </summary>
    public bool editRigheEnabled
    {
      get
      {
        return memLayer.ML.BoolSessionObj("editRigheEnabled");
      }
      set
      {
        memLayer.ML.setSessionVal("editRigheEnabled", value, false);
      }
    }
    /// <summary>
    /// determina se le righe di prelievo siano confermabili per prelievo (durante pick-up)
    /// </summary>
    public bool prelievoEnabled
    {
      get
      {
        return memLayer.ML.BoolSessionObj("prelievoEnabled");
      }
      set
      {
        memLayer.ML.setSessionVal("prelievoEnabled", value, false);
      }

    }
    /// <summary>
    /// registra lo stato della lista di prelievo (x controllo visibilità valori)
    /// </summary>
    public int intStatoLista { get; set; }
    /// <summary>
    /// registra il tipo della lista di prelievo (x controllo visibilità valori)
    /// </summary>
    public string codTipoLista { get; set; }
    /// <summary>
    /// salvo parametri x selettore ajax
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void grView_RowEditing(object sender, GridViewEditEventArgs e)
    {
      grView.SelectedIndex = e.NewEditIndex;
      // salvo anche dato x filtraggio udcByPart
      string UDC = "";
      string particolare = "";
      string codLista = "";
      string codTipoLista = "";
      try
      {
        UDC = grView.SelectedDataKey["UDC"].ToString();
        particolare = MagClass.magazzino.taDettUDC.getByFullUdc(UDC, memLayer.ML.StringSessionObj("CodCS"))[0].Particolare;
        codLista = grView.SelectedDataKey["CodLista"].ToString();
        codTipoLista = MagClass.magazzino.taElencoListePrelievo.getByCodLista(codLista)[0].CodTipoLista;
      }
      catch
      { }
      memLayer.ML.setSessionVal("UdcByPart_Particolare", particolare);
      memLayer.ML.setSessionVal("UdcByPart_CodLista", codTipoLista);
    }
    /// <summary>
    /// ridisegno x cancel editing
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void grView_RowCancelingEdit(object sender, GridViewCancelEditEventArgs e)
    {
      // sollevo evento nuovo valore...
      if (eh_nuovoValore != null)
      {
        eh_nuovoValore(this, new EventArgs());
      }
    }
    /// <summary>
    /// ridisegno x eliminazione...
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void grView_RowDeleted(object sender, GridViewDeletedEventArgs e)
    {
      // sollevo evento nuovo valore...
      if (eh_nuovoValore != null)
      {
        eh_nuovoValore(this, new EventArgs());
      }
    }
    /// <summary>
    /// fix visualizzazione post evento gridView
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void grView_RowCommand(object sender, GridViewCommandEventArgs e)
    {
      checkFixOds();
    }

    #endregion

    protected void ods_Updating(object sender, ObjectDataSourceMethodEventArgs e)
    {

    }
    /// <summary>
    /// Imposto valore score minimo x filtrare UDC con NC pending
    /// </summary>
    public int minScoreNC
    {
      get
      {
        int answ = 0;
        Int32.TryParse(hfMinScoreNC.Value, out answ);
        return answ;
      }
      set
      {
        hfMinScoreNC.Value = value.ToString();
      }
    }
  }
}