using System;
using Consulenza.ReportWriter.Business;
using Consulenza.ReportWriter.Business.OBJ_PDF;
using System.Data;
using Consulenza.ReportCommon;
using System.Linq;
using Consulenza.DataServices.fideuram.data.service;
using System.Collections.Generic;

namespace Consulenza.ReportWriter.Manager.Section.Unica
{
    /// <summary>
    /// Scheda 9. Patrimonio Fideuram: piramide dei bisogni. IdSezione 52
    /// </summary>
    public class S9 : Entity.Section
    {
        public S9(EnvironmentFacade environmentFacade, int idSection)
            : base(environmentFacade, idSection)
        {
            try
            {
                Draw();
            }
            catch (Exception ex)
            {
                SectionLogger.Write("S9", ex.Message, SectionLoggerMessageLevel.E, EnvironmentFacade.ReportEnvironment);
            }
        }

        protected override sealed void Draw()
        {
            var dati = GetDataSet();

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

            #region Tabella delle Aree di Bisogno

            var tabellaAree = new TablePDF(EnvironmentFacade.RendererFacade.XLeftLimit, dati.Tables["area"], dati.Tables["areaFooter"])
            {
                Style = Style.ConsulenzaUnica,
                AlternateRow = false,
                ShowSeparationLines = false,
                RowsPadding = 10,
                HeaderHeight = 30,
                HeaderMargin = 5F,
                FooterYOffset = 5F,
                //ShowBorderLastLine = true,
                //YOffset = -10
            };

            tabellaAree.Columns.Add(new ColumnPDF("Area2", 180, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Objectpdf, "Area", "Area di bisogno") { ScaleColumnTypeImage = 0.5F, HeaderFontSize = 7 });
            tabellaAree.Columns.Add(new ColumnPDF("VaR", 45, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Testo, "Var", "VaR (%)") {PaddingRight=1, DeltaYContent = 5, HeaderPaddingRight = 4, HeaderFontSize = 7, HorizontalAlignment = HorizontalAlignmentType.Destra });
            tabellaAree.Columns.Add(new ColumnPDF("ControvaloreAttuale", 85, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Decimale, "ControvaloreAttuale", "Controvalore<br>attuale (€)") { PaddingRight = 1, DeltaYContent = 5, HeaderFontSize = 7, HeaderPaddingLeft = 20 });
            tabellaAree.Columns.Add(new ColumnPDF("PercentualeAttuale", 65, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Decimale, "PercentualeAttuale", "% attuale") { PaddingRight = 1, DeltaYContent = 5, HeaderFontSize = 7, HeaderPaddingRight = 7, HorizontalAlignment = HorizontalAlignmentType.Destra });
            tabellaAree.Columns.Add(new ColumnPDF("PercentualeModello", 65, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Decimale, "PercentualeModello", "% modello") { PaddingRight = 1, DeltaYContent = 5, HeaderFontSize = 7, HeaderPaddingRight = 7, HorizontalAlignment = HorizontalAlignmentType.Destra });
            tabellaAree.Columns.Add(new ColumnPDF("Differenza", 80, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Testo, "DifferenzaString", "Differenza (%)") { DeltaYContent = 5, HeaderFontSize = 7, HeaderPaddingRight = 2, HorizontalAlignment = HorizontalAlignmentType.Destra });
            tabellaAree.FooterColumns.Add(new ColumnPDF("Area", 180, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Testo) { FontSize = 7 });
            tabellaAree.FooterColumns.Add(new ColumnPDF("VaR", 45, HorizontalAlignmentType.Destra, false, false, 7, ColumnType.Testo) { FontSize = 7, PaddingRight=2 });
            tabellaAree.FooterColumns.Add(new ColumnPDF("ControvaloreAttuale", 85, HorizontalAlignmentType.Destra, false, false, 7, ColumnType.Decimale) { FontSize = 7, PaddingRight = 2 });
            tabellaAree.FooterColumns.Add(new ColumnPDF("PercentualeAttuale", 65, HorizontalAlignmentType.Destra, false, false, 7, ColumnType.Decimale) { FontSize = 7, PaddingRight = 2 });
            tabellaAree.FooterColumns.Add(new ColumnPDF("PercentualeModello", 65, HorizontalAlignmentType.Destra, false, false, 7, ColumnType.Decimale) { FontSize = 7, PaddingRight = 2 });
            tabellaAree.FooterColumns.Add(new ColumnPDF("Differenza", 80, HorizontalAlignmentType.Destra, false, false, 7, ColumnType.Decimale) { FontSize = 7 });

            for (int a = 0; a < dati.Tables["area"].Rows.Count; a++)
            {
                tabellaAree.Cells[2, a].HorizontalAlignment = HorizontalAlignmentType.Destra;
                tabellaAree.Cells[0, a].ValueObjectList.Add(new ImagePDF(0, 1, dati.Tables["area"].Rows[a].ItemArray[0].ToString())
                {
                    DeltaX = 3,
                    DeltaY = 0,
                    Scale = 0.66f,
                    Height = 27,
                    Width = 145
                });
                var textArea = new FormattedTextAreaPDF(dati.Tables["area"].Rows[a].ItemArray[1].ToString(), 0)
                {                    
                    DeltaY = 8f,
                    FontSize = 8f
                };
                var labelSize = Helper.GetNumericStringWidth(textArea.Text);                
                float addition = 0;
                switch (textArea.Text)
                {
                    case "Investimento":
                    case "Previdenza":                    
                        addition = 3;
                        break;                    
                    case "Riserva":
                        addition = 2;
                        break;
                    case "Liquidità":
                        addition = 1;
                        break;
                    case "Extra Rendimento":
                        addition = 6;
                        break;
                }
                textArea.DeltaX = 76 + addition - labelSize;
                textArea.Text = Helper.FirstCharToUpper(textArea.Text);
                tabellaAree.Cells[0, a].ValueObjectList.Add(textArea);
            }

            // Nota su grado di copertura
            if (getNota1().Length > 0)
                tabellaAree.Notes.Add(new TableNotePDF(TableNotePDF.TableNotePositionType.PièDiTabella, getNota1(), new[] { "VaR" }, string.Empty, TableNotePDF.TableNoteAsteriskPositionType.PieDiTabella) { FontSize = 6, TextHorizontalAlign = ceTe.DynamicPDF.TextAlign.Justify, DeltaY = 5 });
            AddElement(new SpacePDF(20));
            AddElement(new FormattedTextAreaPDF(getTesto1(), EnvironmentFacade.RendererFacade.XLeftLimit, 520) { FontSize = 7, TextHorizontalAlign = ceTe.DynamicPDF.TextAlign.Justify});
            AddElement(new SpacePDF(7));
            AddElement(tabellaAree);
            

            #endregion

            #region Tabella dei Progetti di Investimento
            // Nel caso in cui sia presente un unico progetto di investimento con "controvalore attuale" e "controvalore modello" uguale a zero non mostro la tabella anche se richiesta.

            if (mostraTabellaProgettiInvestimento() && dati.Tables["investimentoFooter"].Rows.Count > 0)
            {
                // Testo introduttivo
                var sommaControvaloreAttuale = Convert.ToDecimal(dati.Tables["investimentoFooter"].Rows[0]["Colonna4"].ToString());
                var sommaControvaloreModello = Convert.ToDecimal(dati.Tables["investimentoFooter"].Rows[0]["Colonna8"].ToString());
                if ((sommaControvaloreAttuale + sommaControvaloreModello) != 0)
                {
                    AddElement(new SpacePDF(getNota1().Length > 0 ? 25 : 20));
                    AddElement(new FormattedTextAreaPDF(getTesto2(), EnvironmentFacade.RendererFacade.XLeftLimit, 520) { FontSize = 7, TextHorizontalAlign = ceTe.DynamicPDF.TextAlign.Justify });
                    AddElement(new SpacePDF(7));

                    var tabellaProgettiInvestimento = new TablePDF(EnvironmentFacade.RendererFacade.XLeftLimit, dati.Tables["investimento"], dati.Tables["investimentoFooter"])
                    {
                        Style = Style.ConsulenzaUnica,
                        AlternateRow = false,
                        ShowSeparationLines = false,
                        HeaderHeight = 30,
                        FooterYOffset = 5F,
                        HeaderMargin = 5F
                    };

                    tabellaProgettiInvestimento.Columns.Add(new ColumnPDF("Progetto", 110, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Testo, "Progetto", "Progetto di investimento") { HeaderFontSize = 7 });
                    tabellaProgettiInvestimento.Columns.Add(new ColumnPDF("Durata", 70, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Testo, "DurataResidua", "Durata residua") { HeaderPaddingLeft = 7, PaddingLeft = 7, HeaderFontSize = 7 });
                    tabellaProgettiInvestimento.Columns.Add(new ColumnPDF("VaR", 45, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Testo, "Var", "VaR (%)") { HeaderFontSize = 7, HeaderPaddingRight = 4, HorizontalAlignment = HorizontalAlignmentType.Destra });
                    tabellaProgettiInvestimento.Columns.Add(new ColumnPDF("ControvaloreAttuale", 85, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Decimale, "ControvaloreAttuale", "Controvalore<br>attuale (€)") {PaddingRight=2, HeaderFontSize = 7, HeaderPaddingLeft = 20 });
                    tabellaProgettiInvestimento.Columns.Add(new ColumnPDF("PercentualeAttuale", 65, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Decimale, "PercentualeAttuale", "% attuale") { PaddingRight = 2, HeaderFontSize = 7, HeaderPaddingRight = 7, HorizontalAlignment = HorizontalAlignmentType.Destra });
                    tabellaProgettiInvestimento.Columns.Add(new ColumnPDF("PercentualeModello", 65, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Decimale, "PercentualeModello", "% modello") { PaddingRight = 2, HeaderFontSize = 7, HeaderPaddingRight = 7, HorizontalAlignment = HorizontalAlignmentType.Destra });
                    tabellaProgettiInvestimento.Columns.Add(new ColumnPDF("Differenza", 80, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Testo, "DifferenzaString", "Differenza (%)") { HeaderFontSize = 7, HeaderPaddingRight = 2, HorizontalAlignment = HorizontalAlignmentType.Destra });

                    tabellaProgettiInvestimento.FooterColumns.Add(new ColumnPDF("Progetto", 110, HorizontalAlignmentType.Sinistra, false, true, 7, ColumnType.Testo) { FontSize = 7 });
                    tabellaProgettiInvestimento.FooterColumns.Add(new ColumnPDF("Durata", 70, HorizontalAlignmentType.Sinistra, false, true, 7, ColumnType.Testo) { FontSize = 7 });
                    tabellaProgettiInvestimento.FooterColumns.Add(new ColumnPDF("VaR", 45, HorizontalAlignmentType.Destra, false, true, 7, ColumnType.Testo) { FontSize = 7 });
                    tabellaProgettiInvestimento.FooterColumns.Add(new ColumnPDF("ControvaloreAttuale", 85, HorizontalAlignmentType.Destra, false, true, 7, ColumnType.Decimale) { FontSize = 7, PaddingRight=2 });
                    tabellaProgettiInvestimento.FooterColumns.Add(new ColumnPDF("PercentualeAttuale", 65, HorizontalAlignmentType.Destra, false, true, 7, ColumnType.Decimale) { FontSize = 7, PaddingRight = 2 });
                    tabellaProgettiInvestimento.FooterColumns.Add(new ColumnPDF("PercentualeModello", 65, HorizontalAlignmentType.Destra, false, true, 7, ColumnType.Decimale) { FontSize = 7, PaddingRight = 2 });
                    tabellaProgettiInvestimento.FooterColumns.Add(new ColumnPDF("Differenza", 80, HorizontalAlignmentType.Destra, false, true, 7, ColumnType.Decimale) { FontSize = 7 });
                    for (int a = 0; a < dati.Tables["investimento"].Rows.Count; a++)
                    {
                        tabellaProgettiInvestimento.Cells[3, a].HorizontalAlignment = HorizontalAlignmentType.Destra;
                    }
                    // Nota su grado di copertura dei progetti d'investimento
                    if (getNota2().Length > 0)
                        tabellaProgettiInvestimento.Notes.Add(new TableNotePDF(TableNotePDF.TableNotePositionType.PièDiTabella, getNota2(), new[] { "VaR" }, string.Empty, TableNotePDF.TableNoteAsteriskPositionType.PieDiTabella) { FontSize = 6, TextHorizontalAlign = ceTe.DynamicPDF.TextAlign.FullJustify, DeltaY = 5 });


                    AddElement(tabellaProgettiInvestimento);

                }
            }
            #endregion

            #region Tabella dei Progetti di Previdenza
            // Nel caso in cui sia l'area "previdenza essenziale" sia l'area "previdenza secondaria" abbiano un "controvalore attuale" e un "controvalore modello" uguale a zero non mostro la tabella anche se richiesta.
            if (mostraTabellaProgettiPrevidenza() && dati.Tables["previdenza"].Rows.Count > 0)
            {

                var sommaControvaloreAttuale = Convert.ToDecimal(dati.Tables["previdenzaFooter"].Rows[0]["Colonna4"].ToString());
                var sommaControvaloreModello = Convert.ToDecimal(dati.Tables["previdenzaFooter"].Rows[0]["Colonna8"].ToString());
                if ((sommaControvaloreAttuale + sommaControvaloreModello) != 0)
                {
                    if (dati.Tables["investimento"].Rows.Count + // progetto rows
                        1 + // progetto headerv
                        1 + // progetto footer
                        (getNota1().Length > 0 ? 1 : 0) + // nota1
                        (getNota2().Length > 0 ? 1 : 0) + // nota2
                        (getNota3().Length > 0 ? 1 : 0) + // nota3
                        dati.Tables["areafooter"].Rows.Count // progetto footers
                        > 9
                        && dati.Tables["previdenza"].Rows.Count > 0)
                    {
                        AddElement(new ImagePDF(435, 0.15F, "changepage.png") { AutoIncrementYWritable = false, Y = EnvironmentFacade.RendererFacade.YLowerLimit - 5 });
                        AddElement(new FormattedTextAreaPDF("continua alla pagina successiva", 450, 200) { FontSize = 6, AutoIncrementYWritable = false, Y = EnvironmentFacade.RendererFacade.YLowerLimit - 5, AbsolutePosition = true });
                        AddElement(new PagePDF(PagePDF.PagePDFType.Generic));
                        AddElement(new SpacePDF(2));
                        AddElement(new ImagePDF(EnvironmentFacade.RendererFacade.XLeftLimit, 0.15F, "changepage.png") { Y = EnvironmentFacade.RendererFacade.YUpperLimit + 2, AutoIncrementYWritable = false });
                        AddElement(new FormattedTextAreaPDF("continua dalla pagina precedente", EnvironmentFacade.RendererFacade.XLeftLimit + 15, 200) { Y = EnvironmentFacade.RendererFacade.YUpperLimit + 2, FontSize = 6, AutoIncrementYWritable = true, AbsolutePosition = true });
                        AddElement(new SpacePDF(15));
                    }
                    else
                    {
                        AddElement(new SpacePDF(getNota1().Length > 0 ? 25 : 20));
                    }

                    // Testo introduttivo
                    //var testoTabellaProgettiPrevidenza = Helper.ReplaceVariables(testi.Rows[0]["testo4"].ToString(), EnvironmentFacade.ReportEnvironment);
                    AddElement(new FormattedTextAreaPDF(getTesto3(), EnvironmentFacade.RendererFacade.XLeftLimit, 520) { FontSize = 7, TextHorizontalAlign = ceTe.DynamicPDF.TextAlign.Justify });
                    AddElement(new SpacePDF(7));

                    var tabellaProgettiPrevidenza = new TablePDF(EnvironmentFacade.RendererFacade.XLeftLimit, dati.Tables["previdenza"], dati.Tables["previdenzaFooter"])
                    {
                        Style = Style.ConsulenzaUnica,
                        AlternateRow = false,
                        ShowSeparationLines = false,
                        HeaderHeight = 30,
                        FooterYOffset = 5F,
                        HeaderMargin = 5F
                    };

                    tabellaProgettiPrevidenza.Columns.Add(new ColumnPDF("Progetto", 110, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Testo, "Progetto", "Previdenza") { HeaderFontSize = 7 });
                    tabellaProgettiPrevidenza.Columns.Add(new ColumnPDF("Durata", 70, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Testo, "DurataResidua", "") { HeaderPaddingLeft = 7, PaddingLeft = 7, HeaderFontSize = 7 });
                    tabellaProgettiPrevidenza.Columns.Add(new ColumnPDF("VaR", 45, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Testo, "Var", "VaR (%)") { HeaderFontSize = 7, HeaderPaddingRight = 4, HorizontalAlignment = HorizontalAlignmentType.Destra });
                    tabellaProgettiPrevidenza.Columns.Add(new ColumnPDF("ControvaloreAttuale", 85, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Decimale, "ControvaloreAttuale", "Controvalore<br>attuale (€)") { PaddingRight = 2, HeaderFontSize = 7, HeaderPaddingLeft = 20 });
                    tabellaProgettiPrevidenza.Columns.Add(new ColumnPDF("PercentualeAttuale", 65, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Decimale, "PercentualeAttuale", "% attuale") { PaddingRight = 2, HeaderFontSize = 7, HeaderPaddingRight = 7, HorizontalAlignment = HorizontalAlignmentType.Destra });
                    tabellaProgettiPrevidenza.Columns.Add(new ColumnPDF("PercentualeModello", 65, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Decimale, "PercentualeModello", "% modello") { PaddingRight = 2, HeaderFontSize = 7, HeaderPaddingRight = 7, HorizontalAlignment = HorizontalAlignmentType.Destra });
                    tabellaProgettiPrevidenza.Columns.Add(new ColumnPDF("Differenza", 80, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Testo, "DifferenzaString", "Differenza (%)") { HeaderFontSize = 7, HeaderPaddingRight = 2, HorizontalAlignment = HorizontalAlignmentType.Destra });

                    tabellaProgettiPrevidenza.FooterColumns.Add(new ColumnPDF("Progetto", 110, HorizontalAlignmentType.Sinistra, false, true, 7, ColumnType.Testo) { FontSize = 7 });
                    tabellaProgettiPrevidenza.FooterColumns.Add(new ColumnPDF("Durata", 70, HorizontalAlignmentType.Sinistra, false, true, 7, ColumnType.Testo) { FontSize = 7 });
                    tabellaProgettiPrevidenza.FooterColumns.Add(new ColumnPDF("VaR", 45, HorizontalAlignmentType.Destra, false, true, 7, ColumnType.Testo) { FontSize = 7 });
                    tabellaProgettiPrevidenza.FooterColumns.Add(new ColumnPDF("ControvaloreAttuale", 85, HorizontalAlignmentType.Destra, false, true, 7, ColumnType.Decimale) { PaddingRight = 2, FontSize = 7 });
                    tabellaProgettiPrevidenza.FooterColumns.Add(new ColumnPDF("PercentualeAttuale", 65, HorizontalAlignmentType.Destra, false, true, 7, ColumnType.Decimale) { PaddingRight = 2, FontSize = 7 });
                    tabellaProgettiPrevidenza.FooterColumns.Add(new ColumnPDF("PercentualeModello", 65, HorizontalAlignmentType.Destra, false, true, 7, ColumnType.Decimale) { PaddingRight = 2, FontSize = 7 });
                    tabellaProgettiPrevidenza.FooterColumns.Add(new ColumnPDF("Differenza", 80, HorizontalAlignmentType.Destra, false, true, 7, ColumnType.Testo) { FontSize = 7 });
                    tabellaProgettiPrevidenza.HeaderTextHorizontalAlign = HorizontalAlignmentType.Sinistra;

                    for (int a = 0; a < dati.Tables["previdenza"].Rows.Count; a++)
                    {
                        tabellaProgettiPrevidenza.Cells[3, a].HorizontalAlignment = HorizontalAlignmentType.Destra;
                    }

                    // Nota su grado di copertura dei progetti di previdenza
                    if (getNota3().Length > 0)
                        tabellaProgettiPrevidenza.Notes.Add(
                            new TableNotePDF(TableNotePDF.TableNotePositionType.PièDiTabella, getNota3(), new[] { "VaR" },
                                string.Empty, TableNotePDF.TableNoteAsteriskPositionType.PieDiTabella)
                            { FontSize = 6, TextHorizontalAlign = ceTe.DynamicPDF.TextAlign.Justify, DeltaY = 5 });

                    AddElement(tabellaProgettiPrevidenza);
                }
            }
            #endregion
        }

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

        /// <summary>
        /// Recupera i dati necessari alla Section restituendo un DataSet.
        /// </summary>
        /// <returns></returns>
        protected sealed override DataSet GetDataSet()
        {
            #region Definizione Tabelle
            var ds = new DataSet();
            ds.Tables.Add(new DataTable("area"));
            ds.Tables.Add(new DataTable("areaFooter"));
            ds.Tables.Add(new DataTable("investimento"));
            ds.Tables.Add(new DataTable("investimentoFooter"));
            ds.Tables.Add(new DataTable("previdenza"));
            ds.Tables.Add(new DataTable("previdenzaFooter"));
            #endregion

            #region Servizi
            var pianificazione = datiSeiUnico.pianificazioneUnit().pianificazioneVerticale;
            var patrimonioCasaTotale = pianificazione.risorseFinanziarieBF;
            var piramideModello = datiSeiUnico.piramideModelloUnit().piramideModello.areaModello.ToList().OrderBy(o => o.ordinamento).ToList().FindAll(o => o.visible == true);
            #endregion

            #region Aree

            ds.Tables["area"].Columns.Add(new DataColumn("Area", typeof(string)));
            ds.Tables["area"].Columns.Add(new DataColumn("Description", typeof(string)));
            ds.Tables["area"].Columns.Add(new DataColumn("VaR", typeof(string)));
            ds.Tables["area"].Columns.Add(new DataColumn("ControvaloreAttuale", typeof(decimal)));
            ds.Tables["area"].Columns.Add(new DataColumn("PercentualeAttuale", typeof(decimal)));
            ds.Tables["area"].Columns.Add(new DataColumn("PercentualeModello", typeof(decimal)));
            ds.Tables["area"].Columns.Add(new DataColumn("Differenza", typeof(decimal)));
            ds.Tables["area"].Columns.Add(new DataColumn("DifferenzaString", typeof(string)));

            foreach (var item in piramideModello)
            {
                var areaInPianificazione = pianificazione.aree.FirstOrDefault(o => o.area.Equals(item.area));

                var differenza = Math.Round(areaInPianificazione.percArea * 100 - item.percentualeArea, 2);

                ds.Tables["area"].Rows.Add(
                    string.Format("{0}.png", new AreaBisogno(item.area).NomePerImmagine), //Area
                    item.descrizioneArea,
                    areaInPianificazione.varInfos.varDecodificato, //VaR
                    areaInPianificazione.ctvArea, //ControvaloreAttuale
                    areaInPianificazione.percArea * 100, //PercentualeAttuale
                    item.percentualeArea, //PercentualeModello
                    differenza, //Differenza
                    string.Format("{0}{1}", differenza > 0 ? "+" : string.Empty, differenza.ToString()) //DifferenzaString
                   );
            }

            //ds.Tables["area"].Rows.Add(
            //       string.Empty, //Area
            //      null, //VaR
            //        null, //ControvaloreAttuale
            //       null, //PercentualeAttuale
            //        null, //PercentualeModello
            //        null, //Differenza
            //        string.Empty //DifferenzaString

            //      );

            #endregion

            #region Footer della tabella Aree

            var listReturn = new List<rsPosizione>();

            // Operazioni in corso
            listReturn.Add(new rsPosizione { prodotto = new rsProdotto() { nomeProdotto = "Operazioni in corso" }, ctv = datiSeiUnico.CASA_OC });
            // CC Negativi
            listReturn.Add(new rsPosizione { prodotto = new rsProdotto() { nomeProdotto = "Conto corrente" }, ctv = datiSeiUnico.CASA_CCN });
            //Eligo 
            listReturn.Add(new rsPosizione { prodotto = new rsProdotto() { nomeProdotto = "Liquidità negativa GP Eligo" }, ctv = datiSeiUnico.CASA_GPELIGO });
            // 20181010 AC
            // Il Mio Foglio
            //listReturn.Add(new rsPosizione { prodotto = new rsProdotto() { nomeProdotto = "Liquidità negativa Il Mio Foglio" }, ctv = datiSeiUnico.CASA_TUOFOGLIO });
            listReturn.Add(new rsPosizione { prodotto = new rsProdotto() { nomeProdotto = "Liquidità negativa Il Mio Foglio" }, ctv = datiSeiUnico.CASA_TUOFOGLIO });
            //--20181010

            var listaProdotti = listReturn.FindAll(o => o.ctv != 0);

            ds.Tables["areaFooter"].Columns.Add(new DataColumn("Colonna1", typeof(string)));
            ds.Tables["areaFooter"].Columns.Add(new DataColumn("Colonna2", typeof(string)));
            ds.Tables["areaFooter"].Columns.Add(new DataColumn("Colonna3", typeof(decimal)));
            ds.Tables["areaFooter"].Columns.Add(new DataColumn("Colonna4", typeof(decimal)));
            ds.Tables["areaFooter"].Columns.Add(new DataColumn("Colonna5", typeof(decimal)));
            ds.Tables["areaFooter"].Columns.Add(new DataColumn("Colonna6", typeof(decimal)));
            ds.Tables["areaFooter"].Columns.Add(new DataColumn("Colonna7", typeof(string)));
            ds.Tables["areaFooter"].Columns.Add(new DataColumn("ReplaceIfZero", typeof(string)));
            ds.Tables["areaFooter"].Columns.Add(new DataColumn("FontBold", typeof(bool)));
            ds.Tables["areaFooter"].Columns.Add(new DataColumn("BackgroundGray", typeof(bool)));


            // Patrimonio Casa
            ds.Tables["areaFooter"].Rows.Add(
                (listaProdotti.Count > 0) ? "Totale risorse allocate" :
                string.Format("Patrimonio {0}", Helper.ReplaceVariables("$/Banca/$", EnvironmentFacade.ReportEnvironment)),
                pianificazione.varRisorseAllocateInfos.varDecodificato,
                datiSeiUnico.CASA_SUBTOTALE.ToString(),
                Convert.ToDecimal(ds.Tables["area"].Compute("Sum(PercentualeAttuale)", string.Empty)).ToString(),
                Convert.ToDecimal(ds.Tables["area"].Compute("Sum(PercentualeModello)", string.Empty)).ToString(),
                Convert.ToDecimal(ds.Tables["area"].Compute("Sum(Differenza)", string.Empty)).ToString(),
                "",
                "0,00",
                true,
                true
                );

            //Dettaglio del Patrimonio Altro
            foreach (var item in listaProdotti)
            {
                ds.Tables["areaFooter"].Rows.Add(
                    item.prodotto.nomeProdotto, //Colonna1
                    "n.c.", //Colonna2
                    item.ctv, //Colonna3
                    0, //Colonna4
                    0, //Colonna5
                    0, //Colonna6
                    0,  //Colonna7                    
                    "-",
                    false,
                    false
                    );
            }

            // Totale del Patrimonio
            if (listaProdotti.Count > 0)
            {
                ds.Tables["areaFooter"].Rows.Add(
                  string.Format("Patrimonio {0}", Helper.ReplaceVariables("$/Banca/$", EnvironmentFacade.ReportEnvironment)),
                  pianificazione.varInfos.varDecodificato, //pianificazione.varInfos.varDecodificato,
                  datiSeiUnico.CASA_TOTALE,//patrimonioCasaTotale,
                  0,
                  0,
                  0,
                  0,
                  "-",
                  true,
                  true
                  );
            }

            #endregion

            #region Progetti Investimento
            bool visualizzaInvestimento = false;
            var areaInvestimentoInPianificazione = pianificazione.aree.FirstOrDefault(o => o.area.Equals("Inv"));
            if (areaInvestimentoInPianificazione != null)
            {
                if (areaInvestimentoInPianificazione.progetti.AsEnumerable().Sum(x => x.ctvProgetto) != 0 ||
                    areaInvestimentoInPianificazione.progetti.Sum(x => x.ctvPianificato) != 0 ||
                    areaInvestimentoInPianificazione.progetti.Sum(x => x.progettoModello.percentualeProgetto / 100 * patrimonioCasaTotale) != 0)
                    visualizzaInvestimento = true;
            }
            if (visualizzaInvestimento)
            {
                ds.Tables["investimento"].Columns.Add(new DataColumn("Progetto", typeof(string)));
                ds.Tables["investimento"].Columns.Add(new DataColumn("DurataResidua", typeof(string)));
                ds.Tables["investimento"].Columns.Add(new DataColumn("VaR", typeof(string)));
                ds.Tables["investimento"].Columns.Add(new DataColumn("ControvaloreAttuale", typeof(decimal)));
                ds.Tables["investimento"].Columns.Add(new DataColumn("ControvaloreModello", typeof(decimal)));
                ds.Tables["investimento"].Columns.Add(new DataColumn("PercentualeAttuale", typeof(decimal)));
                ds.Tables["investimento"].Columns.Add(new DataColumn("PercentualeModello", typeof(decimal)));
                ds.Tables["investimento"].Columns.Add(new DataColumn("Differenza", typeof(decimal)));
                ds.Tables["investimento"].Columns.Add(new DataColumn("DifferenzaString", typeof(string)));
                ds.Tables["investimento"].Columns.Add(new DataColumn("CanLastRow", typeof(bool)));

                // patryk tmp
                //for (int i = 0; i < 4; i++)
                //{
                    foreach (var item in pianificazione.aree.FirstOrDefault(o => o.area.Equals("Inv")).progetti.OrderByDescending(x => x.ctvProgetto))
                    {
                        var differenza = Math.Round((item.percProgetto * 100) - item.progettoModello.percentualeProgetto, 2);

                        ds.Tables["investimento"].Rows.Add(
                            item.progettoModello.nomeProgetto, //Progetto
                            item.durataResidua == null ? "-" : item.durataResidua,
                            item.progettoVarInfos.varDecodificato, // VaR
                            item.ctvProgetto, // ControvaloreAttuale
                            item.progettoModello.percentualeProgetto * patrimonioCasaTotale, // ControvaloreModello
                            item.percProgetto * 100, // PercentualeAttuale
                            item.progettoModello.percentualeProgetto, // PercentualeModello
                            differenza, // Differenza
                            string.Format("{0}{1}", differenza > 0 ? "+" : string.Empty, differenza.ToString()), //DifferenzaString
                            true);
                    }
                //}


                #endregion

                #region Footer della tabella Progetti Investimento

                ds.Tables["investimentoFooter"].Columns.Add(new DataColumn("Colonna1", typeof(string)));
                ds.Tables["investimentoFooter"].Columns.Add(new DataColumn("Colonna2", typeof(string)));
                ds.Tables["investimentoFooter"].Columns.Add(new DataColumn("Colonna3", typeof(string)));
                ds.Tables["investimentoFooter"].Columns.Add(new DataColumn("Colonna4", typeof(decimal)));
                ds.Tables["investimentoFooter"].Columns.Add(new DataColumn("Colonna5", typeof(decimal)));
                ds.Tables["investimentoFooter"].Columns.Add(new DataColumn("Colonna6", typeof(decimal)));
                ds.Tables["investimentoFooter"].Columns.Add(new DataColumn("Colonna7", typeof(decimal)));
                ds.Tables["investimentoFooter"].Columns.Add(new DataColumn("Colonna8", typeof(decimal)));
                ds.Tables["investimentoFooter"].Columns.Add(new DataColumn("ReplaceIfZero", typeof(string)));
                ds.Tables["investimentoFooter"].Columns.Add(new DataColumn("FontBold", typeof(bool)));
                ds.Tables["investimentoFooter"].Columns.Add(new DataColumn("BackgroundGray", typeof(bool)));
                ds.Tables["investimentoFooter"].Columns.Add(new DataColumn("CanLastRow", typeof(bool)));

                //string asterisco = "";
                //asterisco = (getNota1().Length > 0 ? "*" : "");
                decimal controvaloreTotale = Convert.ToDecimal(ds.Tables["investimento"].Compute("Sum(ControvaloreAttuale)", string.Empty));
                ds.Tables["investimentoFooter"].Rows.Add(
                    "Totale Investimento",
                    "",
                    areaInvestimentoInPianificazione.varInfos.varDecodificato,// + asterisco + (getNota2().Length > 0 ? "*" : ""),
                    Convert.ToDecimal(ds.Tables["investimento"].Compute("Sum(ControvaloreAttuale)", string.Empty)).ToString(),
                    Convert.ToDecimal(ds.Tables["investimento"].Compute("Sum(PercentualeAttuale)", string.Empty)).ToString(),
                    Convert.ToDecimal(ds.Tables["investimento"].Compute("Sum(PercentualeModello)", string.Empty)).ToString(),
                    Convert.ToDecimal(ds.Tables["investimento"].Compute("Sum(Differenza)", string.Empty)).ToString(),
                    Convert.ToDecimal(ds.Tables["investimento"].Compute("Sum(ControvaloreModello)", string.Empty)).ToString(),
                    "", //ReplaceIfZero
                    true, //FontBold
                    true, //BackgroundGray
                    false //canlastrow
                    );
            }
            #endregion

            #region Progetti Previdenza
            var areaPrevidenzaInPianificazione = pianificazione.aree.FirstOrDefault(o => o.area.Equals("Pre"));
            bool visualizzaPrevidenza = false;
            if (areaPrevidenzaInPianificazione != null)
            {
                if (areaPrevidenzaInPianificazione.progetti.AsEnumerable().Sum(x => x.ctvProgetto) != 0 ||
                    areaPrevidenzaInPianificazione.progetti.Sum(x => x.ctvPianificato) != 0 ||
                    areaPrevidenzaInPianificazione.progetti.Sum(x => x.progettoModello.percentualeProgetto / 100 * patrimonioCasaTotale) != 0)
                    visualizzaPrevidenza = true;
            }
            ds.Tables["previdenza"].Columns.Add(new DataColumn("Progetto", typeof(string)));
            ds.Tables["previdenza"].Columns.Add(new DataColumn("DurataResidua", typeof(string)));
            ds.Tables["previdenza"].Columns.Add(new DataColumn("VaR", typeof(string)));
            ds.Tables["previdenza"].Columns.Add(new DataColumn("ControvaloreAttuale", typeof(decimal)));
            ds.Tables["previdenza"].Columns.Add(new DataColumn("ControvaloreModello", typeof(decimal)));
            ds.Tables["previdenza"].Columns.Add(new DataColumn("PercentualeAttuale", typeof(decimal)));
            ds.Tables["previdenza"].Columns.Add(new DataColumn("PercentualeModello", typeof(decimal)));
            ds.Tables["previdenza"].Columns.Add(new DataColumn("Differenza", typeof(decimal)));
            ds.Tables["previdenza"].Columns.Add(new DataColumn("DifferenzaString", typeof(string)));
            ds.Tables["previdenza"].Columns.Add(new DataColumn("CanLastRow", typeof(bool)));
            if (visualizzaPrevidenza)
            {
                foreach (var item in pianificazione.aree.FirstOrDefault(o => o.area.Equals("Pre")).progetti.OrderBy(o => o.progettoModello.nomeProgetto))
                {
                    var differenza = Math.Round((item.percProgetto * 100) - item.progettoModello.percentualeProgetto, 2);

                    ds.Tables["previdenza"].Rows.Add(
                        item.progettoModello.nomeProgetto, //Progetto
                        "",
                        item.progettoVarInfos.varDecodificato, // VaR
                        item.ctvProgetto, // ControvaloreAttuale
                        item.progettoModello.percentualeProgetto * patrimonioCasaTotale, // ControvaloreModello
                        item.percProgetto * 100, // PercentualeAttuale
                        item.progettoModello.percentualeProgetto, // PercentualeModello
                        differenza, // Differenza
                        string.Format("{0}{1}", differenza > 0 ? "+" : string.Empty, Helper.FormatCurrency(differenza.ToString())),//DifferenzaString
                        true
                        );
                }

                #endregion

                #region Footer della tabella Progetti Previdenza

                ds.Tables["previdenzaFooter"].Columns.Add(new DataColumn("Colonna1", typeof(string)));
                ds.Tables["previdenzaFooter"].Columns.Add(new DataColumn("Colonna2", typeof(string)));
                ds.Tables["previdenzaFooter"].Columns.Add(new DataColumn("Colonna3", typeof(string)));
                ds.Tables["previdenzaFooter"].Columns.Add(new DataColumn("Colonna4", typeof(decimal)));
                ds.Tables["previdenzaFooter"].Columns.Add(new DataColumn("Colonna5", typeof(decimal)));
                ds.Tables["previdenzaFooter"].Columns.Add(new DataColumn("Colonna6", typeof(decimal)));
                ds.Tables["previdenzaFooter"].Columns.Add(new DataColumn("Colonna7", typeof(decimal)));
                ds.Tables["previdenzaFooter"].Columns.Add(new DataColumn("Colonna8", typeof(decimal)));
                ds.Tables["previdenzaFooter"].Columns.Add(new DataColumn("ReplaceIfZero", typeof(string)));
                ds.Tables["previdenzaFooter"].Columns.Add(new DataColumn("FontBold", typeof(bool)));
                ds.Tables["previdenzaFooter"].Columns.Add(new DataColumn("BackgroundGray", typeof(bool)));
                ds.Tables["previdenzaFooter"].Columns.Add(new DataColumn("CanLastRow", typeof(bool)));
                ds.Tables["previdenzaFooter"].Rows.Add(
                    "Totale Previdenza",
                    "",
                    pianificazione.aree.FirstOrDefault(o => o.area.Equals("Pre")).varInfos.varDecodificato,// + asterisco + (getNota3().Length > 0 ? "*" : ""),
                    Convert.ToDecimal(ds.Tables["previdenza"].Compute("Sum(ControvaloreAttuale)", string.Empty)).ToString(),
                    Convert.ToDecimal(ds.Tables["previdenza"].Compute("Sum(PercentualeAttuale)", string.Empty)).ToString(),
                    Convert.ToDecimal(ds.Tables["previdenza"].Compute("Sum(PercentualeModello)", string.Empty)).ToString(),
                    Convert.ToDecimal(ds.Tables["previdenza"].Compute("Sum(Differenza)", string.Empty)).ToString(),
                    Convert.ToDecimal(ds.Tables["previdenza"].Compute("Sum(ControvaloreModello)", string.Empty)).ToString(),
                    "", //ReplaceIfZero
                    true, //FontBold
                    true, //BackgroundGray
                    false
                    );
            }
            #endregion

            return ds;
        }

        public virtual bool mostraTabellaProgettiInvestimento()
        {
            return GetOption<Opzione4_1>().Valore;
        }

        public virtual bool mostraTabellaProgettiPrevidenza()
        {
            return GetOption<Opzione4_2>().Valore;
        }

        public virtual string getNota1()
        {
            string nota = "";
            string token = "";

            decimal GC = datiSeiUnico.pianificazioneUnit().pianificazioneVerticale.varInfos.stat.copertura;

            if (GC < 100)
            {
                nota += token + datiSeiUnico.FormatDecimal("Grado di copertura prodotti in termini di Rischio Mercato (VaR): {0}.", GC);
            }
            return datiSeiUnico.FormatBanca(nota);
        }

        public virtual string getNota2()
        {
            string nota = "";
            string token = "";

            decimal GC = datiSeiUnico.pianificazioneUnit().pianificazioneVerticale.aree.FirstOrDefault(o => o.area.Equals("Inv")).varInfos.stat.copertura;

            if (GC < 100 && GC > 0)
            {
                nota += token + datiSeiUnico.FormatDecimal("Grado di copertura prodotti in termini di Rischio Mercato (VaR): {0}.", GC);
            }
            return datiSeiUnico.FormatBanca(nota);
        }

        public virtual string getNota3()
        {
            string nota = "";
            string token = "";

            decimal GC = datiSeiUnico.pianificazioneUnit().pianificazioneVerticale.aree.FirstOrDefault(o => o.area.Equals("Pre")).varInfos.stat.copertura;

            if (GC < 100 && GC > 0)
            {
                nota += token + datiSeiUnico.FormatDecimal("Grado di copertura prodotti in termini di Rischio Mercato (VaR): {0}.", GC);
            }
            return datiSeiUnico.FormatBanca(nota);
        }

        public string getTesto1()
        {
            string testo = string.Empty;
            testo = "Nella tabella sottostante sono riportate, per ogni area di bisogno, l'allocazione corrente e quella ottimale ";
            testo += "delle risorse finanziarie che lei detiene presso $/Banca/$ e il relativo scostamento.";

            return Helper.ReplaceVariables(testo, EnvironmentFacade.ReportEnvironment);
        }

        public string getTesto2()
        {
            string testo = string.Empty;
            testo = "Nella tabella sottostante sono riportate l'allocazione corrente e quella ottimale delle risorse finanziare, ";
            testo += "che lei detiene presso $/Banca/$, destinate ai singoli progetti di investimento e il relativo scostamento.";

            return Helper.ReplaceVariables(testo, EnvironmentFacade.ReportEnvironment);
        }

        public string getTesto3()
        {
            string testo = string.Empty;
            testo = "Nella tabella sottostante sono riportate l'allocazione corrente e quella ottimale delle risorse finanziare, ";
            testo += "che lei detiene presso $/Banca/$, destinate alle aree \"Previdenza Essenziale\" e \"Previdenza Secondaria\", insieme al relativo scostamento.";

            return Helper.ReplaceVariables(testo, EnvironmentFacade.ReportEnvironment);
        }
    }
}
