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

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

        protected override sealed void Draw()
        {

            var dati = GetDataSet();
            if (TestoIntroduttivo().Length > 0)
            {
                AddElement(new SpacePDF(20));
                AddElement(new FormattedTextAreaPDF(TestoIntroduttivo(), EnvironmentFacade.RendererFacade.XLeftLimit) { FontSize = 7, TextHorizontalAlign = ceTe.DynamicPDF.TextAlign.Justify });
                AddElement(new SpacePDF(10));
            }

            int i = 0;

            if (dati.Tables["piramide"].Rows.Count > 0)
            {
                #region Tabella delle Aree di Bisogno

                #region Definizione e Creazione
                var tabellaAree = new TablePDF(EnvironmentFacade.RendererFacade.XLeftLimit, dati.Tables["piramide"])//, dati.Tables["piramideFooter"])
                {
                    Style = Style.ConsulenzaUnica,
                    AlternateRow = false,
                    ShowSeparationLines = false,
                    RowsPadding = 10,
                    HideLastSeparationLine = false,
                    Footer = false
                };

                tabellaAree.Columns.Add(new ColumnPDF("Area2", 125, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Objectpdf, "Area", "Area di bisogno") { HeaderFontSize = 7, FontSize = 7, DeltaYContent = 2, ScaleColumnTypeImage = 0.5F });
                tabellaAree.Columns.Add(new ColumnPDF("ControvaloreAttuale", 77, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Decimale, "ControvaloreAttuale", "Controvalore<BR>attuale (€)") { HeaderFontSize = 7, FontSize = 7, DeltaYContent = 4, HeaderPaddingLeft = 25 });
                tabellaAree.Columns.Add(new ColumnPDF("VaR", 50, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Testo, "Var", "VaR (%)") { HeaderFontSize = 7, FontSize = 7, DeltaYContent = 4, PaddingRight = 11, HeaderPaddingLeft = 10 });
                tabellaAree.Columns.Add(new ColumnPDF("PesoRelativoObject", 135, HorizontalAlignmentType.Destra, false, false, 7, ColumnType.Objectpdf, "PesoRelativo", "Peso relativo (%)") { HeaderFontSize = 7, FontSize = 7, DeltaYContent = 4, HeaderPaddingRight = 5 });
                tabellaAree.Columns.Add(new ColumnPDF("RischioRelativoObject", 135, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Objectpdf, "RischioRelativo", "Rischio relativo (%)") { HeaderFontSize = 7, FontSize = 7, DeltaYContent = 4, PaddingLeft = 10, HeaderPaddingLeft = 10 });

                #endregion

                #region Allineamento Celle Numeriche a destra
                int a = 0;
                foreach (var item in dati.Tables["piramide"].Rows)
                {
                    tabellaAree.Cells[1, a].HorizontalAlignment = HorizontalAlignmentType.Destra;
                    tabellaAree.Cells[2, a].HorizontalAlignment = HorizontalAlignmentType.Destra;
                    //tabellaAree.Cells[3, a].HorizontalAlignment = HorizontalAlignmentType.Destra;


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

                    a++;
                }
                #endregion

                #region Creazione Stacked Bar
                var list = new List<double>();
                list.Add(Convert.ToDouble(dati.Tables["piramide"].AsEnumerable().Max(x => x["PesoRelativo"])));
                list.Add(Convert.ToDouble(dati.Tables["piramide"].AsEnumerable().Max(x => x["RischioRelativo"])));
                var valoreMassimo = (float)Helper.Round(list.Max());
                float larghezzaBarra = 0;
                float larghezzaSpazioTestoPercentuale = 0;
                float larghezzaMinimaSpazioTestoPercentuale = 35;
                float deltaXBarra = 0;
                float width = tabellaAree.Columns[3].Width - 50;
                foreach (DataRow row in dati.Tables["piramide"].Rows)
                {
                    var colore = new ColorPDF(Convert.ToInt32(row["Red"]), Convert.ToInt32(row["Green"]), Convert.ToInt32(row["Blue"]));

                    #region barra colonna PesoRelativo
                    larghezzaBarra = Helper.GetWidthProportional((float)Convert.ToDecimal(row["PesoRelativo"]), valoreMassimo, tabellaAree.Columns[3].Width - 50);
                    larghezzaSpazioTestoPercentuale = tabellaAree.Columns[3].Width - larghezzaBarra;
                    deltaXBarra = -larghezzaBarra - 10;
                    if (larghezzaSpazioTestoPercentuale < larghezzaMinimaSpazioTestoPercentuale)
                    {
                        deltaXBarra = -(tabellaAree.Columns[3].Width - larghezzaMinimaSpazioTestoPercentuale);
                        larghezzaSpazioTestoPercentuale = larghezzaMinimaSpazioTestoPercentuale;
                    }
                    if (Convert.ToDouble(row["ControvaloreAttuale"]) == 0)
                    {
                        tabellaAree.Cells[3, i].ValueObjectList = new List<Business.Entity.ObjectPDF>()
                        {
                            new RectanglePDF(12, 1 , ColorPDF.Bianco),
                            new FormattedTextAreaPDF(row["PesoRelativo"].ToString()=="0.00"? "0.00" : Helper.FormatDecimal(Convert.ToDecimal(row["PesoRelativo"]).ToString(), 2),
                                                        0, larghezzaSpazioTestoPercentuale)
                            {
                                DeltaY = 2,
                                TextHorizontalAlign = ceTe.DynamicPDF.TextAlign.Right,
                                DeltaX = deltaXBarra,
                                FontSize = 7
                            }
                        };
                    }
                    else
                    {
                        tabellaAree.Cells[3, i].ValueObjectList = new List<Business.Entity.ObjectPDF>()
                        {
                            new RectanglePDF(12, larghezzaBarra , colore),
                            new FormattedTextAreaPDF(row["PesoRelativo"].ToString()=="0.00"? "0.00" : Helper.FormatDecimal(Convert.ToDecimal(row["PesoRelativo"]).ToString(), 2),
                                                        0, larghezzaSpazioTestoPercentuale)
                            {
                                DeltaY = 2,
                                TextHorizontalAlign = ceTe.DynamicPDF.TextAlign.Right,
                                DeltaX = deltaXBarra,
                                FontSize = 7
                            }
                        };
                    }

                    #endregion

                    #region barra colonna RischioRelativo
                    larghezzaBarra = Helper.GetWidthProportional((float)Convert.ToDecimal(row["RischioRelativo"]), valoreMassimo, tabellaAree.Columns[4].Width - 50);
                    larghezzaSpazioTestoPercentuale = tabellaAree.Columns[4].Width - larghezzaBarra;
                    deltaXBarra = larghezzaBarra + 10;
                    if (larghezzaSpazioTestoPercentuale < larghezzaMinimaSpazioTestoPercentuale)
                    {
                        deltaXBarra = (tabellaAree.Columns[4].Width - larghezzaMinimaSpazioTestoPercentuale);
                        larghezzaSpazioTestoPercentuale = larghezzaMinimaSpazioTestoPercentuale;
                    }
                    if (row["VaR"].ToString() == "n.c.")
                    {
                        tabellaAree.Cells[4, i].ValueObjectList = new List<Business.Entity.ObjectPDF>()
                            {
                                new RectanglePDF(12, 1, ColorPDF.Bianco),
                                new FormattedTextAreaPDF( "n.c.",
                                                        0,
                                                        30 )
                                {
                                DeltaY = 2,
                                TextHorizontalAlign = ceTe.DynamicPDF.TextAlign.Left,
                                DeltaX = deltaXBarra,
                                FontSize = 7
                                }
                            };
                    }
                    else
                    {
                        tabellaAree.Cells[4, i].ValueObjectList = new List<Business.Entity.ObjectPDF>()
                        {
                            new RectanglePDF(12, larghezzaBarra, colore),
                            new FormattedTextAreaPDF(   Helper.FormatDecimal(Convert.ToDecimal(row["Rischiorelativo"]).ToString(), 2),
                                                        0,
                                                        larghezzaSpazioTestoPercentuale)
                            {
                                DeltaY = 2,
                                TextHorizontalAlign = ceTe.DynamicPDF.TextAlign.Left,
                                DeltaX = deltaXBarra,
                                FontSize = 7
                            }
                        };
                    }


                    #endregion

                    i++;
                }
                #endregion

                AddElement(tabellaAree);

                if (dati.Tables["piramideFooter"].Rows.Count > 0)
                {
                    AddElement(new SpacePDF(2));
                    AddElement(new LinePDF(EnvironmentFacade.RendererFacade.XLeftLimit - 0.5F, EnvironmentFacade.RendererFacade.XLeftLimit + 252.5f, 0.9f, new ColorPDF(127, 127, 127)));
                    var tabellaCCN = new TablePDF(EnvironmentFacade.RendererFacade.XLeftLimit, dati.Tables["piramideFooter"])
                    {
                        Style = Style.ConsulenzaUnica,
                        Header = false,
                        AlternateRow = false,
                        HeaderHeight = 1,
                        HeaderMargin = 2,
                        HideLastSeparationLine = true,
                        ShowSeparationLines = false,
                        Footer = false
                    };

                    tabellaCCN.Columns.Add(new ColumnPDF("Patrimonio", 125, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Testo, "Area", "") { HeaderFontSize = 7, FontSize = 7 });
                    tabellaCCN.Columns.Add(new ColumnPDF("Controvalore", 77, HorizontalAlignmentType.Destra, false, false, 7, ColumnType.Decimale, "ControvaloreAttuale", "") { HeaderFontSize = 7, FontSize = 7, PaddingLeft = 2 });
                    tabellaCCN.Columns.Add(new ColumnPDF("VaR", 50, HorizontalAlignmentType.Destra, false, false, 7, ColumnType.Decimale, "Var", "") { HeaderFontSize = 7, FontSize = 7, PaddingRight = 7 });

                    AddElement(tabellaCCN);

                    #region Nota tabella 1
                    if (GetNota().Length > 0)
                    {
                        tabellaCCN.Notes.Add(
                            new TableNotePDF(TableNotePDF.TableNotePositionType.PièDiTabella,
                                            GetNota(),
                                            new[] { "VaR" },
                                            string.Empty,
                                            TableNotePDF.TableNoteAsteriskPositionType.PieDiTabella)
                            { FontSize = 6, TextHorizontalAlign = ceTe.DynamicPDF.TextAlign.Justify });
                        AddElement(new SpacePDF(10));
                    }
                    #endregion


                }


                #endregion
            }

            if (dati.Tables["prodotti"].Rows.Count > 0)
            {
                #region Tabella Prodotti

                #region Definizione e Creazione
                var tabellaProdotti = new TablePDF(EnvironmentFacade.RendererFacade.XLeftLimit, dati.Tables["prodotti"])
                {
                    Style = Style.ConsulenzaUnica,
                    AlternateRow = false,
                    ShowSeparationLines = false,
                    Footer = false,
                    HideLastSeparationLine = true
                    //,RowHeight = 22
                };

                // 188
                tabellaProdotti.Columns.Add(new ColumnPDF("Immagine", 188, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Objectpdf, string.Empty, "Prodotto") { HeaderFontSize = 7, FontSize = 7, DeltaYContent = 4, PaddingLeft = 2 });
                // tabellaProdotti.Columns.Add(new ColumnPDF("Prodotto", 155, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Objectpdf, "", "Prodotto") { HeaderFontSize = 7, FontSize = 7, PaddingLeft = 5 });
                
                
                // Modifica per Saving Map
                //tabellaProdotti.Columns.Add(new ColumnPDF("SavingMap", 10, HorizontalAlignmentType.Destra, false, false, 6, ColumnType.Immagine, "SavingMap", string.Empty) { DeltaYContent = 6, ScaleColumnTypeImage = 0.50F, PaddingRight = 20 });                
                // Fine Modifica


                tabellaProdotti.Columns.Add(new ColumnPDF("ControvaloreAttuale", 90, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Decimale, "ControvaloreAttuale", "Controvalore <br>attuale (€)") { HeaderFontSize = 7, FontSize = 7, HeaderPaddingLeft = 6 });
                tabellaProdotti.Columns.Add(new ColumnPDF("VaR", 40, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Testo, "VaR", "VaR (%)") { HeaderFontSize = 7, FontSize = 7, PaddingRight = 6, HeaderPaddingLeft = 6 });
                tabellaProdotti.Columns.Add(new ColumnPDF("PesoRelativoObject", 100, HorizontalAlignmentType.Destra, false, false, 7, ColumnType.Objectpdf, "PesoRelativo", "Peso relativo (%)") { HeaderFontSize = 7, FontSize = 7, HeaderPaddingRight = 10, DeltaYContent = 4 });
                tabellaProdotti.Columns.Add(new ColumnPDF("RischioRelativoObject", 100, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Objectpdf, "RischioRelativo", "Rischio relativo (%)") { HeaderFontSize = 7, FontSize = 7, PaddingLeft = 10, HeaderPaddingLeft = 10, DeltaYContent = 4 });
                #endregion

                #region Allineamento Celle Numeriche a destra
                int a = 0;
                foreach (var item in dati.Tables["prodotti"].Rows)
                {
                    tabellaProdotti.Cells[1, a].HorizontalAlignment = HorizontalAlignmentType.Destra;
                    tabellaProdotti.Cells[2, a].HorizontalAlignment = HorizontalAlignmentType.Destra;
                    //tabellaProdotti.Cells[4, a].HorizontalAlignment = HorizontalAlignmentType.Destra;
                    a++;
                }
                #endregion

                #region Creazione Stacked Bar
                i = 0;
                var list = new List<double>();
                list.Add(Convert.ToDouble(dati.Tables["prodotti"].AsEnumerable().Max(x => x["PesoRelativo"])));
                list.Add(Convert.ToDouble(dati.Tables["prodotti"].AsEnumerable().Max(x => x["RischioRelativo"])));
                float valoreMassimo = (float)Helper.Round(list.Max());
                float larghezzaBarra = 0;
                float larghezzaSpazioTestoPercentuale = 0;
                float larghezzaMinimaSpazioTestoPercentuale = 35;
                float deltaXBarra = 0;
                foreach (DataRow row in dati.Tables["prodotti"].Rows)
                {
                    var colore = new ColorPDF(131, 188, 180);

                    #region simboli dell'area di bisogno nella prima colonna
                    float deltaXSwitch;
                    float deltaYSwitch;
                    switch (row["CodiceAreaBisogno"].ToString().ToUpper())
                    {
                        case "EXT":
                            deltaXSwitch = 1.5F;
                            deltaYSwitch = -0.3F;
                            break;
                        case "INV":
                            deltaXSwitch = 2.2F;
                            deltaYSwitch = -0.4F;
                            break;
                        case "PRE":
                            deltaXSwitch = 1.8F;
                            deltaYSwitch = -0.3F;
                            break;
                        case "RIS":
                            deltaXSwitch = 1.3F;
                            deltaYSwitch = -0.3F;
                            break;
                        case "LIQ":
                            deltaXSwitch = 1.5F;
                            deltaYSwitch = -0.2F;
                            break;
                        default:
                            deltaXSwitch = 2;
                            deltaYSwitch = 0;
                            break;
                    }

                    // tabellaProdotti.Cells[0, i].ColSpan = 2;
                    var listaOggetti = new List<ObjectPDF> {
                                new RectanglePDF(8, 8, ColorPDF.GetBy_AreaBisogno(row["CodiceAreaBisogno"].ToString())),
                                new FormattedTextAreaPDF
                                {
                                    Text = new AreaBisogno(row["CodiceAreaBisogno"].ToString()).Abbreviazione,
                                    FontBold = true,
                                    FontColor = ColorPDF.Bianco,
                                    DeltaX = deltaXSwitch,
                                    DeltaY = deltaYSwitch,
                                    FontSize=7
                                },
                                new ImagePDF(0, 1, row["SavingMap"].ToString())
                                {
                                    DeltaX = deltaXSwitch + 4,
                                    DeltaY = deltaYSwitch + 10,
                                    Scale = 0.7f
                                },
                                new FormattedTextAreaPDF
                                {
                                    Text = row["Prodotto"].ToString(),
                                    FontBold = false,
                                    FontColor = ColorPDF.Nero,
                                    DeltaX = 22,
                                    FontSize=7,

                                    Width=170
                                }
                            };
                    tabellaProdotti.Cells[0, i].ValueObjectList.AddRange(listaOggetti);


                    #endregion

                    #region barra colonna PesoRelativo
                    larghezzaBarra = Helper.GetWidthProportional((float)Convert.ToDecimal(row["PesoRelativo"]), valoreMassimo, tabellaProdotti.Columns[3].Width - 50);
                    larghezzaSpazioTestoPercentuale = tabellaProdotti.Columns[3].Width - larghezzaBarra;
                    deltaXBarra = -larghezzaBarra - 10;
                    if (larghezzaSpazioTestoPercentuale < larghezzaMinimaSpazioTestoPercentuale)
                    {
                        deltaXBarra = -(tabellaProdotti.Columns[3].Width - larghezzaMinimaSpazioTestoPercentuale);
                        larghezzaSpazioTestoPercentuale = larghezzaMinimaSpazioTestoPercentuale;
                    }

                    tabellaProdotti.Cells[3, i].ValueObjectList = new List<Business.Entity.ObjectPDF>()
                        {
                            new RectanglePDF(11, larghezzaBarra , colore),
                            new FormattedTextAreaPDF(row["PesoRelativo"].ToString()=="0.00"? "0.00" : Helper.FormatDecimal(Convert.ToDecimal(row["PesoRelativo"]).ToString(), 2),
                                                        0,
                                                        larghezzaSpazioTestoPercentuale)
                            {

                                TextHorizontalAlign = ceTe.DynamicPDF.TextAlign.Right,
                                DeltaX = deltaXBarra,
                                FontSize = 7
                            }
                        };

                    #endregion

                    #region barra colonna RischioRelativo
                    larghezzaBarra = Helper.GetWidthProportional((float)Convert.ToDecimal(row["RischioRelativo"]), valoreMassimo, tabellaProdotti.Columns[4].Width - 50);
                    larghezzaSpazioTestoPercentuale = tabellaProdotti.Columns[4].Width - larghezzaBarra;
                    deltaXBarra = larghezzaBarra + 10;
                    if (larghezzaSpazioTestoPercentuale < larghezzaMinimaSpazioTestoPercentuale)
                    {
                        deltaXBarra = (tabellaProdotti.Columns[4].Width - larghezzaMinimaSpazioTestoPercentuale);
                        larghezzaSpazioTestoPercentuale = larghezzaMinimaSpazioTestoPercentuale;
                    }
                    if (row["VaR"].ToString() == "n.c.")
                    {
                        tabellaProdotti.Cells[4, i].ValueObjectList = new List<Business.Entity.ObjectPDF>()
                            {
                                new RectanglePDF(11, 1, ColorPDF.Bianco),
                            new FormattedTextAreaPDF( "n.c.",
                                                        0,
                                                        30 )
                            {
                                TextHorizontalAlign = ceTe.DynamicPDF.TextAlign.Left,
                                DeltaX = deltaXBarra-5,
                                FontSize = 7
                            }
                            };
                    }
                    else
                    {
                        tabellaProdotti.Cells[4, i].ValueObjectList = new List<Business.Entity.ObjectPDF>()
                        {
                            new RectanglePDF(11,row["RischioRelativo"].ToString()=="0" ? 1 : larghezzaBarra,row["RischioRelativo"].ToString()=="0" ?ColorPDF.Bianco : colore),
                            new FormattedTextAreaPDF(row["RischioRelativo"].ToString()=="0"? "0,00" : Helper.FormatDecimal(Convert.ToDecimal(row["RischioRelativo"]).ToString(), 2),
                                                        0,
                                                        larghezzaSpazioTestoPercentuale )
                            {
                                TextHorizontalAlign = ceTe.DynamicPDF.TextAlign.Left,
                                DeltaX = deltaXBarra,
                                FontSize = 7
                            }
                        };
                    }
                    #endregion

                    i++;
                }

                AddElement(new SpacePDF(10));
                #endregion

                AddElement(tabellaProdotti);

                #endregion

                #region Legenda

                AddElement(new SpacePDF(20));
                float xLegenda = base.EnvironmentFacade.RendererFacade.XLeftLimit;
                DataTable dtlegenda = new DataTable();
                dtlegenda = dati.Tables["legenda"].AsEnumerable().OrderBy(r => r.Field<int>("Ordinamento")).CopyToDataTable();
                foreach (DataRow item in dtlegenda.Rows)
                {
                    AddElement(new RectanglePDF(8, 8, ColorPDF.GetBy_AreaBisogno(item["CodiceAreaBisogno"].ToString())) { X = xLegenda, AutoIncrementYWritable = false });

                    AddElement(new FormattedTextAreaPDF
                    {
                        Text = new AreaBisogno(item["CodiceAreaBisogno"].ToString()).Abbreviazione,
                        FontBold = true,
                        FontColor = ColorPDF.Bianco,
                        DeltaX = 2F,
                        AutoIncrementYWritable = false,
                        X = xLegenda,
                        FontSize = 6
                    });
                    xLegenda += 10;

                    var ftaNomeAreaBisogno = new FormattedTextAreaPDF
                    {
                        Text = new AreaBisogno(item["CodiceAreaBisogno"].ToString()).Nome,
                        DeltaX = 2F,
                        AutoIncrementYWritable = false,
                        X = xLegenda,
                        FontSize = 6
                    };

                    xLegenda += (ftaNomeAreaBisogno.Text.Length * 5) + (10 - ftaNomeAreaBisogno.Text.Length);
                    //xLegenda += (string)Unit.Pixel(new AreaBisogno(item["CodiceAreaBisogno"].ToString()).Nome.Length + 10);
                    //xLegenda += Graphics.MeasureString(new AreaBisogno(item["CodiceAreaBisogno"].ToString()).Nome, 7);//ftaNomeAreaBisogno.Width + 10; //new AreaBisogno(item["CodiceAreaBisogno"].ToString()).Nome.Length + 50;//100;
                    AddElement(ftaNomeAreaBisogno);
                }
                #endregion
            }
        }//Draw

        protected sealed override DataTable GetDataTable()
        {
            return null;
        }//GetDataTable

        protected sealed override DataSet GetDataSet()
        {
            #region Creazione Dataset
            var ds = new DataSet();
            ds.Tables.Add(new DataTable("piramide"));
            ds.Tables.Add(new DataTable("piramideFooter"));
            ds.Tables.Add(new DataTable("prodotti"));
            ds.Tables.Add(new DataTable("legenda"));
            #endregion

            #region Estrazione dati
            var pianificazioneVerticale = datiSeiUnico.pianificazioneUnit().pianificazioneVerticale;
            var rischioAreeProgetti = datiSeiUnico.rischioUnit().rischio.areeProgetti.aree.ToList();
            var totale = datiSeiUnico.rischioUnit().rischio.areeProgetti.total;
            var financialResources = datiSeiUnico.rischioUnit().rischio.areeProgetti.financialResources;
            var displayInfo = datiSeiUnico.displayInfos().areeDisplayInfos.ToList();
            var posizioni = datiSeiUnico.patrimonioUnit().patrimonioCasa.dettaglioProdotti.dettaglioProdotti.ToList();
            var rischioProdotti = datiSeiUnico.rischioUnit().rischio.prodotti.items;
            //gestito per i nuclei
            var rischioProdottiNucleo = datiSeiUnico.rischioUnit().rischio.rischioRelativoDistAsset.classes;
            #endregion

            


            //r model = EnvironmentFacade.ReportEnvironment.ReportType
            
            #region *** dtPiramide

            ds.Tables["piramide"].Columns.Add(new DataColumn("Area", typeof(string)));
            ds.Tables["piramide"].Columns.Add(new DataColumn("Descirption", typeof(string)));
            ds.Tables["piramide"].Columns.Add(new DataColumn("VaR", typeof(string)));
            ds.Tables["piramide"].Columns.Add(new DataColumn("ControvaloreAttuale", typeof(decimal)));
            ds.Tables["piramide"].Columns.Add(new DataColumn("PesoRelativo", typeof(decimal)));
            ds.Tables["piramide"].Columns.Add(new DataColumn("RischioRelativo", typeof(decimal)));
            ds.Tables["piramide"].Columns.Add(new DataColumn("Red", typeof(int)));
            ds.Tables["piramide"].Columns.Add(new DataColumn("Green", typeof(int)));
            ds.Tables["piramide"].Columns.Add(new DataColumn("Blue", typeof(int)));
            if (presenzaGrafico())
            {
                foreach (var item in rischioAreeProgetti)
                {

                    var colore = new ColorPDF(displayInfo.FirstOrDefault(o => o.key.Equals(item.area.ToUpper())).value.fill);


                    ds.Tables["piramide"].Rows.Add(
                        string.Format("{0}.png", new AreaBisogno(item.area).NomePerImmagine), //area
                        item.name, // description
                        item.var, //var
                        item.currentEquivalent, //controvalore attuale
                        item.relativeWeight,//peso relativo
                        item.relativeRisk, //rischio relativo
                        colore.Red,
                        colore.Green,
                        colore.Blue
                        );
                }
            }

            #endregion

            #region *** dtPiramideFooter

            // 20181010 AC
            //#region OC + CCN + Eligo
            #region OC + CCN + Eligo + IlTuoFoglio
            //--20181010 AC
            var listReturn = new List<rsPosizione>();

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

            #endregion


            ds.Tables["piramideFooter"].Columns.Add(new DataColumn("Area", typeof(string)));
            ds.Tables["piramideFooter"].Columns.Add(new DataColumn("ControvaloreAttuale", typeof(decimal)));
            ds.Tables["piramideFooter"].Columns.Add(new DataColumn("Var", typeof(string)));
            ds.Tables["piramideFooter"].Columns.Add(new DataColumn("FontBold", typeof(bool)));
            if (listReturn.Count > 0)
            {
                ds.Tables["piramideFooter"].Rows.Add(
                        "Totale risorse allocate",
                        datiSeiUnico.CASA_SUBTOTALE,
                        financialResources.var,
                        true
                //true,
                //true
                );

                foreach (var item in listReturn)
                {
                    ds.Tables["piramideFooter"].Rows.Add(
                        item.prodotto.nomeProdotto, //Colonna1
                        item.ctv, //Colonna3
                        item.prodotto.nomeProdotto.Equals("Conto corrente") || item.prodotto.nomeProdotto.Contains("Operazioni") ? "n.c." : "-", //Colonna4
                        false
                        //false,
                        //false
                        );
                }
            }

            ds.Tables["piramideFooter"].Rows.Add(
                             string.Format("Patrimonio {0}", Helper.ReplaceVariables("$/Banca/$", EnvironmentFacade.ReportEnvironment)),
                             datiSeiUnico.CASA_TOTALE,
                             totale.var + (GetNota().Length > 0 ? "*" : ""),
                             true
                             //true,
                             //true
                             );
            #endregion

            #region *** dtProdotti

            ds.Tables["prodotti"].Columns.Add(new DataColumn("CodiceAreaBisogno", typeof(string)));
            ds.Tables["prodotti"].Columns.Add(new DataColumn("SavingMap", typeof(string)));
            ds.Tables["prodotti"].Columns.Add(new DataColumn("Prodotto", typeof(string)));
            ds.Tables["prodotti"].Columns.Add(new DataColumn("ControvaloreAttuale", typeof(decimal)));
            ds.Tables["prodotti"].Columns.Add(new DataColumn("VaR", typeof(string)));
            ds.Tables["prodotti"].Columns.Add(new DataColumn("PesoRelativo", typeof(decimal)));
            ds.Tables["prodotti"].Columns.Add(new DataColumn("RischioRelativo", typeof(decimal)));

            // La gestione del rischio tra Nucelo e non Nucelo sono diverse i dati del rischio relativo sono su Unit Diverse
#region Prodotti per Nucleo
            //if (EnvironmentFacade.ReportEnvironment.ReportType.ToString() == "Unica_Nucleo")
            //{
            //    foreach (var item in rischioProdottiNucleo.Take(numeroProdotti() == ProdottiPatrimonio.PrimiDieci ? 10 : rischioProdottiNucleo.Length).OrderByDescending(o => o.relativeRisk))
            //    {
            //        if (presenzaTabella())
            //        {

            //            ds.Tables["prodotti"].Rows.Add(
            //                "",//posizioni.FirstOrDefault(o => o.chiavePosizionePortafoglio.Equals(item.id)).area,//area

            //                item.name,//    prodotto
            //                item.currentEquivalent,// Controvalore attuale
            //                item.var,// var
            //                item.relativeWeight,//peso relativo
            //                //Convert.ToDouble(item.relativeRisk) == 0 ? 0.00 : Convert.ToDouble(item.relativeRisk)//rischio relativo
            //                item.relativeRisk * 100 // aggiunto * 100 09102017
            //            );
            //        }

            //    }



            //}

            //else
            //{
#endregion
                foreach (var item in rischioProdotti.Take(numeroProdotti() == ProdottiPatrimonio.PrimiDieci ? 10 : rischioProdotti.Length).OrderByDescending(o => o.relativeRisk))
                {
                    if (presenzaTabella())
                    {
                        string sSavingMap = "";
                        // Modifica per Saving Map
                        if (posizioni.FirstOrDefault(o => o.chiavePosizionePortafoglio.Equals(item.aggregationId)).savingMap)//SavingMap
                            //if (dettaglioProdotto.prodotto.nomeProdotto.Substring(0, 2).ToUpper() =="FV")
                            sSavingMap = "SavingMap.png";
                        // Fine Modifica
                        
                        ds.Tables["prodotti"].Rows.Add(                            
                            posizioni.FirstOrDefault(o => o.chiavePosizionePortafoglio.Equals(item.aggregationId)).area,//area
                            sSavingMap, 
                            item.name,//    prodotto
                            item.currentEquivalent,// Controvalore attuale
                            item.var,// var
                            item.relativeWeight,//peso relativo
                            //Convert.ToDouble(item.relativeRisk) == 0 ? 0.00 : Convert.ToDouble(item.relativeRisk)//rischio relativo
                            item.relativeRisk * 100 // aggiunto * 100 09102017
                            
                        );
                    }

                }
         //   }
            #endregion

            #region *** dtLegenda
            ds.Tables["legenda"].Columns.Add(new DataColumn("CodiceAreaBisogno", typeof(string)));
            ds.Tables["legenda"].Columns.Add(new DataColumn("Ordinamento", typeof(int)));
            if (presenzaTabella())
            {
                foreach (DataRow item in ds.Tables["prodotti"].DefaultView.ToTable(true, "CodiceAreaBisogno").Rows)
                {
                    ds.Tables["legenda"].Rows.Add(item["CodiceAreaBisogno"],
                        displayInfo.FirstOrDefault(o => o.key.Equals(item["CodiceAreaBisogno"].ToString().ToUpper())).value.order);
                }
            }
            #endregion

            return ds;
        }

        public virtual string TestoIntroduttivo()
        {
            string testo = "";

            if (presenzaGrafico())
            {
                if (presenzaTabella())
                    testo = (numeroProdotti() == ProdottiPatrimonio.Tutti) ?
                        GetText().Rows[0]["testo2"].ToString() :
                        GetText().Rows[0]["testo1"].ToString();
                else
                    testo = GetText().Rows[0]["testo3"].ToString();
            }
            else
            {
                if (presenzaTabella())
                    testo = (numeroProdotti() == ProdottiPatrimonio.Tutti) ?
                        GetText().Rows[0]["testo4"].ToString() :
                        GetText().Rows[0]["testo5"].ToString();
            }
            return Helper.ReplaceVariables(testo, base.EnvironmentFacade.ReportEnvironment);
        }//TestoIntroduttivo

        public virtual string GetNota()
        {
            string nota = "";
            var totale = datiSeiUnico.rischioUnit().rischio.areeProgetti.total;
            if (totale.coverage < 100)
            {
                nota = string.Format("Grado di copertura prodotti in termini di Rischio Mercato  (VaR): {0}", Helper.FormatDecimal(totale.coverage.ToString(), 2));
            }
            return nota;
        }//GetNota

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

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

        public virtual ProdottiPatrimonio numeroProdotti()
        {
            ProdottiPatrimonio numProdotti = GetOption<Opzione6_3>().ProdottiPatrimonio;
            return numProdotti;
        }
    }
}
