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


namespace Consulenza.ReportWriter.Manager.Section.Unica
{
    /// <summary>
    /// S25.PianificazionePiramideBisogni idSezione = 68
    /// </summary>
    public class S25 : Entity.Section
    {
        public S25(EnvironmentFacade environmentFacade, int idSection)
            : base(environmentFacade, idSection)
        {
            try
            {
                Draw();
            }
            catch (Exception ex)
            {
                SectionLogger.Write("S25", ex.Message, SectionLoggerMessageLevel.E, EnvironmentFacade.ReportEnvironment);
            }
        }

        /// <summary>
        /// 
        /// </summary>
        protected override sealed void Draw()
        {
            var dati = GetDataSet();

            #region Tabella delle Aree di Bisogno

            AddElement(new SpacePDF(20));
            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
            };

            tabellaAree.Columns.Add(new ColumnPDF("Area2", 180, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Objectpdf, "Area", "Area di bisogno") { HeaderFontSize = 7,  ScaleColumnTypeImage = 0.6F });
            tabellaAree.Columns.Add(new ColumnPDF("VaR", 40, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Testo, "Var", "VaR (%)") { HeaderFontSize = 7, DeltaYContent = 5, HeaderPaddingRight = 5, FontSize = 7 });
            tabellaAree.Columns.Add(new ColumnPDF("ControvaloreAttuale", 85, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Testo, "ControvaloreAttuale", "Controvalore<BR>attuale (€)") { HeaderFontSize = 7, DeltaYContent = 5, FontSize = 7, PaddingRight = 3, HeaderPaddingLeft = 20 });
            tabellaAree.Columns.Add(new ColumnPDF("ControvalorePianificato", 75, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Testo, "ControvalorePianificato", "Controvalore<BR>pianificato (€)") { HeaderFontSize = 7, HeaderPaddingRight = 7, PaddingRight = 4, DeltaYContent = 5, FontSize = 7 });
            tabellaAree.Columns.Add(new ColumnPDF("ControvaloreModello", 70, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Testo, "ControvaloreModello", "Controvalore<BR>modello (€)") { HeaderFontSize = 7, PaddingRight = 3, HeaderPaddingRight = 7, DeltaYContent = 5, FontSize = 7 });
            tabellaAree.Columns.Add(new ColumnPDF("Differenza", 70, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Testo, "Differenza", "Differenza (€)") { HeaderFontSize = 7, HeaderPaddingRight = 2, DeltaYContent = 5, FontSize = 7, PaddingRight = 4 });

            tabellaAree.FooterColumns.Add(new ColumnPDF("Area", 180, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Testo) { FontSize = 7 });
            tabellaAree.FooterColumns.Add(new ColumnPDF("VaR", 40, HorizontalAlignmentType.Destra, false, false, 7, ColumnType.Testo) { FontSize = 7 });
            tabellaAree.FooterColumns.Add(new ColumnPDF("ControvaloreAttuale", 85, HorizontalAlignmentType.Destra, false, false, 7, ColumnType.Testo) { PaddingRight = 3, FontSize = 7 });
            tabellaAree.FooterColumns.Add(new ColumnPDF("ControvalorePianificato", 75, HorizontalAlignmentType.Destra, false, false, 7, ColumnType.Testo) { PaddingRight = 3, FontSize = 7 });
            tabellaAree.FooterColumns.Add(new ColumnPDF("ControvaloreModello", 70, HorizontalAlignmentType.Destra, false, false, 7, ColumnType.Testo) { PaddingRight = 3, FontSize = 7 });
            tabellaAree.FooterColumns.Add(new ColumnPDF("Differenza", 70, HorizontalAlignmentType.Destra, false, false, 7, ColumnType.Testo) { FontSize = 7 });

            int i = 0;
            foreach (DataRow r in dati.Tables["area"].Rows)
            {
                tabellaAree.Cells[2, i].Value = Helper.FormatCurrency(r["ControvaloreAttuale"].ToString());
                tabellaAree.Cells[3, i].Value = Helper.FormatCurrency(r["ControvalorePianificato"].ToString());
                tabellaAree.Cells[4, i].Value = Helper.FormatCurrency(r["ControvaloreModello"].ToString());
                tabellaAree.Cells[5, i].Value = Helper.FormatCurrency(r["Differenza"].ToString());

                tabellaAree.Cells[1, i].HorizontalAlignment = HorizontalAlignmentType.Destra;
                tabellaAree.Cells[2, i].HorizontalAlignment = HorizontalAlignmentType.Destra;
                tabellaAree.Cells[3, i].HorizontalAlignment = HorizontalAlignmentType.Destra;
                tabellaAree.Cells[4, i].HorizontalAlignment = HorizontalAlignmentType.Destra;
                tabellaAree.Cells[5, i].HorizontalAlignment = HorizontalAlignmentType.Destra;


                tabellaAree.Cells[0, i].ValueObjectList.Add(new ImagePDF(0, 1, dati.Tables["area"].Rows[i].ItemArray[0].ToString())
                {
                    DeltaX = 3,
                    DeltaY = 0,
                    Scale = 0.66f,
                    Height = 27,
                    Width = 145
                });
                var textArea = new FormattedTextAreaPDF(dati.Tables["area"].Rows[i].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, i].ValueObjectList.Add(textArea);

                i++;
            }
            #region Nota Copertura Aree
            if (getNota1().Length > 0)
                tabellaAree.Notes.Add(
                    new TableNotePDF(TableNotePDF.TableNotePositionType.PièDiTabella,
                                        getNota1(),
                                        new[] { "VaR" },
                                        string.Empty,
                                        TableNotePDF.TableNoteAsteriskPositionType.PieDiTabella) { FontSize = 6, DeltaY = 5, TextHorizontalAlign = ceTe.DynamicPDF.TextAlign.Justify });
            #endregion

            // Testo introduttivo
            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[2].Rows.Count == 1 && (sommaControvaloreAttuale + sommaControvaloreModello) == 0))
            //  return;
            TablePDF tabellaProgettiInvestimento = null;
            if (mostraTabellaProgettiInvestimento())
            {
                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));
                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, FontSize = 7 });
                tabellaProgettiInvestimento.Columns.Add(new ColumnPDF("Durata", 70, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Testo, "DurataResidua", "Durata<BR>residua") { HeaderFontSize = 7, HeaderPaddingLeft = 7, PaddingLeft = 7, FontSize = 7 });
                tabellaProgettiInvestimento.Columns.Add(new ColumnPDF("VaR", 40, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Testo, "Var", "VaR (%)") { HeaderFontSize = 7, FontSize = 7, HeaderPaddingRight = 5 });
                tabellaProgettiInvestimento.Columns.Add(new ColumnPDF("ControvaloreAttuale", 85, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Testo, "ControvaloreAttuale", "Controvalore<BR>attuale (€)") { HeaderPaddingLeft = 20, HeaderFontSize = 7, FontSize = 7 });
                tabellaProgettiInvestimento.Columns.Add(new ColumnPDF("ControvalorePianificato", 75, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Testo, "ControvalorePianificato", "Controvalore<BR>pianificato (€)") { HeaderPaddingRight = 7, HeaderFontSize = 7, FontSize = 7 });
                tabellaProgettiInvestimento.Columns.Add(new ColumnPDF("ControvaloreModello", 70, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Testo, "ControvaloreModello", "Controvalore<BR>modello (€)") { HeaderFontSize = 7, FontSize = 7, HeaderPaddingRight = 7 });
                tabellaProgettiInvestimento.Columns.Add(new ColumnPDF("Differenza", 70, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Testo, "DifferenzaString", "Differenza (€)") { HeaderFontSize = 7, FontSize = 7, HeaderPaddingRight = 2, PaddingRight = 4 });

                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", 40, HorizontalAlignmentType.Destra, false, true, 7, ColumnType.Testo) { FontSize = 7 });
                tabellaProgettiInvestimento.FooterColumns.Add(new ColumnPDF("ControvaloreAttuale", 85, HorizontalAlignmentType.Destra, false, true, 7, ColumnType.Testo) { FontSize = 7 });
                tabellaProgettiInvestimento.FooterColumns.Add(new ColumnPDF("ControvalorePianificato", 75, HorizontalAlignmentType.Destra, false, true, 7, ColumnType.Testo) { FontSize = 7 });
                tabellaProgettiInvestimento.FooterColumns.Add(new ColumnPDF("ControvaloreModello", 70, HorizontalAlignmentType.Destra, false, true, 7, ColumnType.Testo) { FontSize = 7 });
                tabellaProgettiInvestimento.FooterColumns.Add(new ColumnPDF("Differenza", 70, HorizontalAlignmentType.Destra, false, true, 7, ColumnType.Testo) { FontSize = 7 });
                int a = 0;
                foreach (DataRow r in dati.Tables["investimento"].Rows)
                {
                    tabellaProgettiInvestimento.Cells[3, a].Value = Helper.FormatCurrency(r["ControvaloreAttuale"].ToString());
                    tabellaProgettiInvestimento.Cells[4, a].Value = Helper.FormatCurrency(r["ControvalorePianificato"].ToString());
                    tabellaProgettiInvestimento.Cells[5, a].Value = Helper.FormatCurrency(r["ControvaloreModello"].ToString());

                    //tabellaProgettiInvestimento.Cells[6, a].Value = Helper.FormatCurrency(r[""].ToString());
                    tabellaProgettiInvestimento.Cells[2, a].HorizontalAlignment = HorizontalAlignmentType.Destra;
                    tabellaProgettiInvestimento.Cells[3, a].HorizontalAlignment = HorizontalAlignmentType.Destra;
                    tabellaProgettiInvestimento.Cells[4, a].HorizontalAlignment = HorizontalAlignmentType.Destra;
                    tabellaProgettiInvestimento.Cells[5, a].HorizontalAlignment = HorizontalAlignmentType.Destra;
                    tabellaProgettiInvestimento.Cells[6, a].HorizontalAlignment = HorizontalAlignmentType.Destra;
                    a++;
                }

                // Nota su grado di copertura dei progetti d'investimento
                #region Nota Copertura Progetti 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.Justify, DeltaY = 5 });
                #endregion

                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() && (sommaControvaloreAttuale + sommaControvaloreModello) == 0)
            //    return;
            if (dati.Tables["previdenza"].Rows.Count <= 0)
                return;

            if (mostraTabellaProgettiPrevidenza())
            {
                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(getNota2().Length > 0 ? 25 : 20));
                }                    

                // Testo introduttivo
                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, FontSize = 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", 40, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Testo, "Var", "VaR (%)") { HeaderFontSize = 7, FontSize = 7 });
                tabellaProgettiPrevidenza.Columns.Add(new ColumnPDF("ControvaloreAttuale", 85, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Decimale, "ControvaloreAttuale", "Controvalore<BR>attuale (€)") { HeaderFontSize = 7, FontSize = 7, HeaderPaddingLeft = 20 });
                tabellaProgettiPrevidenza.Columns.Add(new ColumnPDF("ControvalorePianificato", 75, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Decimale, "ControvalorePianificato", "Controvalore<BR>pianificato (€)") { HeaderFontSize = 7, FontSize = 7, HeaderPaddingRight = 7, });
                tabellaProgettiPrevidenza.Columns.Add(new ColumnPDF("ControvaloreModello", 70, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Decimale, "ControvaloreModello", "Controvalore<BR>modello (€)") { HeaderFontSize = 7, FontSize = 7, HeaderPaddingRight = 7, });
                tabellaProgettiPrevidenza.Columns.Add(new ColumnPDF("Differenza", 70, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Testo, "DifferenzaString", "Differenza (€)") { HeaderFontSize = 7, FontSize = 7, HeaderPaddingRight = 2, PaddingRight = 4 });

                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", 40, HorizontalAlignmentType.Destra, false, true, 7, ColumnType.Testo) { FontSize = 7 });
                tabellaProgettiPrevidenza.FooterColumns.Add(new ColumnPDF("ControvaloreAttuale", 85, HorizontalAlignmentType.Destra, false, true, 7, ColumnType.Decimale) { FontSize = 7 });
                tabellaProgettiPrevidenza.FooterColumns.Add(new ColumnPDF("ControvalorePianificato", 75, HorizontalAlignmentType.Destra, false, true, 7, ColumnType.Decimale) { FontSize = 7 });
                tabellaProgettiPrevidenza.FooterColumns.Add(new ColumnPDF("ControvaloreModello", 70, HorizontalAlignmentType.Destra, false, true, 7, ColumnType.Decimale) { FontSize = 7 });
                tabellaProgettiPrevidenza.FooterColumns.Add(new ColumnPDF("Differenza", 70, HorizontalAlignmentType.Destra, false, true, 7, ColumnType.Decimale) { FontSize = 7 });

                int b = 0;
                foreach (DataRow r in dati.Tables["previdenza"].Rows)
                {

                    tabellaProgettiPrevidenza.Cells[3, b].Value = Helper.FormatCurrency(r["ControvaloreAttuale"].ToString());
                    tabellaProgettiPrevidenza.Cells[4, b].Value = Helper.FormatCurrency(r["ControvalorePianificato"].ToString());
                    tabellaProgettiPrevidenza.Cells[5, b].Value = Helper.FormatCurrency(r["ControvaloreModello"].ToString());


                    tabellaProgettiPrevidenza.Cells[1, b].HorizontalAlignment = HorizontalAlignmentType.Destra;
                    tabellaProgettiPrevidenza.Cells[2, b].HorizontalAlignment = HorizontalAlignmentType.Destra;
                    tabellaProgettiPrevidenza.Cells[3, b].HorizontalAlignment = HorizontalAlignmentType.Destra;
                    tabellaProgettiPrevidenza.Cells[4, b].HorizontalAlignment = HorizontalAlignmentType.Destra;
                    tabellaProgettiPrevidenza.Cells[5, b].HorizontalAlignment = HorizontalAlignmentType.Destra;
                    tabellaProgettiPrevidenza.Cells[6, b].HorizontalAlignment = HorizontalAlignmentType.Destra;
                    b++;
                }

                #region Nota Copertura Progetti Investimento (Aree 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 });

                #endregion

                AddElement(tabellaProgettiPrevidenza);
            }
            #endregion
        }

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

        protected 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 Estrazione Chiave + Servizi

            var pianificazione = datiSeiUnico.all().pianificazioneUnit.pianificazioneVerticale;
            var patrimonioCasa = pianificazione.risorseFinanziarieBF;
            var piramideModello = datiSeiUnico.all().piramideModelloUnit.piramideModello.areaModello.Where(o => o.visible == true).OrderBy(o => o.ordinamento);
            var prodottiPatrimonioAltro = datiSeiUnico.pianificazioneUnit().pianificazioneVerticale;

            #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("ControvalorePianificato", typeof(decimal)));
            ds.Tables["area"].Columns.Add(new DataColumn("ControvaloreModello", 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 controvaloreModello = Math.Round((item.progettiPiramideModello.ToList().Sum(o => o.percentualeProgetto) / 100) * patrimonioCasa, 2);
                var differenza = areaInPianificazione.ctvPianificatoArea - controvaloreModello; //ControvalorePianificato - ControvaloreModello

                ds.Tables["area"].Rows.Add(
                    string.Format("{0}.png", new AreaBisogno(item.area).NomePerImmagine), //Area
                    item.descrizioneArea,
                    areaInPianificazione.varInfos.varDecodificato, //VaR
                    areaInPianificazione.ctvArea.ToString(), //ControvaloreAttuale
                    areaInPianificazione.ctvPianificatoArea.ToString(), //ControvalorePianificato
                    controvaloreModello.ToString(), //ControvaloreModello
                    differenza.ToString(), //Differenza
                    string.Format("{0}{1}", differenza > 0 ? "+" : string.Empty, Helper.FormatCurrency(differenza.ToString())) //DifferenzaString
                    );
            }

            #endregion

            #region Footer della tabella Aree


            var listaProdotti = new List<KeyValuePair<string, string>>();
            {


                if (datiSeiUnico.CASA_OC != 0)
                    listaProdotti.Add(new KeyValuePair<string, string>("Operazioni in corso", datiSeiUnico.CASA_OC.ToString()));

                if (datiSeiUnico.CASA_CCN != 0)
                    listaProdotti.Add(new KeyValuePair<string, string>("Conto corrente", datiSeiUnico.CASA_CCN.ToString()));

                if (datiSeiUnico.CASA_GPELIGO != 0)
                    listaProdotti.Add(new KeyValuePair<string, string>("Liquidità negativa GP Eligo ", datiSeiUnico.CASA_GPELIGO.ToString()));

                // 20181010 AC
                if (datiSeiUnico.CASA_TUOFOGLIO != 0)
                    listaProdotti.Add(new KeyValuePair<string, string>("Liquidità negativa Il Mio Foglio ", datiSeiUnico.CASA_TUOFOGLIO.ToString()));
                //--20181010 AC
            }



            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(string)));
            ds.Tables["areafooter"].Columns.Add(new DataColumn("Colonna4", typeof(string)));
            ds.Tables["areafooter"].Columns.Add(new DataColumn("Colonna5", typeof(string)));
            ds.Tables["areafooter"].Columns.Add(new DataColumn("Colonna6", typeof(string)));
            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)));

            if (listaProdotti.Count > 0)
            {
                //pianificazioneUnit().pianificazioneVerticale().totPatrimonioPianificato
                ds.Tables["areafooter"].Rows.Add(
                    "Totale risorse allocate",
                    pianificazione.varRisorseAllocateInfos.varDecodificato,
                    Helper.FormatCurrency(datiSeiUnico.CASA_SUBTOTALE.ToString()),
                    Helper.FormatCurrency(pianificazione.totRisorseFinanziarePianificato.ToString()),
                    Helper.FormatCurrency(pianificazione.risorseFinanziarieBF.ToString()),
                    Helper.FormatCurrency(Convert.ToDecimal(ds.Tables["area"].Compute("Sum(Differenza)", string.Empty)).ToString()),
                    "",
                    "0,00",
                    true,
                    true
                    );


                foreach (var item in listaProdotti)
                {
                    ds.Tables["areafooter"].Rows.Add(
                           item.Key, //Colonna1 altro
                           "n.c.", //Colonna2 var
                           Helper.FormatCurrency(item.Value),
                           Helper.FormatCurrency(item.Value),
                           "n.c.",
                           "n.c.",
                           "n.c.",
                           "n.c.",
                           false,
                           false
                           );

                }

            }
            ds.Tables["areafooter"].Rows.Add(
               string.Format("Patrimonio {0}", Helper.ReplaceVariables("$/Banca/$", EnvironmentFacade.ReportEnvironment)),
               pianificazione.varInfos.varDecodificato,
               Helper.FormatCurrency(datiSeiUnico.CASA_TOTALE.ToString()),               
               Helper.FormatCurrency(pianificazione.totPatrimonioPianificato.ToString()),
               Helper.FormatCurrency(pianificazione.patrimonioTotaleRFA.ToString()),
               Helper.FormatCurrency(Convert.ToDecimal(ds.Tables["area"].Compute("Sum(Differenza)", string.Empty)).ToString()),
                 "",
                 "0,00",
               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 * patrimonioCasa) != 0)
            //        visualizzaInvestimento = true;
            //}
            if (mostraTabellaProgettiInvestimento())
            {
                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("ControvalorePianificato", typeof(decimal)));
                ds.Tables["investimento"].Columns.Add(new DataColumn("ControvaloreModello", 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)));

                foreach (var item in pianificazione.aree.FirstOrDefault(o => o.area.Equals("Inv")).progetti.OrderByDescending(x => x.ctvProgetto))
                {
                    var controvaloreModello = Math.Round((item.progettoModello.percentualeProgetto / 100) * patrimonioCasa, 2);
                    var differenza = item.ctvPianificato - controvaloreModello;
                    //  var itemmonitoraggio = datiSeiUnico.monitoraggioUnit().monitoraggio.Where(o => o.area.Equals("Inv")).ToList(); //i => i.chiaveProgetto = item.progettoModello.chiaveProgettoMod));
                    //var mon = itemmonitoraggio.FirstOrDefault(o=>o.progetti.FirstOrDefault(p=>p.chiaveProgetto==item.progettoModello.chiaveProgettoMod) != null)?itemmonitoraggio.FirstOrDefault(o=>o.progetti.FirstOrDefault(p=>p.chiaveProgetto==item.progettoModello.chiaveProgettoMod).posizioniMonitorate.;
                    ds.Tables["investimento"].Rows.Add(
                         item.progettoModello.nomeProgetto, //Progetto
                         item.durataResidua == null ? "-" : item.durataResidua,
                        // item.progettoModello.durata, //DurataResidua data avvio monitoraggio + anni orizzonte temporale selezionato in piramide modello) - data oggi
                        item.progettoVarInfos.varDecodificato, // VaR
                        item.ctvProgetto.ToString(), // ControvaloreAttuale
                        item.ctvPianificato.ToString(), // ControvalorePianificato
                        controvaloreModello.ToString(), // ControvaloreModello                  
                        differenza.ToString(), // Differenza
                        string.Format("{0}{1}", differenza > 0 ? "+" : string.Empty, Helper.FormatCurrency(differenza.ToString())), //DifferenzaString
                        true);
                }

                //tmp
                //ds.Tables["investimento"].Rows.RemoveAt(0);
                //ds.Tables["investimento"].Rows.RemoveAt(0);
                //ds.Tables["investimento"].Rows.Add("Test", "test", "0", 0m, 0m, 0m, 0m, "0", true);

                #endregion

                #region Footer della tabella Progetti Investimento
                
                var areaInvestimentoInPianificazione = pianificazione.aree.FirstOrDefault(o => o.area.Equals("Inv"));

                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(string)));
                ds.Tables["investimentofooter"].Columns.Add(new DataColumn("Colonna5", typeof(string)));
                ds.Tables["investimentofooter"].Columns.Add(new DataColumn("Colonna6", typeof(string)));
                ds.Tables["investimentofooter"].Columns.Add(new DataColumn("Colonna7", typeof(string)));
                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)));

                string asterisco = "";
                asterisco = (getNota1().Length > 0 ? "*" : "");
                var col1 = Convert.ToDecimal(ds.Tables["investimento"].Compute("Sum(ControvaloreAttuale)", string.Empty)).ToString();
                var col2 = Convert.ToDecimal(ds.Tables["investimento"].Compute("Sum(ControvalorePianificato)", string.Empty)).ToString();
                var col3 = Convert.ToDecimal(ds.Tables["investimento"].Compute("Sum(ControvaloreModello)", string.Empty)).ToString();
                var col4 = Convert.ToDecimal(ds.Tables["investimento"].Compute("Sum(Differenza)", string.Empty)).ToString();

                ds.Tables["investimentofooter"].Rows.Add(
                    "Totale Investimento",
                    "",
                    areaInvestimentoInPianificazione.varInfos.varDecodificato,// + asterisco + (getNota2().Length > 0 ? "*" : ""),
                   Helper.FormatCurrency(col1),// Convert.ToDecimal(ds.Tables["investimento"].Compute("Sum(ControvaloreAttuale)", string.Empty)).ToString(),
                   Helper.FormatCurrency(col2),
                   Helper.FormatCurrency(col3),
                   Helper.FormatCurrency(col4),
                    "",
                    true, //FontBold
                    true //BackgroundGray
                    );
            }
            #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 * patrimonioCasa) != 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("ControvalorePianificato", typeof(decimal)));
            ds.Tables["previdenza"].Columns.Add(new DataColumn("ControvaloreModello", 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)
                {
                    var controvaloreModello = Math.Round((item.progettoModello.percentualeProgetto / 100) * patrimonioCasa, 2);
                    var differenza = item.ctvPianificato - controvaloreModello;

                    ds.Tables["previdenza"].Rows.Add(
                        item.progettoModello.nomeProgetto, //Progetto   
                        "",
                        item.progettoVarInfos.varDecodificato, // VaR
                        item.ctvProgetto.ToString(), // ControvaloreAttuale
                        item.ctvPianificato.ToString(), // ControvalorePianificato
                        controvaloreModello.ToString(), // ControvaloreModello                  
                        differenza.ToString(), // 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(string)));
                ds.Tables["previdenzafooter"].Columns.Add(new DataColumn("Colonna5", typeof(string)));
                ds.Tables["previdenzafooter"].Columns.Add(new DataColumn("Colonna6", typeof(string)));
                ds.Tables["previdenzafooter"].Columns.Add(new DataColumn("Colonna7", typeof(string)));
                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)));
                var col1p = Convert.ToDecimal(ds.Tables["previdenza"].Compute("Sum(ControvaloreAttuale)", string.Empty)).ToString();
                var col2p = Convert.ToDecimal(ds.Tables["previdenza"].Compute("Sum(ControvalorePianificato)", string.Empty)).ToString();
                var col3p = Convert.ToDecimal(ds.Tables["previdenza"].Compute("Sum(ControvaloreModello)", string.Empty)).ToString();
                var col4p = Convert.ToDecimal(ds.Tables["previdenza"].Compute("Sum(Differenza)", string.Empty)).ToString();


                ds.Tables["previdenzafooter"].Rows.Add(
                    "Totale Previdenza",
                    "",
                    areaPrevidenzaInPianificazione.varInfos.varDecodificato,// + asterisco + (getNota3().Length > 0 ? "*" : ""),
                    Helper.FormatCurrency(col1p),
                    Helper.FormatCurrency(col2p),
                    Helper.FormatCurrency(col3p),
                    Helper.FormatCurrency(col4p),



                    "",
                    true, //FontBold
                    true //BackgroundGray
                    );
            }
            #endregion

            return ds;
        }






        public virtual bool mostraTabellaProgettiInvestimento()
        {
            var pianificazioneVerticale =  datiSeiUnico.all().pianificazioneUnit.pianificazioneVerticale;
            var Inv = pianificazioneVerticale.aree.FirstOrDefault(o => o.area.Equals("Inv"));
            if (Inv != null)
            {
                if (Inv.progetti.AsEnumerable().Sum(x => x.ctvProgetto) != 0 ||
                    Inv.progetti.Sum(x => x.ctvPianificato) != 0 ||
                    Inv.progetti.Sum(x => x.progettoModello.percentualeProgetto / 100 * pianificazioneVerticale.risorseFinanziarieBF) != 0)
                    return GetOption<Opzione4_1>().Valore;
            }             
            return false;          
        }

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

        public virtual string getTesto1()
        {
            string nota = "Nella tabella sottostante sono riportate, per ogni area di bisogno, l'allocazione corrente e quella ottimale delle risorse finanziarie che lei detiene presso $/Banca/$. Inoltre viene mostrato il controvalore pianificato su ogni area di bisogno e il relativo scostamento rispetto all'allocazione modello.";
            return Helper.ReplaceVariables(nota, EnvironmentFacade.ReportEnvironment);
        }

        public virtual string getTesto2()
        {
            string nota = "Nella tabella sottostante sono riportate l'allocazione corrente e quella ottimale delle risorse finanziarie, che lei detiene presso $/Banca/$, destinate ai singoli progetti di investimento. Inoltre viene mostrato il controvalore pianificato su ogni progetto di investimento e il relativo scostamento rispetto all'allocazione modello.";
            return Helper.ReplaceVariables(nota, EnvironmentFacade.ReportEnvironment);
        }

        public virtual string getTesto3()
        {
            string nota = "Nella tabella sottostante sono riportate l'allocazione corrente e quella ottimale delle risorse finanziarie, che lei detiene presso $/Banca/$, destinate alle aree \"Previdenza Essenziale\" e \"Previdenza Secondaria\". Inoltre viene mostrato il controvalore pianificato su ognuna delle due aree, e il relativo scostamento rispetto all'allocazione modello.";
            return Helper.ReplaceVariables(nota, EnvironmentFacade.ReportEnvironment);
        }



        public virtual string getNota1()
        {
            var pianificazione = datiSeiUnico.all().pianificazioneUnit.pianificazioneVerticale;
            var gradoCoperturaAree = Math.Round(pianificazione.varInfos.stat.copertura, 2);
            string nota = "";
            if (gradoCoperturaAree < 100)
            {
                nota += "Grado di copertura prodotti in termini di Rischio Mercato (VaR): {0}.";
            }
            return string.Format(nota, Helper.FormatDecimal(gradoCoperturaAree.ToString(), 2));
        }

        public virtual string getNota2()
        {
            var pianificazione = datiSeiUnico.all().pianificazioneUnit.pianificazioneVerticale;
            var gradoCoperturaAreaInvestimento = pianificazione.aree.FirstOrDefault(o => o.area.Equals("Inv")).varInfos.stat.copertura;
            string nota = "";
            if (gradoCoperturaAreaInvestimento < 100 && gradoCoperturaAreaInvestimento != Convert.ToDecimal("0,00"))
            {
                nota += "Grado di copertura prodotti in termini di Rischio Mercato (VaR): {0}.";
            }
            return string.Format(nota, Helper.FormatDecimal(gradoCoperturaAreaInvestimento.ToString(), 2));
        }

        public virtual string getNota3()
        {
            var pianificazione = datiSeiUnico.all().pianificazioneUnit.pianificazioneVerticale;
            var gradoCoperturaAreaPrevidenza = pianificazione.aree.FirstOrDefault(o => o.area.Equals("Pre")).varInfos.stat.copertura;
            string nota = "";

            if (gradoCoperturaAreaPrevidenza < 100 && gradoCoperturaAreaPrevidenza != Convert.ToDecimal("0,00"))
            {
                nota += "Grado di copertura prodotti in termini di Rischio Mercato (VaR): {0}.";
            }
            return string.Format(nota, Helper.FormatDecimal(gradoCoperturaAreaPrevidenza.ToString(), 2));
        }

    }
}
