using System;
using System.Data;
using ceTe.DynamicPDF.Text;
using PDFGenerator.BusinessLayer.DataSection;
using PDFGenerator.Presentation.Section.Tables;
using PDFGenerator.BusinessLayer;
using NLog;

namespace PDFGenerator.Presentation.Section
{
    public class S76 : ISezione
    {

        private static NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger();
        string Titolo = " ";
        private decimal totalePatNonCoperto = 0;
        bool hasColumnCtvNonCoperto;
        bool hasColumnCtvNonCopertoTotali;
        private string _testointroduttivo;
        private TipologiaReport _tipologiaReport;
        /// <summary>
        /// Modalità di visualizzazione:
        /// La modalità normale mostra la colonna Intermediario(S76 in modalità normale),
        /// La modalità alternativa mostra la colonna AreaProgetto(S76 in modalità alternativa).
        /// Se non specificato di default viene impostata la modalità normale.
        /// </summary>
        public enum EmodalitaRappresentazione
        {
            normale,
            alternativa
        }

        private EmodalitaRappresentazione _modalitaRappresentazione = EmodalitaRappresentazione.normale;


        /// <summary>
        /// Modalità di visualizzazione:
        /// La modalità normale mostra la colonna Intermediario(S76 in modalità normale),
        /// La modalità alternativa mostra la colonna AreaProgetto(S76 in modalità alternativa).
        /// Se non specificato di default viene impostata la modalità normale.
        /// </summary>
        public EmodalitaRappresentazione modalitaRappresentazione
        {
            get { return _modalitaRappresentazione; }
            set { _modalitaRappresentazione = value; }
        }

        public TipologiaReport TipologiaReport
        {
            get { return _tipologiaReport; }
            set { _tipologiaReport = value; }
        }

        /// <summary>
        /// Imposta o recupere il testo introduttivo della sezione.
        /// </summary>
        public string TestoIntroduttivo
        {
            get { return _testointroduttivo; }
            set { _testointroduttivo = value; }
        }


        /// <summary>
        /// Costruttore
        /// </summary>
        public S76()
        {

        }

        /// <summary>
        /// Costruttore
        /// </summary>
        /// <param name="modalitavisualizzazione"></param>
        public S76(EmodalitaRappresentazione modalitavisualizzazione)
        {
            _modalitaRappresentazione = modalitavisualizzazione;
        }


        #region ISezione Members



        public void writeSezione(DataThread dataThread)
        {

            dataThread.SETDATA();

            DocumentPDF document = dataThread.DocumentPDF;
            DatiTabella datitab = new DatiTabella();
            DataSetS76 set = (DataSetS76)dataThread.Data.DatiSezione;

            int fontTab = 7;
            int fontTabTotale = 8;

            #region Verifica presenza prodotti parzialmente 
            DataTable datiTotaleConto = set.Tables["TotaleConti"];
            totalePatNonCoperto = 0;

            #region Gestione Colonna controvalore non coperto
            if (datiTotaleConto.ExtendedProperties.Contains("HasColumnCtvNonCoperto"))
                hasColumnCtvNonCopertoTotali = Convert.ToBoolean(datiTotaleConto.ExtendedProperties["HasColumnCtvNonCoperto"]);
            #endregion

            // verifico anche se va inserito il controvalore non coperto
            if (datiTotaleConto.Rows.Count > 0 && datiTotaleConto.Rows[0]["ValoreNonCoperto"] != DBNull.Value && hasColumnCtvNonCopertoTotali)
                totalePatNonCoperto = (decimal)datiTotaleConto.Rows[0]["ValoreNonCoperto"];
            #endregion


            datitab.table = set.Tables["ContoCorrente"];

            #region Gestione Colonna controvalore non coperto
            if (datitab.table.ExtendedProperties.Contains("HasColumnCtvNonCoperto"))
                hasColumnCtvNonCoperto = Convert.ToBoolean(datitab.table.ExtendedProperties["HasColumnCtvNonCoperto"]);
            #endregion

            DataView view = new DataView(datitab.table);
            view.RowFilter = "";


            //calcola se entra nella pagina altrimenti aggiunge una nuova pagina.
            if (document.checkMargin(datitab.GetRowDim() * 3))
                document.addPage();

            if (dataThread.TipoReport.ToUpper() == "DIAGNOSI")
            {
                document.setSezTitoloDiagnosi(Titolo);
                document.setChapterHeader(_testointroduttivo);
            }
            else
            {
                document.setSezTitolo(Titolo);
                document.setChapterHeader(_testointroduttivo, 0, 520, 8);
            }

            Tabella tab = new Tabella(document.getMargineLeft(), document.getLastPos());
            tab.HeaderFont = 8;

            tab.Header = true;
            datitab.table = view.ToTable();
            tab.Datasource = datitab.table;
            //if (dataThread.TipoReport.ToUpper() == "MONITORAGGIO")
            // {
            //    tab.AltezzaCella = 30;
            //    tab.HeaderFont = 9;
            //    fontTab = 9;
            //    fontTabTotale = 9;
            // }

            if (Convert.ToBoolean((datitab.table.Columns["AreaProgetto"].ExtendedProperties["ToRemove"])))
            {
                // LA COLONNA AreaProgetto NON VIENE VISUALIZZATA

                tab.Colonne.Add(new Colonna("DataSottoscrizione", "Data sott.", hasColumnCtvNonCoperto ? 66 : 80, TipoAllineamento.SINISTRA, false, fontTab, false));
                tab.Colonne.Add(new Colonna("Contratto", "Contratto/<BR>Dossier", hasColumnCtvNonCoperto ? 66 : 80, TipoAllineamento.SINISTRA, false, fontTab, false));
                tab.Colonne.Add(new Colonna("<IMAGE>", " ", 5, TipoAllineamento.SINISTRA, false, 7, false));
                tab.Colonne.Add(new Colonna("Descrizione", "Descrizione", hasColumnCtvNonCoperto ? 197 : 267, TipoAllineamento.SINISTRA, false, fontTab, false));
                tab.Colonne.Add(new Colonna("Controvalore", "Controvalore €", hasColumnCtvNonCoperto ? 90 : 80, TipoAllineamento.DESTRA, false, fontTab, false));

                if (hasColumnCtvNonCoperto)
                    tab.Colonne.Add(new Colonna("ControvaloreNonCoperto", "Controvalore<BR>non coperto €", 90, TipoAllineamento.DESTRA, false, fontTab, false));

            }
            else
            {
                // LA COLONNA AreaProgetto VIENE VISUALIZZATA
                //V DataSottoscrizione portata a 60 da 66 per portare a quasi 90 areaProgetto come è sulla S88, se occorre si poterbbe rosicchiare qualcosa dalla colonna contratto
                tab.Colonne.Add(new Colonna("DataSottoscrizione", "Data sott.", hasColumnCtvNonCoperto ? 60 : 80, TipoAllineamento.SINISTRA, false, fontTab, false));
                tab.Colonne.Add(new Colonna("Contratto", "Contratto/<BR>Dossier", hasColumnCtvNonCoperto ? 66 : 80, TipoAllineamento.SINISTRA, false, fontTab, false));
                tab.Colonne.Add(new Colonna("<IMAGE>", " ", 5, TipoAllineamento.SINISTRA, false, fontTab, false));
                tab.Colonne.Add(new Colonna("Descrizione", "Descrizione", hasColumnCtvNonCoperto ? 115 : 181, TipoAllineamento.SINISTRA, false, fontTab, false));
                switch (_modalitaRappresentazione)
                {
                    case EmodalitaRappresentazione.normale:
                        tab.Colonne.Add(new Colonna("Intermediario", "Intermediario", 86, TipoAllineamento.SINISTRA, false, fontTab, false));
                        break;
                    case EmodalitaRappresentazione.alternativa:
                        tab.Colonne.Add(new Colonna("AreaProgetto", "Area/<BR>Progetto", 86, TipoAllineamento.SINISTRA, false, fontTab, false));
                        break;
                }
                tab.Colonne.Add(new Colonna("Controvalore", "Controvalore €", hasColumnCtvNonCoperto ? 90 : 80, TipoAllineamento.DESTRA, false, fontTab, false));

                if (hasColumnCtvNonCoperto)
                    tab.Colonne.Add(new Colonna("ControvaloreNonCoperto", "Controvalore<BR>non coperto €", 90, TipoAllineamento.DESTRA, false, fontTab, false));

            }




            tab.Draw(datitab, document);

            //TOTALI
            datitab = new DatiTabella();
            datitab.table = set.Tables["TotaleConti"];

            Tabella tabellaTotali = new Tabella(document.getMargineLeft(), document.getLastPos() + tab.AltezzaTabella + 25);
            tabellaTotali.HeaderFont = 8;

            tabellaTotali.Header = false;
            tabellaTotali.SaltoPagina = false;
            tabellaTotali.Datasource = datitab.table;

            // footer
            if (hasColumnCtvNonCoperto)
            {
                tabellaTotali.Colonne.Add(new Colonna("Descrizione", "", 332, TipoAllineamento.SINISTRA, true, fontTabTotale, true));
                tabellaTotali.Colonne.Add(new Colonna("Valore", "", 90, TipoAllineamento.DESTRA, true, fontTabTotale, true));
                tabellaTotali.Colonne.Add(new Colonna("ValoreNonCoperto", "", 90, TipoAllineamento.DESTRA, true, fontTabTotale, true));
            }
            else
            {
                if (datitab.table.Columns.Contains("ValoreNonCoperto"))
                    datitab.table.Columns.Remove("ValoreNonCoperto");

                tabellaTotali.Colonne.Add(new Colonna("Descrizione", "", 420, TipoAllineamento.SINISTRA, true, fontTabTotale, true));
                tabellaTotali.Colonne.Add(new Colonna("Valore", "", 92, TipoAllineamento.DESTRA, true, fontTabTotale, true));
            }

            tabellaTotali.Draw(datitab, document);
            //tab.AddNotaPartiteViaggianti(tabellaTotali.AltezzaTabella + tab.AltezzaTabella, document);

            ///// setto la posizione aggiornata
            document.setLastPos(tabellaTotali.AltezzaTabella + tab.AltezzaTabella + 5);

            /*** TEST - Verifica Tempistica 09/11/2023 - Pino ****/
            /*** Inserimento log per verifica tempistica della sezione ***/
            //DateTimeOffset dateOffsetValueFin = DateTimeOffset.Parse(DateTime.Now.ToString("hh:mm:ss.ffff"));
            //var tDiff = dateOffsetValueFin - dateOffsetValueIni;
            //logger.Trace("S76 " + tDiff);
            /*************************************************************/

        }


        public void setTitolo(string label)
        {
            Titolo = label;
        }

        #endregion
    }


}