using AppData;
using NKC_SDK;
using System;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace NKC_WF.WebUserControls
{
    public partial class cmp_batchList : BaseUserControl
    {
        #region Protected Properties

        /// <summary>
        /// BatchId selezionato
        /// </summary>
        protected int BatchIdSel
        {
            get
            {
                int answ = 0;
                if (grView.SelectedValue != null)
                {
                    int.TryParse(grView.SelectedValue.ToString(), out answ);
                }
                return answ;
            }
        }

        /// <summary>
        /// Status corrente del batch
        /// </summary>
        protected BatchStatus CurrBatchStatus
        {
            get
            {
                return ComLib.BStatus(BatchIdSel);
            }
        }

        protected int currSelRow
        {
            get
            {
                return grView.SelectedIndex;
            }
            set
            {
                grView.SelectedIndex = value;
            }
        }

        protected int lastSelRow
        {
            get
            {
                int answ = -1;
                if (!string.IsNullOrEmpty(hfLastSelRow.Value))
                {
                    int.TryParse(hfLastSelRow.Value, out answ);
                }
                return answ;
            }
            set
            {
                hfLastSelRow.Value = value.ToString();
            }
        }

        #endregion Protected Properties

        #region Public Properties

        public bool deleteEnabled
        {
            get
            {
                bool answ = false;
                bool.TryParse(hfDeleteEnabled.Value, out answ);
                return answ;
            }
            set
            {
                hfDeleteEnabled.Value = value.ToString();
            }
        }

        /// <summary>
        /// modalità funzionamento controllo
        /// </summary>
        public BatchListMode listMode { get; set; } = BatchListMode.Standard;

        #endregion Public Properties

        #region Private Methods

        /// <summary>
        /// In base al modo richiesto imposta filtraggi...
        /// </summary>
        private void checkFixMode()
        {
            ListItem currItem = null;
            int valore = -100;
            if (listMode == BatchListMode.Standard)
            {
                foreach (var item in ddlStatus.Items)
                {
                    try
                    {
                        currItem = (ListItem)item;
                        int.TryParse(currItem.Value, out valore);
                        if (valore > 7)
                        {
                            currItem.Enabled = false;
                        }
                    }
                    catch
                    { }
                }
            }
            else
            {
                foreach (var item in ddlStatus.Items)
                {
                    try
                    {
                        currItem = (ListItem)item;
                        int.TryParse(currItem.Value, out valore);
                        if (valore < 8 && valore >= 0)
                        {
                            currItem.Enabled = false;
                        }
                    }
                    catch
                    { }
                }
            }
        }

        private void checkFixOds()
        {
            string isPartVal = "";
            switch (listMode)
            {
                case BatchListMode.PartsEval:
                    isPartVal = "1";
                    break;

                case BatchListMode.FileEval:
                    isPartVal = "2";
                    break;

                case BatchListMode.FullHistory:
                    isPartVal = "3";
                    ods.FilterExpression = "";
                    break;

                case BatchListMode.Standard:
                default:
                    isPartVal = "0";
                    break;
            }
            hfPartValid.Value = isPartVal;
        }

        private void Cmp_batchDetail_eh_doRefresh(object sender, EventArgs e)
        {
            resetSelezione();
        }

        private void Cmp_numRow_eh_doRefresh(object sender, EventArgs e)
        {
            // recupero num righe ed aggiorno...
            grView.PageSize = cmp_numRow.numRow;
            checkFixOds();
            grView.DataBind();
        }

        private void fixDetails()
        {
            lastSelRow = currSelRow;
            divDetail.Visible = currSelRow >= 0;
            if (divDetail.Visible)
            {
                // recupero BatchId selezionato
                cmp_batchDetail.BatchId = 0;
                cmp_batchDetail.BatchId = BatchIdSel;
                cmp_batchDetail.doUpdate();
                updPanelDetail.Update();
            }
        }

        private void resetSelezione()
        {
            checkFixOds();
            grView.SelectedIndex = -1;
            lastSelRow = -1;
            grView.DataBind();
            divDetail.Visible = false;
            updPanelDetail.Update();
            raiseReset();
        }

        #endregion Private Methods

        #region Protected Methods

        protected void chkShowSplit_CheckedChanged(object sender, EventArgs e)
        {
            // deseleziono...
            resetSelezione();
        }

        protected void ddlStatus_SelectedIndexChanged(object sender, EventArgs e)
        {
            checkFixOds();
        }

        protected void grView_PageIndexChanged(object sender, EventArgs e)
        {
            checkFixOds();
        }

        protected void grView_SelectedIndexChanged(object sender, EventArgs e)
        {
            fixDetails();
        }

        protected void lbRedoEval_Click(object sender, EventArgs e)
        {
            LinkButton lbt = (LinkButton)sender;
            if (!string.IsNullOrEmpty(lbt.CommandArgument))
            {
                // eseguo richiesta reset
                DLMan.taBL.redoPartValid(lbt.CommandArgument);
                // eventualmente mando primo batch da validare...
                bool newValidSent = ComLib.sendFirstValidationBatch();
                // refresh!
                resetSelezione();
            }
        }

        protected void lbtDisableDel_Click(object sender, EventArgs e)
        {
            deleteEnabled = false;
            resetSelezione();
        }

        protected void lbtEnableDel_Click(object sender, EventArgs e)
        {
            deleteEnabled = true;
            resetSelezione();
        }

        /// <summary>
        /// comando reset
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void lbtReset_Click(object sender, EventArgs e)
        {
            resetSelezione();
        }

        /// <summary>
        /// Caricamento pagina
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!Page.IsPostBack)
            {
                deleteEnabled = false;
                cmp_numRow.numRow = 25;
                grView.PageSize = cmp_numRow.numRow;
                divDetail.Visible = false;
                // in base al ListMode decido cosa mostrare...
                checkFixOds();
                checkFixMode();
            }
            cmp_batchDetail.eh_doRefresh += Cmp_batchDetail_eh_doRefresh;
            cmp_numRow.eh_doRefresh += Cmp_numRow_eh_doRefresh;
        }

        protected void Timer1_Tick(object sender, EventArgs e)
        {
            doUpdate();
        }

        #endregion Protected Methods

        #region Public Methods

        /// <summary>
        /// Converte il codice stato in effettivo campo
        /// </summary>
        /// <param name="_status"></param>
        /// <returns></returns>
        public string BStatus(object _status)
        {
            string answ = ComLib.BatchStatusDescr(_status);
            return answ;
        }

        /// <summary>
        /// Codice CSS in base a status...
        /// </summary>
        /// <param name="_status"></param>
        /// <returns></returns>
        public string cssByStatus(object _status)
        {
            string answ = "text-muted";
            int status = -1;
            int.TryParse(_status.ToString(), out status);
            switch (status)
            {
                case 1:
                    answ = "font-weight-bold text-info";
                    break;

                case 2:
                    answ = "font-weight-bold text-primary";
                    break;

                case 3:
                    answ = "font-weight-bold text-warning";
                    break;

                case 4:
                    answ = "font-weight-bold text-danger";
                    break;

                case 5:
                    answ = "font-weight-bold text-success";
                    break;

                case 6:
                    answ = "font-weight-bold text-secondary";
                    break;

                default:
                    break;
            }
            return answ;
        }

        /// <summary>
        /// Codice CSS in base a BatchType...
        /// </summary>
        /// <param name="_BatchType"></param>
        /// <returns></returns>
        public string cssIconByType(object _BatchType)
        {
            string answ = "fa fa-circle-thin";
            int status = -1;
            int.TryParse(_BatchType.ToString(), out status);
            switch (status)
            {
                case 0:
                    answ = "fa fa-file-text-o";
                    break;

                case 1:
                    answ = "fa fa-file-text";
                    break;

                case 2:
                    answ = "fa fa-scissors";
                    break;

                default:
                    break;
            }
            return answ;
        }

        public void doUpdate()
        {
            checkFixOds();
            grView.DataBind();
            currSelRow = lastSelRow;
            var currBStatus = CurrBatchStatus;
            // solo se il batch è in fase di stima/nesting...
            if (currBStatus == BatchStatus.NestRequested || currBStatus == BatchStatus.EstimationRequested)
            {
                fixDetails();
            }
        }

        /// <summary>
        /// Determina se sia visibile previewin base a BatchType...
        /// </summary>
        /// <param name="_BatchType"></param>
        /// <returns></returns>
        public bool hasPreviewByType(object _BatchType)
        {
            bool answ = false;
            int status = -1;
            int.TryParse(_BatchType.ToString(), out status);
            switch (status)
            {
                case 0:
                case 2:
                    answ = true;
                    break;

                case 1:
                default:
                    answ = false;
                    break;
            }
            return answ;
        }

        /// <summary>
        /// Verifica se sia visualizzabile preview dato stato
        /// </summary>
        /// <param name="_status"></param>
        /// <returns></returns>
        public bool isPreviewVisible(object _status)
        {
            bool answ = false;
            int status = -1;
            int.TryParse(_status.ToString(), out status);
            // solo stati 4 (nesting done), 5 (approvato), 6 (eliminazione logica)
            if (status > 3 && status < 7)
            {
                answ = true;
            }
            return answ;
        }

        /// <summary>
        /// Tooltip in base a BatchType...
        /// </summary>
        /// <param name="_BatchType"></param>
        /// <returns></returns>
        public string tooltipByType(object _BatchType)
        {
            string answ = "-";

            answ = traduci($"tooltipBatchType_{_BatchType}");
            return answ;
        }

        #endregion Public Methods
    }
}