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_statoMagLogico : 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>
        /// resetta la selezione dei valori in caso di modifiche su altri controlli
        /// </summary>
        public void resetSelezione()
        {
            SteamWare.memLayer.ML.emptySessionVal(string.Format("{0}_sel", _idxGridView));
            grView.SelectedIndex = -1;
            grView.DataBind();
            lblWarning.Visible = false;
            if (eh_resetSelezione != null)
            {
                eh_resetSelezione(this, new EventArgs());
            }
        }

        /// <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


        protected int maxNumCelle = 1000;
        /// <summary>
        /// larghezza max in pixel della barra + lunga tra quelle da plottare
        /// </summary>
        protected int larghPixel = 150;

        /// <summary>
        /// carico le tabelle
        /// </summary>
        private void caricaTabelle()
        {
        }
        /// <summary>
        /// elenco colonne del datagrid
        /// </summary>
        /// <returns></returns>
        protected DataColumnCollection colonneObj()
        {
            DS_magazzino.V_MagazziniOverviewDataTable tabella = new DS_magazzino.V_MagazziniOverviewDataTable();
            DataColumnCollection colonne = tabella.Columns;
            return colonne;
        }
        /// <summary>
        /// inizializzazione valori di default
        /// </summary>
        /// <param name="e"></param>
        protected override void OnInit(EventArgs e)
        {
            base.OnInit(e);
            _idxGridView = "IdxBlocco";
            mod_filtroMag.eh_selValore += new EventHandler(mod_filtroMag_eh_selValore);
        }

        protected override void Page_Load(object sender, EventArgs e)
        {
            base.Page_Load(sender, e);
            if (!Page.IsPostBack)
            {
                if (_paginaPrecedente == "DettaglioBlocco.aspx")
                {
                    svuotaVariabili();
                }
                mod_filtroMag.ods = odsFiltroMag;
                // imposto corretto valore x filtro Mag
                if (memLayer.ML.isInSessionObject("CodMagLogico_sel"))
                {
                    mod_filtroMag.valore = memLayer.ML.StringSessionObj("CodMagLogico_sel");
                }
                else
                {
                    mod_filtroMag.reset();
                }
                checkFixOds();
            }
        }

        void mod_filtroMag_eh_selValore(object sender, EventArgs e)
        {
            // chiamo procedura che aggiorna ods principale
            checkFixOds();
        }
        /// <summary>
        /// segnalo nuovo valore filtro attivo...
        /// </summary>
        private void checkFixOds()
        {
            // determino cosa filtrare nella filter expression...
            if (mod_filtroMag.valore != "*")
            {
                ods.FilterExpression = string.Format(" CodMagLogico = '{0}' ", mod_filtroMag.valore);
                // salvo il valore del numero di celle max x poter scalare correttamente i barplot
                try
                {
                    maxNumCelle = MagClass.magazzino.taMagOverw.getMaxCelleByMag(memLayer.ML.StringSessionObj("CodCS"), mod_filtroMag.valore)[0].TotCelle;
                }
                catch
                {
                    maxNumCelle = 1;
                }
            }
            else
            {
                ods.FilterExpression = "";
                // salvo il valore del numero di celle max x poter scalare correttamente i barplot
                try
                {
                    maxNumCelle = MagClass.magazzino.taMagOverw.getMaxCelle(memLayer.ML.StringSessionObj("CodCS"))[0].TotCelle;
                }
                catch
                {
                    maxNumCelle = 1;
                }
            }
            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>
        /// costruisce un dataset di valori da passare al controllo mod_BarPlot
        /// </summary>
        /// <param name="tipoPlot"></param>
        /// <param name="_valTot"></param>
        /// <param name="_valQuota"></param>
        /// <returns></returns>
        public SteamWare.DataType.DatoBarPlot[] getElencoValori(object tipoPlot, object _valTot, object _valQuota)
        {
            SteamWare.DataType.DatoBarPlot[] elenco = new SteamWare.DataType.DatoBarPlot[2];
            if (tipoPlot.ToString() == "numCelle")
            {
                // carico dati dimensione magazzino e celle attive...
                int celleAttive = Convert.ToInt32(_valQuota);
                int celleBloccate = Convert.ToInt32(_valTot) - celleAttive;
                int pxCelleAttive = Convert.ToInt32(Math.Round((double)celleAttive / maxNumCelle * larghPixel, 0));
                int pxCelleBloccate = Convert.ToInt32(Math.Round((double)celleBloccate / maxNumCelle * larghPixel, 0));
                float percCelleAttive = (float)celleAttive / (celleAttive + celleBloccate);
                float percCelleBloccate = (float)celleBloccate / (celleAttive + celleBloccate);
                elenco[0] = new SteamWare.DataType.DatoBarPlot(string.Format("{0:##%}", percCelleAttive), pxCelleAttive, "sg", string.Format("{0:##%} celle attive", percCelleAttive));
                elenco[1] = new SteamWare.DataType.DatoBarPlot(string.Format("{0:##%}", percCelleBloccate), pxCelleBloccate, "ss", string.Format("{0:##%} celle bloccate", percCelleBloccate));
            }
            else
            {
                // carico dati celle libere/occupate...
                int celleOccupate = Convert.ToInt32(_valQuota);
                int celleLibere = Convert.ToInt32(_valTot) - celleOccupate;
                int pxCelleOcc = Convert.ToInt32(Math.Round((double)celleOccupate / maxNumCelle * larghPixel, 0));
                int pxCelleLib = Convert.ToInt32(Math.Round((double)celleLibere / maxNumCelle * larghPixel, 0));
                float percCelleOcc = (float)celleOccupate / (celleOccupate + celleLibere);
                float percCelleLib = (float)celleLibere / (celleOccupate + celleLibere);
                elenco[0] = new SteamWare.DataType.DatoBarPlot(string.Format("{0:##%}", percCelleOcc), pxCelleOcc, "sr", string.Format("{0:##%} celle occupate", percCelleOcc));
                elenco[1] = new SteamWare.DataType.DatoBarPlot(string.Format("{0:##%}", percCelleLib), pxCelleLib, "sv", string.Format("{0:##%} celle libere", percCelleLib));
            }
            return elenco;
        }
        /// <summary>
        /// gestione cambio selezione valore
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void grView_SelectedIndexChanged(object sender, EventArgs e)
        {
            svuotaVariabili();
            // salvo in session il valore selezionato...
            SteamWare.memLayer.ML.setSessionVal(string.Format("{0}_sel", _idxGridView), grView.SelectedValue, true);
            // salvo anche codMag...
            string codMag = MagClass.magazzino.taBlocchi.getByIdx(Convert.ToInt32(grView.SelectedValue))[0].CodMag;
            SteamWare.memLayer.ML.setSessionVal("CodMag_sel", codMag, true);
            memLayer.ML.setSessionVal("CodMagLogico_sel", grView.SelectedDataKey["CodMagLogico"].ToString());
            // sollevo evento nuovo valore...
            if (eh_selValore != null)
            {
                eh_selValore(this, new EventArgs());
            }
        }
        /// <summary>
        /// effettua svuotamento delle variabili pre-caricate
        /// </summary>
        private static void svuotaVariabili()
        {
            // svuoto altre variabili...
            memLayer.ML.emptySessionVal("IdxCellaMag");
            memLayer.ML.emptySessionVal("Particolare_sel");
            memLayer.ML.emptySessionVal("DescStato_sel");
            memLayer.ML.emptySessionVal("Esponente_sel");
            memLayer.ML.emptySessionVal("CodMagLogico_sel");
            memLayer.ML.emptySessionVal("CodMag_sel");
        }

        #endregion
    }
}