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

namespace GMW.WebUserControls
{
    public partial class mod_assegnaNC : System.Web.UI.UserControl
    {
        /// <summary>
        /// caricamento pagina!
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!Page.IsPostBack)
            {
                mod_righePag.numRowPag = memLayer.ML.cdvi("_righeDataGridShort");
                grView.PageSize = mod_righePag.numRowPag;
                ddlSelTipo.DataBind();
                rebindPart();
                fixSelections();
                showEffects();
            }
            // aggancio eventi
            mod_selPeriodo.eh_doUpdate += mod_selPeriodo_eh_doUpdate;
            mod_righePag.eh_newNum += mod_righePag_eh_newNum;
        }

        private void rebindPart()
        {
            ddlSelPart.Items.Clear();
            ListItem selAll = new ListItem("-- Tutti --", "*");
            ddlSelPart.Items.Add(selAll);
            try
            {
                // rifaccio bind dati ddlParticolare...
                ddlSelPart.DataBind();
            }
            catch
            {
            }
        }
        /// <summary>
        /// aggiorna informazioni sull'IMPATTO (come UDC child) della selezione
        /// </summary>
        private void showEffects()
        {
            // calcolo num UDC
            try
            {
                lblNumUdcAnc.Text = string.Format("Udc selezionati: <b>{0}</b>", DataProxy.obj.taUDC2NC.getByIdxNc(idxNcSel).Rows.Count);
                lblNumUdcChild.Text = string.Format("Udc totali: <b>{0}</b>", DataProxy.obj.taUNCTree.GetData(idxNcSel).Rows.Count);
                mod_elencoUNC.doUpdate();
            }
            catch
            {
                lblNumUdcAnc.Text = "";
                lblNumUdcChild.Text = "";
                mod_elencoUNC.doUpdate();
            }
            grView.DataBind();
        }

        void mod_righePag_eh_newNum(object sender, EventArgs e)
        {
            grView.PageSize = mod_righePag.numRowPag;
        }
        /// <summary>
        /// sistema selezione da valori db della NC corrente
        /// </summary>
        private void fixSelections()
        {
            if (idxNcSel > 0)
            {
                DS_Applicazione.ElencoNCRow riga = DataProxy.obj.taENC.getByKey(idxNcSel)[0];
                try
                {
                    // salvo note...
                    NoteNC = riga.SearchNote;
                    // recupero dati e imposto filtri...
                    txtSearch.Text = riga.SearchNote;
                    if (riga.TipoCart != "") ddlSelTipo.SelectedValue = riga.TipoCart;
                //}
                //catch
                //{ }
                //try
                //{
                    if (riga.Particolare != "") ddlSelPart.SelectedValue = riga.Particolare;
                //}
                //catch
                //{ }
                //try
                //{
                    intervalloDate intervallo = new intervalloDate();
                    intervallo.inizio = riga.DataFrom;
                    intervallo.fine = riga.DataTo;
                    mod_selPeriodo.intervalloAnalisi = intervallo;
                    mod_selPeriodo.doUpdate(false);
                    // salvo editabilità della NC corrente...
                    editEnabled = !riga.IsCompl;
                    // imposto se sia modificabile lo stato
                    lbEdit.Visible = editEnabled;
                    fixEditFilt();
                    // filtro modificabile solo se è editabile e se è in modalità modifica...
                    fixCtrlFilt();
                    // definisco visibilità buttons completa/stampa in base a stato chiusura
                    lbConfermaNC.Visible = editEnabled;
                    lbPrint.Visible = !editEnabled;
                }
                catch
                { }
            }
        }
        /// <summary>
        /// sistema i controlli di filtraggio UDC
        /// </summary>
        private void fixCtrlFilt()
        {
            // imposto controlli selezione (abilitati o meno)
            mod_selPeriodo.editEnabled = editEnabled && modFiltEnab;
            ddlSelTipo.Enabled = editEnabled && modFiltEnab;
            ddlSelPart.Enabled = editEnabled && modFiltEnab;
            txtSearch.Enabled = editEnabled && modFiltEnab;
        }
        /// <summary>
        /// verifica se edit della NC sia permesso, controllando lo stato da DB (SE NON in sessione)
        /// </summary>
        public bool editEnabled
        {
            get
            {
                return memLayer.ML.BoolSessionObj(string.Format("NC_{0}", idxNcSel));
            }
            set
            {
                memLayer.ML.setSessionVal(string.Format("NC_{0}", idxNcSel), value);
            }
        }
        /// <summary>
        /// RicercaSel
        /// </summary>
        public string NoteNC
        {
            get
            {
                return memLayer.ML.StringSessionObj("NoteNC");
            }
            set
            {
                memLayer.ML.setSessionVal("NoteNC", value);
            }
        }
        /// <summary>
        /// idxNC selezionato
        /// </summary>
        public int idxNcSel
        {
            get
            {
                return memLayer.ML.QSI("idxNC");
            }
        }
        void mod_selPeriodo_eh_doUpdate(object sender, EventArgs e)
        {
            lbSave.Visible = true;
        }
        /// <summary>
        /// fa update...
        /// </summary>
        public void doUpdate()
        {
            lbSave.Visible = false;
            // aggiorna selezione effettuata (numero records, ...)
            fixSelections();
            showEffects();
        }
        /// <summary>
        /// wrapper traduzione
        /// </summary>
        /// <param name="lemma"></param>
        /// <returns></returns>
        public string traduci(object lemma)
        {
            return user_std.UtSn.Traduci(lemma.ToString());
        }
        /// <summary>
        /// selezionato particolare
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void ddlSelPart_SelectedIndexChanged(object sender, EventArgs e)
        {
            lbSave.Visible = true;
        }
        protected void ddlSelTipo_SelectedIndexChanged(object sender, EventArgs e)
        {
            rebindPart();
            lbSave.Visible = true;
        }
        /// <summary>
        /// seleziona/deseleziona le righe indicate...
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void btnSelAll_Click(object sender, EventArgs e)
        {
            // seleziono tutti i valori visibili nel datagrid
            CheckBox chkbox = ((CheckBox)sender);
            bool isChecked = chkbox.Checked;
            if (!isChecked)
            {
                chkbox.ToolTip = traduci("btnSelAll");
            }
            else
            {
                chkbox.ToolTip = traduci("btnDeselAll");
            }
            foreach (GridViewRow riga in grView.Rows)
            {
                ((CheckBox)riga.FindControl("chkSelect")).Checked = isChecked;
            }
            fixShowSalvaSel(true);
        }
        /// <summary>
        /// sistemo visualizzazione salvataggio selezioni/cancel...
        /// </summary>
        /// <param name="btnSave"></param>
        private void fixShowSalvaSel(bool btnSave)
        {
            lbSaveSel.Visible = btnSave;
            lbCancel.Visible = btnSave;
        }
        /// <summary>
        /// salva nuovo filtraggio
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void lbSave_Click(object sender, EventArgs e)
        {
            salvaFilt();
        }
        /// <summary>
        /// salva elenco selezioni UDC
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void lbSaveSel_Click(object sender, EventArgs e)
        {
            // ciclo grView e salvo le righe selezionate, e cancello le EVENTUALI deselezionate
            DateTime start;
            foreach (GridViewRow riga in grView.Rows)
            {
                if (((CheckBox)riga.FindControl("chkSelect")).Visible)
                {
                    start = DateTime.Now;
                    // recupero codice UDC...
                    string UDC = ((Label)riga.FindControl("lblUDC")).Text;
                    // chiamo toggle selezione...
                    DataProxy.obj.taUDC2NC.toggleSel(idxNcSel, UDC, ((CheckBox)riga.FindControl("chkSelect")).Checked);
                }
            }
            grView.DataBind();
            fixShowSalvaSel(false);
            showEffects();
        }
        /// <summary>
        /// annulla modifiche selezione
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void lbCancel_Click(object sender, EventArgs e)
        {
            grView.SelectedIndex = -1;
            grView.DataBind();
            fixShowSalvaSel(false);
        }
        /// <summary>
        /// salva e CONGELA la NC
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void lbConfermaNC_Click(object sender, EventArgs e)
        {
            DataProxy.obj.taENC.updCompleta(idxNcSel, true);
            // associo NC a TUTTI i cartellini interessati (IdxNC)
            bool assSpediti = memLayer.ML.CRB("assSpediti");
            bool assConsumati = memLayer.ML.CRB("assConsumati");
            DataProxy.obj.taUNCTree.assignAttr(idxNcSel, assSpediti, assConsumati, MagClass.magazzino.CodSoggCurrUser);
            fixSelections();
            showEffects();
            grView.DataBind();
        }
        /// <summary>
        /// (ri)stampa la NC
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void lbPrint_Click(object sender, EventArgs e)
        {
            // effettua stampa di TUTTI gli UDC compresi (TRANNE quelli in carico a postazioni in IN/OUT che saranno poi stampati...)
            // recupero elenco UDC... SOLO SE NON CARICATI IN POSTAZIONE
            bool prtSpediti = memLayer.ML.CRB("prtSpediti");
            bool prtConsumati = memLayer.ML.CRB("prtConsumati");
            try
            {
                DS_Applicazione.UNC_treeDataTable tab = DataProxy.obj.taUNCTree.getByAttrNC(idxNcSel, prtSpediti, prtConsumati);
                // stampo!
                foreach (DS_Applicazione.UNC_treeRow riga in tab)
                {
                    MagClass.magazzino.ristampaUdc(riga.UDC, Postazione.printer, Request.UserHostName);
                }
            }
            catch (Exception exc)
            {
                logger.lg.scriviLog(exc.ToString(), tipoLog.EXCEPTION);
            }
        }
        /// <summary>
        /// mostro dettaglio UNC
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void lbShowUNC_Click(object sender, EventArgs e)
        {
            mod_elencoUNC.Visible = !mod_elencoUNC.Visible;
        }
        /// <summary>
        /// salvo il nuovo filtraggio...
        /// </summary>
        private void salvaFilt()
        {
            DataProxy.obj.taENC.updFilt(ddlSelTipo.SelectedValue, mod_selPeriodo.intervalloAnalisi.inizio, mod_selPeriodo.intervalloAnalisi.fine, ddlSelPart.SelectedValue, txtSearch.Text.Trim(), idxNcSel);
            // elimino la selezione UDC...
            DataProxy.obj.taUDC2NC.removeSelNC(idxNcSel.ToString());
            //lbSave.Visible = false;
            doUpdate();
            // toggle modificabilità filtro SE PERMESSO
            modFiltEnab = false;
            doUpdate();
            fixEditFilt();
            fixCtrlFilt();
        }

        protected void txtSearch_TextChanged(object sender, EventArgs e)
        {
            NoteNC = txtSearch.Text.Trim();
            lbSave.Visible = true;
        }

        protected void chkSelect_CheckedChanged(object sender, EventArgs e)
        {
            // mostro pulsante salvataggio...
            fixShowSalvaSel(true);
        }
        /// <summary>
        /// determina se la modifica filtro sia abilitata
        /// </summary>
        public bool modFiltEnab
        {
            get
            {
                bool answ = false;
                try
                {
                    answ = Convert.ToBoolean(hfModFilEnab.Value);
                }
                catch
                { }
                return answ;
            }
            set
            {
                hfModFilEnab.Value = value.ToString();
            }
        }
        /// <summary>
        /// toggle editabilità filtro ricerca
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void lbEdit_Click(object sender, EventArgs e)
        {
            // toggle modificabilità filtro SE PERMESSO
            modFiltEnab = !modFiltEnab;
            // se sta annullando filtro RICARICO...
            if (!modFiltEnab)
            {
                doUpdate();
            }
            fixEditFilt();
            fixCtrlFilt();
        }
        /// <summary>
        /// sistemo button x passare da modifica ad annullamento dei filtri
        /// </summary>
        private void fixEditFilt()
        {
            string testoBtn = traduci("doEditFilt");
            string iconEditCss = "fa fa-edit fa-2x shortcut-icon";
            if (modFiltEnab)
            {
                testoBtn = traduci("cancEditFilt");
                iconEditCss = "fa fa-refresh fa-2x shortcut-icon";
            }
            lblEditFilt.Text = testoBtn;
            icnEdit.Attributes.Remove("class");
            icnEdit.Attributes.Add("class", iconEditCss);
        }
    }
}