using Consulenza.ReportCommon;
using Consulenza.ReportWriter.Business;
using Consulenza.ReportWriter.Business.OBJ_PDF;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;

namespace Consulenza.ReportWriter.Manager.Section.Base.Proposta
{
    public class P3 : Entity.Section
    {
        public P3(EnvironmentFacade environmentFacade, int idSection)
            : base(environmentFacade, idSection)
        {
            try
            {
                Draw();
            }
            catch (Exception ex)
            {
                SectionLogger.Write("P3", ex.Message, SectionLoggerMessageLevel.E, EnvironmentFacade.ReportEnvironment);
            }
        }

        /// <summary>
        /// Disegna l'oggetto P3
        /// </summary>
        protected override sealed void Draw()
        {
            var dtP3 = GetDataTable();
            var testi = GetText();

            if (dtP3.Rows.Count > 0)
            {

                var totaleControvaloreAttuale = Convert.ToDecimal(dtP3.Compute("Sum(Ctv_Attuale)", string.Empty));
                var totaleControvaloreProspettico = Convert.ToDecimal(dtP3.Compute("Sum(Ctv_Prospettico)", string.Empty));

                var tabella = new TablePDF(EnvironmentFacade.RendererFacade.XLeftLimit, dtP3);
                //tabella.Columns.Add(new ColumnPDF("SavingMap", 10, HorizontalAlignmentType.Sinistra, false, false, 6, ColumnType.Immagine, "SavingMap", string.Empty) { DeltaYContent = 6, ScaleColumnTypeImage = 0.50F, PaddingRight = 20 });
                tabella.Columns.Add(new ColumnPDF("SavingMap", 15, HorizontalAlignmentType.Sinistra, false, false, 6, ColumnType.Immagine, "SavingMap", string.Empty) { DeltaYContent = 6, ScaleColumnTypeImage = 0.60F });
                tabella.Columns.Add(new ColumnPDF("NomeProdotto", 208, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Testo, "NomeProdotto", "Nome prodotto"));
                tabella.Columns.Add(new ColumnPDF("Ctv_Attuale", 150, HorizontalAlignmentType.Destra, false, false, 7, ColumnType.Decimale, "Ctv_Attuale", "Controvalore attuale (€)"));
                tabella.Columns.Add(new ColumnPDF("Ctv_Prospettico", 150, HorizontalAlignmentType.Destra, false, false, 7, ColumnType.Decimale, "Ctv_Prospettico", "Controvalore prospettico (€)"));

                tabella.TitleRow = true;
                tabella.TitleRowText = "NUOVE SOTTOSCRIZIONI: " + Helper.FormatCurrency(totaleControvaloreProspettico.ToString()) + " €";

                #region Note Linea Protetta (AssetNoRischio)

                var dtP3AssetNoRischio = dtP3.Select("flag_tipocontratto = 1");
                var presenzaNotaAssetNoRischio = dtP3AssetNoRischio.Any();

                if (presenzaNotaAssetNoRischio)
                {
                    var nomeLinea = string.Join(", ", (from DataRow row in dtP3AssetNoRischio select row["nomelinea"]).Distinct());
                    var testoNota = testi.Rows[0]["testo1"].ToString().Replace("@NomeLinea", nomeLinea);

                    var campiAsterisco = new[] { "NomeProdotto" }; // campi del datasource su cui aggiungere gli asterischi di rimando alla note.

                    var notaAssetNoRischio = new TableNotePDF(TableNotePDF.TableNotePositionType.PièDiTabella, testoNota, campiAsterisco, "flag_tipocontratto=1");
                    tabella.Notes.Add(notaAssetNoRischio);
                }

                #endregion

                // Footer
                tabella.FooterColumns.Add(new ColumnPDF("", 10, HorizontalAlignmentType.Sinistra, false, true, 8, ColumnType.Testo));
                tabella.FooterColumns.Add(new ColumnPDF("Totale", 213, HorizontalAlignmentType.Sinistra, false, true, 8, ColumnType.Testo));
                tabella.FooterColumns.Add(new ColumnPDF("Totale Controvalore Attuale", 150, HorizontalAlignmentType.Destra, false, true, 8, ColumnType.Decimale));
                tabella.FooterColumns.Add(new ColumnPDF("Totale Controvalore Prospettico", 150, HorizontalAlignmentType.Destra, false, true, 8, ColumnType.Decimale));

                //tabella.FooterCells[0, 0].Value = "Totale";
                //tabella.FooterCells[1, 0].Value = totaleControvaloreAttuale.ToString();
                //tabella.FooterCells[2, 0].Value = totaleControvaloreProspettico.ToString();

                tabella.FooterCells[0, 0].Value = "";
                tabella.FooterCells[1, 0].Value = "Totale";
                tabella.FooterCells[2, 0].Value = totaleControvaloreAttuale.ToString();
                tabella.FooterCells[3, 0].Value = totaleControvaloreProspettico.ToString();


                AddElement(tabella);
                AddElement(new SpacePDF(20));
            }
            #region CP
            var dtP3CP = GetDataTableCP();
            var testiCP = GetText();

            if (dtP3CP.Rows.Count <= 0) return;
 
            var totaleControvaloreAttualeCP = Convert.ToDecimal(dtP3CP.Compute("Sum(ControvaloreSottoscrizione)", string.Empty));
            var totaleControvaloreProspetticoCP = Convert.ToDecimal(dtP3CP.Compute("Sum(ControvaloreProposto)", string.Empty));
            var totaleConversioneProgrammata = Convert.ToDecimal(dtP3CP.Compute("Sum(importoConversioneProgrammata)", string.Empty));
            var totaleRata = Convert.ToDecimal(dtP3CP.Compute("Sum(importoRata)", string.Empty));
            var totaleConversioneProgrammataInUscita = 0.0;
            Decimal importo = 0;
            string tipologiaCP = "Totale";
            string durata = "";
            foreach (DataRow riga in dtP3CP.Rows)
            {
                if (Convert.ToDouble(riga["importoConversioneProgrammata"]) < 0.0)
                {
                    //prendo solo la posizione in uscita CP              
                    totaleConversioneProgrammataInUscita = Convert.ToDouble(riga["importoConversioneProgrammata"]) * (-1);
                    if (Convert.ToDouble(riga["controvaloreProposto"])!= 0)
                    {
                        tipologiaCP = "Parziale";
                    }
                    importo = (-1) * Convert.ToDecimal(riga["importoConversioneProgrammata"]);
                    durata = riga["durata"] + " Mesi";
                 }
            }
            String titolo= "NUOVE SOTTOSCRIZIONI E SERVIZIO STEP UP: " + Helper.FormatCurrency(totaleControvaloreProspetticoCP.ToString()) + " € <br><br><br>" + "Tipologia Step Up: " + tipologiaCP + "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Importo Step Up (€): " + Helper.FormatCurrency(importo.ToString()) + "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Durata: " + durata;
           
            var tabellaCP = new TablePDF(EnvironmentFacade.RendererFacade.XLeftLimit, dtP3CP);
            tabellaCP.Columns.Add(new ColumnPDF("NomeProdotto", 166, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Testo, "NomeProdotto", "Nome prodotto"));
            tabellaCP.Columns.Add(new ColumnPDF("ConversioneProgrammata", 29, HorizontalAlignmentType.Destra, false, false, 6, ColumnType.Immagine, "ConversioneProgrammata", string.Empty) { DeltaYContent = 6, ScaleColumnTypeImage = 0.60F });
            tabellaCP.Columns.Add(new ColumnPDF("ControvaloreSottoscrizione", 85, HorizontalAlignmentType.Destra, false, false, 7, ColumnType.Decimale, "ControvaloreSottoscrizione", "Controvalore Sottoscrizione (€)"));
            tabellaCP.Columns.Add(new ColumnPDF("ImportoConversioneProgrammata", 85, HorizontalAlignmentType.Destra, false, false, 7, ColumnType.Decimale, "importoConversioneProgrammata", "Servizio Step Up (€)"));
            tabellaCP.Columns.Add(new ColumnPDF("Rata", 70, HorizontalAlignmentType.Destra, false, false, 7, ColumnType.Decimale, "importoRata", "Rata (€)"));
            tabellaCP.Columns.Add(new ColumnPDF("ControvaloreProposto", 85, HorizontalAlignmentType.Destra, false, false, 7, ColumnType.Decimale, "controvaloreProposto", "Controvalore proposto (€)"));
            tabellaCP.TitleRow = true;
            tabellaCP.TitleRowText = titolo;
            tabellaCP.TitleRowSpace = 40;

            // Footer
            tabellaCP.FooterColumns.Add(new ColumnPDF("Totale", 195, HorizontalAlignmentType.Sinistra, false, true, 8, ColumnType.Testo));
            tabellaCP.FooterColumns.Add(new ColumnPDF("Totale Controvalore Sottoscrizione", 85, HorizontalAlignmentType.Destra, false, true, 8, ColumnType.Decimale));
            tabellaCP.FooterColumns.Add(new ColumnPDF("Totale Controvalore CP", 85, HorizontalAlignmentType.Destra, false, true, 8, ColumnType.Decimale));
            tabellaCP.FooterColumns.Add(new ColumnPDF("Totale Rata", 70, HorizontalAlignmentType.Destra, false, true, 8, ColumnType.Decimale));
            tabellaCP.FooterColumns.Add(new ColumnPDF("Totale Controvalore Proposto", 85, HorizontalAlignmentType.Destra, false, true, 8, ColumnType.Decimale));

            tabellaCP.FooterCells[0, 0].Value = "Totale";
            tabellaCP.FooterCells[1, 0].Value = totaleControvaloreAttualeCP.ToString();
            tabellaCP.FooterCells[2, 0].Value = totaleConversioneProgrammata.ToString();
            tabellaCP.FooterCells[3, 0].Value = totaleRata.ToString();
            tabellaCP.FooterCells[4, 0].Value = totaleControvaloreProspetticoCP.ToString();

            tabellaCP.Notes.Add(
                new TableNotePDF(TableNotePDF.TableNotePositionType.PièDiTabella,
                "Prodotto con servizio Step Up attivo. Gli apporti indicati nella colonna \"Controvalore Proposto\" tengono in considerazione il versamento in fase di Sottoscrizione e gli <br>importi relativi allo Step Up in uscita.",
                new[] { "" },
                string.Empty,
                TableNotePDF.TableNoteAsteriskPositionType.PieDiTabella,
                new ImagePDF(EnvironmentFacade.RendererFacade.XLeftLimit, 0.60F, "cpInUscita.png"))
                { FontSize = 6, TextHorizontalAlign = ceTe.DynamicPDF.TextAlign.Left });
            tabellaCP.Notes.Add(
                new TableNotePDF(TableNotePDF.TableNotePositionType.PièDiTabella,
                "Prodotto con servizio Step Up attivo. Gli apporti indicati nella colonna \"Controvalore Proposto\" tengono in considerazione il versamento in fase di Sottoscrizione e gli <br>importi relativi allo Step Up in entrata.",
                new[] { "" },
                string.Empty,
                TableNotePDF.TableNoteAsteriskPositionType.PieDiTabella,
                new ImagePDF(EnvironmentFacade.RendererFacade.XLeftLimit, 0.60F, "cpInEntrata.png"))
                { FontSize = 6, TextHorizontalAlign = ceTe.DynamicPDF.TextAlign.Left });

            AddElement(tabellaCP);
            AddElement(new SpacePDF(20));

            #endregion
        }

        /// <summary>
        /// Recupera i dati necessari alla Section restituendo un DataTable.
        /// </summary>
        /// <returns></returns>
        protected sealed override DataTable GetDataTable()
        {
            var parametri = new List<Parametro>();

            #region Definizione dei parametri

            var parametro = new Parametro
            {
                Direction = ParameterDirection.Input,
                DbType = DbType.Int32,
                ParameterName = "chiaveProposta",
                Value = EnvironmentFacade.ReportEnvironment.Proposta.Chiave
            };
            parametri.Add(parametro);

            #endregion

            return EnvironmentFacade.ReportEnvironment.Proposta.PropostaCBUnica ? DataAccess.ExecuteDataTableStoredProcedure(DBProvider.SqlServerConsulenzaUnica, "REP_Prop_P3", parametri)
                : DataAccess.ExecuteDataTableStoredProcedure(DBProvider.SqlServerConsulenzaBase, "REP_Prop_P3", parametri);
        }
        /// <summary>
        /// Recupera i dati necessari alla Section restituendo un DataTable.
        /// </summary>
        /// <returns></returns>
        protected DataTable GetDataTableCP()
        {
            var parametri = new List<Parametro>();

            #region Definizione dei parametri

            var parametro = new Parametro
            {
                Direction = ParameterDirection.Input,
                DbType = DbType.Int32,
                ParameterName = "chiaveProposta",
                Value = EnvironmentFacade.ReportEnvironment.Proposta.Chiave
            };
            parametri.Add(parametro);

            #endregion

            return EnvironmentFacade.ReportEnvironment.Proposta.PropostaCBUnica ? DataAccess.ExecuteDataTableStoredProcedure(DBProvider.SqlServerConsulenzaUnica, "REP_Prop_P3_CP", parametri)
                : DataAccess.ExecuteDataTableStoredProcedure(DBProvider.SqlServerConsulenzaBase, "REP_Prop_P3_CP", parametri);
        }


        /// <summary>
        /// Recupera i dati necessari alla Section restituendo un DataSet.
        /// </summary>
        /// <returns></returns>
        protected sealed override DataSet GetDataSet()
        {
            return null;
        }
    }
}
