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

namespace GMW.WebUserControls
{
    public partial class mod_PostProveMecc : System.Web.UI.UserControl
    {
        /// <summary>
        /// evento richiesta update
        /// </summary>
        public event EventHandler eh_reqUpdate;
        /// <summary>
        /// Codice attributo da salvare x Prove Meccaniche
        /// </summary>
        protected string CodAttr = "PM";
        /// <summary>
        /// Numero Trattamento (già deliberato)
        /// </summary>
        protected string NumTT_Delib
        {
            get
            {
                return lblNtDelib.Text.Trim();
            }
            set
            {
                lblNtDelib.Text = value;
            }
        }
        /// <summary>
        /// Numero Trattamento (NON ANCORA deliberato)
        /// </summary>
        protected string NumTT_NoDelib
        {
            get
            {
                return lblNtNoDelib.Text.Trim();
            }
            set
            {
                lblNtNoDelib.Text = value;
            }
        }
        /// <summary>
        /// EsitoPM
        /// </summary>
        public bool EsitoPM
        {
            get
            {
                return chkPrMecc.Checked;
            }
            set
            {
                chkPrMecc.Checked = value;
            }
        }
        /// <summary>
        /// caricamento pagina
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!Page.IsPostBack)
            {
                resetIN();
                Postazione.messaggiText = "";
                Postazione.warningText = "";
            }
            checkBarcode();
        }
        /// <summary>
        /// resetta input
        /// </summary>
        private void resetIN()
        {
            grViewDPM.SelectedIndex = -1;
            grViewTT.SelectedIndex = -1;
            barcodeIn = "";
            NumTT_Delib = "";
            NumTT_NoDelib = "";
            EsitoPM = false;
        }
        /// <summary>
        /// wrapper traduzione
        /// </summary>
        /// <param name="lemma"></param>
        /// <returns></returns>
        public string traduci(object lemma)
        {
            return user_std.UtSn.Traduci(lemma.ToString());
        }
        /// <summary>
        /// valore barcode
        /// </summary>
        public string barcodeIn
        {
            get
            {
                return txtBarcode.Text.Trim();
            }
            set
            {
                txtBarcode.Text = value;
            }
        }
        /// <summary>
        /// Verifica l'AL se sia ok x procedere:
        /// - Tipo "T"
        /// - Attivo
        /// </summary>
        /// <param name="AL"></param>
        /// <returns></returns>
        protected bool checkAL(string AL)
        {
            bool answ = false;
            try
            {
                answ = MagClass.magazzino.taEA.getByAL_TipoAttivo(AL, "T").Rows.Count > 0;
            }
            catch
            { }
            if (!answ)
            {
                Postazione.warningText = traduci("ErroreAlNonTtAttivo");
                Postazione.CssClass = "stileComandoKo";
            }
            else
            {
                Postazione.warningText = "";
                Postazione.CssClass = "stileComandoOk";
            }
            return answ;
        }
        /// <summary>
        /// controlla se ci sia un barcode
        /// </summary>
        private void checkBarcode()
        {
            /**********************************
             * check barcode deve funzionare così:
             * - accetta reset
             * - cerca in TUTTI i trattamenti se sia valido codice BCode / manuale (fare che select laterale seleziona stesso valore)
             * - se è in DPM (già deliberato) filtro li (e nascondo tutto su TT da deliberare)
             * - se è TT non deliberati al contrario mostro li e non in DPM (sempre con filtro su ods)
             * - mostro txt x inserire valore della PM
             * - mostro button deliberare
             * - post delibera aggiorno (togliendo filtri e selezioni valori)
             * 
             * nb: 
             * - delibere in ordine cronologico DESC
             * - trattamenti FIFO (ASC)
             * 
             * */

            if (barcodeIn != "")
            {
                Postazione.messaggiText = string.Format("{0}: {1}", traduci("BCodeIns"), barcodeIn);
                switch (MagClass.tipoBCode_L5(barcodeIn))
                {
                    case tipoCodiceBarcode.AL:
                        // verifico AL
                        if (checkAL(barcodeIn))
                        {
                            // calcolo TT
                            NumTT_NoDelib = MagClass.magazzino.taET.getByAL(barcodeIn)[0].Trattamento;
                            // lo imposto come source o dest...
                            NumTT_Delib = NumTT_NoDelib;
                        }
                        doUpdate();
                        break;
                    case tipoCodiceBarcode.TT:
                        // imposto il trattamento termico nei 2 filtri...
                        NumTT_NoDelib = barcodeIn;
                        NumTT_Delib = barcodeIn;
                        break;
                    case tipoCodiceBarcode.Comando:
                        // se è reset cancello tutto!
                        if (barcodeIn == memLayer.ML.cdv("cmdReset"))
                        {
                            resetIN();
                            Postazione.messaggiText = "";
                            Postazione.warningText = "";
                            doUpdate();
                        }
                        Postazione.CssClass = "stileAttesa";
                        break;
                    default:
                        Postazione.messaggiText = "";
                        Postazione.warningText = traduci("ERR-UNK-001");
                        Postazione.CssClass = "stileComandoND";
                        break;
                }
                barcodeIn = "";
            }
            else
            {
                Postazione.messaggiText = traduci("AttesaBCode");
                Postazione.CssClass = "stileAttesa";
            }
            doUpdate();
        }
        /// <summary>
        /// aggiorna componenti + focus a barcode
        /// </summary>
        public void doUpdate()
        {
            grViewDPM.DataBind();
            grViewTT.DataBind();
            updateBtns();
            // raise dell'evento
            if (eh_reqUpdate != null)
            {
                eh_reqUpdate(this, new EventArgs());
            }
            // determino focus a seconda di cosa ho già in selezione..
            if (EsitoPM)
            {
                lbtDeliberaPM.Focus();
            }
            else
            {
                if (NumTT_Delib != "" || NumTT_NoDelib != "")
                {
                    chkPrMecc.Focus();
                }
                else
                {
                    txtBarcode.Focus();
                }
            }
        }
        /// <summary>
        /// fix visibilità btnStampa
        /// </summary>
        private void updateBtns()
        {
            if (EsitoPM)
            {
                chkPrMecc.Text = "OK";
                lblChec.Attributes.Remove("class");
                lblChec.Attributes.Add("class", "btn btn-success");
            }
            else
            {
                chkPrMecc.Text = "KO";
                lblChec.Attributes.Remove("class");
                lblChec.Attributes.Add("class", "btn btn-danger");
            }
            // posso vedere esito PM se ho un numero tratt
            bool btnVis = (NumTT_Delib != "" || NumTT_NoDelib != "");
            divEsitoPM.Visible = btnVis;
            lbtnResetNoPM.Visible = btnVis;
            lbtnResetPM.Visible = btnVis;
            divDelibera.Visible = btnVis;
        }
        /// <summary>
        /// salva/aggiorna delibera di un TT
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void lbtDeliberaPM_Click(object sender, EventArgs e)
        {
            // salva delibera PM con update
            string numTratt = "";
            if (NumTT_Delib != "")
            {
                numTratt = NumTT_Delib;
            }
            else if (NumTT_NoDelib != "")
            {
                numTratt = NumTT_NoDelib;
            }
            MagClass.magazzino.taET.updatePM(numTratt, Convert.ToInt32(EsitoPM), DateTime.Now, MagClass.magazzino.CodSoggCurrUser);
            // svuota selezioni delibere
            resetIN();
            Postazione.CssClass = "stileAttesa";
            Postazione.warningText = "";
            Postazione.messaggiText = traduci("ValorePmAggiornato");
            doUpdate();
        }
        /// <summary>
        /// inserito num trattamento
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void txtNumTratt_TextChanged(object sender, EventArgs e)
        {
            doUpdate();
        }
        /// <summary>
        /// modificata durezza
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void chkPrMecc_CheckedChanged(object sender, EventArgs e)
        {
            doUpdate();
        }
        /// <summary>
        /// recupero dati del trattamento già salvato e msotro x editing
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void grViewDPM_SelectedIndexChanged(object sender, EventArgs e)
        {
            NumTT_Delib = grViewDPM.SelectedDataKey["Trattamento"].ToString();
            NumTT_NoDelib = NumTT_Delib;
            barcodeIn = NumTT_Delib;
            //grViewDPM.SelectedIndex = -1;
            checkBarcode();
        }
        /// <summary>
        /// recupero dati del trattamento x salvare nuovo
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void grViewTT_SelectedIndexChanged(object sender, EventArgs e)
        {
            NumTT_NoDelib = grViewTT.SelectedDataKey["Trattamento"].ToString();
            NumTT_Delib = NumTT_NoDelib;
            barcodeIn = NumTT_NoDelib;
            //grViewTT.SelecktedIndex = -1;
            checkBarcode();
        }
        /// <summary>
        /// reset selezione AL non deliberato
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void lbtnResetNoPM_Click(object sender, EventArgs e)
        {
            NumTT_Delib = "";
            NumTT_NoDelib = "";
            doUpdate();
        }
        /// <summary>
        /// reset selezione AL già deliberato
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void lbtnResetPM_Click(object sender, EventArgs e)
        {
            NumTT_Delib = "";
            NumTT_NoDelib = "";
            doUpdate();
        }


    }
}