using System;
using Consulenza.ReportWriter.Business;
using Consulenza.ReportWriter.Business.OBJ_PDF;
using System.Data;
using Consulenza.ReportCommon;
using Consulenza.ReportWriter.Business.CHART_PDF;
using Consulenza.ReportWriter.Business.Entity;
using System.Collections.Generic;
using Consulenza.ReportWriter.Manager.Integration;
using System.Linq;
using Consulenza.ReportWriter.Business.CUSTOM_PDF.ConsulenzaUnica;
using Consulenza.DataServices.fideuram.data.service;

namespace Consulenza.ReportWriter.Manager.Section.Unica
{
    public class S60 : Entity.Section
    {
       
        public string TitoloProgetto { get; set; }
        public long ChiaveProgetto { get; set; }
        /// <summary>
        ///S60.ProgettoPortafoglioModelloVSProposto idSezione = 103
        /// </summary>
        public S60(EnvironmentFacade environmentFacade, int idSection)
            : base(environmentFacade, idSection)
        {
            try
            {
                Draw();
            }
            catch (Exception ex)
            {
                SectionLogger.Write("S60", ex.Message, SectionLoggerMessageLevel.E, EnvironmentFacade.ReportEnvironment);
            }
        }
       
        protected override sealed void Draw()
        {
            var dati = GetDataSet();
            bool isAdeguata = datiSeiUnico.flagAdeguatezzaPro();
            for (int i = 0; i < dati.Tables["NomeProgetto"].Rows.Count; i++)
            {
                TitoloProgetto = dati.Tables["NomeProgetto"].Rows[i]["NomeProgetto"].ToString();
                string titolospezzato = TitoloProgetto.Length > 23 ? TitoloProgetto.Substring(0, 23) + "..." : TitoloProgetto;
                ChiaveProgetto = long.Parse(dati.Tables["NomeProgetto"].Rows[i]["ChiaveProgetto"].ToString());
                AddElement(new PagePDF(PagePDF.PagePDFType.Generic));

                var intestazione = new SectionHeadingPDF(
                   "Progetto «" + titolospezzato + "»: portafoglio modello vs " + (isAdeguata ? "proposto" : "prospettico"),
                   
                    EnvironmentFacade.RendererFacade.XLeftLimit,
                    EnvironmentFacade.RendererFacade.YUpperLimit,
                    EnvironmentFacade.ReportEnvironment.FontFamily);

                AddElement(intestazione.ToElement());
                if (dati.Tables["assetClass"+i].Rows.Count > 0)
                {
                    DataTable dtOrdinamento = dati.Tables["assetClass" + i].AsEnumerable().OrderBy(l => l.Field<int>("Ordinamento")).CopyToDataTable();
                    //dtOrdinamento.AsEnumerable().OrderBy(l => l.Field<int>("Ordinamento")).CopyToDataTable();
                    if (getTesto1().Length > 0)
                    {
                        AddElement(new SpacePDF(20));
                        AddElement(new FormattedTextAreaPDF(getTesto1(), EnvironmentFacade.RendererFacade.XLeftLimit) {FontSize=7, TextHorizontalAlign = ceTe.DynamicPDF.TextAlign.Justify });
                        AddElement(new SpacePDF(15));

                        var tabellaCtv = new TablePDF(EnvironmentFacade.RendererFacade.XLeftLimit, dati.Tables["labelControvalore" + i])
                        {
                            Style = Style.ConsulenzaUnica,
                            Header = false,
                            Footer = false,
                            AlternateRow = false,
                            RowHeight = 28,
                            ShowSeparationLines = false,
                            WhiteSpacesHorizontalSeparator = true,
                            HideLastSeparationLine = true
                        };

                        tabellaCtv.Columns.Add(new ColumnPDF("ControvalorepropostoString", 130, HorizontalAlignmentType.Sinistra, true, true, 7, ColumnType.Testo, "ControvalorepropostoString", "") { FontSize = 7, DeltaYContent = -1 });
                        tabellaCtv.Columns.Add(new ColumnPDF("Controvaloreproposto", 130, HorizontalAlignmentType.Destra, false, false, 7, ColumnType.Testo, "Controvaloreproposto", "") { HeaderFontSize = 7, FontBold = false, PaddingRight = 10, DeltaYContent = -1 });

                        tabellaCtv.Columns.Add(new ColumnPDF("AderenzaportafogliomodelloString", 130, HorizontalAlignmentType.Sinistra, true, true, 7, ColumnType.Testo, "AderenzaportafogliomodelloString", "") { FontSize = 7, PaddingLeft = 5, DeltaYContent = -1 });
                        tabellaCtv.Columns.Add(new ColumnPDF("Aderenzaportafogliomodello", 130, HorizontalAlignmentType.Destra, false, false, 7, ColumnType.Testo, "Aderenzaportafogliomodello", "") { HeaderFontSize = 7, FontBold = false, DeltaYContent = -1, PaddingRight = 4 });

                        AddElement(tabellaCtv);
                        AddElement(new SpacePDF(20));
                    }

                    //#region label
                    //FormattedTextAreaPDF captionCtvProposto = new FormattedTextAreaPDF("Controvalore " + (isAdeguata ? " proposto (€)" : "prospettico (€)"), EnvironmentFacade.RendererFacade.XLeftLimit, 130) { FontSize = 7, BackGroundMarginLeft = 5, BackGroundColor = ColorPDF.Standard_Grigio_SfondoColonnaTabella, FontColor = ColorPDF.Nero, FontBold = true, AutoIncrementYWritable = false };
                    //AddElement(captionCtvProposto);
                    //FormattedTextAreaPDF ctvProposto = new FormattedTextAreaPDF(dati.Tables["labelControvalore" + i].Rows[0]["Controvaloreproposto"].ToString(), EnvironmentFacade.RendererFacade.XLeftLimit + 230) { FontSize = 7, BackGroundColor = ColorPDF.Bianco, AutoIncrementYWritable = false };
                    //AddElement(ctvProposto);

                    //FormattedTextAreaPDF captionAderenzaModello = new FormattedTextAreaPDF("Aderenza al portafoglio<br>modello (%)", EnvironmentFacade.RendererFacade.XLeftLimit + 280, 140) { FontSize = 7, BackGroundMarginLeft = 5, BackGroundColor = ColorPDF.Standard_Grigio_SfondoColonnaTabella, FontColor = ColorPDF.Nero, FontBold = true, AutoIncrementYWritable = false, TextVerticalAlign =ceTe.DynamicPDF.VAlign.Top, DeltaY=-2};
                    //AddElement(captionAderenzaModello);
                    //FormattedTextAreaPDF varAderenza = new FormattedTextAreaPDF(dati.Tables["labelControvalore" + i].Rows[0]["Aderenzaportafogliomodello"].ToString(), EnvironmentFacade.RendererFacade.XLeftLimit + 495) { FontSize = 7, BackGroundColor = ColorPDF.Bianco, AutoIncrementYWritable = true };
                    //AddElement(varAderenza);
                    
                    //AddElement(new SpacePDF(13));
                    //FormattedTextAreaPDF captionVarProposto = new FormattedTextAreaPDF("VaR " + (isAdeguata ? " proposto (%)" : "prospettico (%)"), EnvironmentFacade.RendererFacade.XLeftLimit, 130) { FontSize = 7, BackGroundMarginLeft = 5, BackGroundColor = ColorPDF.Standard_Grigio_SfondoColonnaTabella, FontColor = ColorPDF.Nero, FontBold = true, AutoIncrementYWritable = false };
                    //AddElement(captionVarProposto);
                    //FormattedTextAreaPDF varProposto = new FormattedTextAreaPDF(dati.Tables["labelControvalore" + i].Rows[0]["Varproposto"].ToString(), EnvironmentFacade.RendererFacade.XLeftLimit + 255) { FontSize = 7, BackGroundColor = ColorPDF.Bianco, AutoIncrementYWritable = false };
                    //AddElement(varProposto);

                    //FormattedTextAreaPDF captionVarModello = new FormattedTextAreaPDF("VaR portafoglio modello (%)", EnvironmentFacade.RendererFacade.XLeftLimit + 280, 140) { FontSize = 7, BackGroundMarginLeft = 5, BackGroundColor = ColorPDF.Standard_Grigio_SfondoColonnaTabella, FontColor = ColorPDF.Nero, FontBold = true, AutoIncrementYWritable = false };
                    //AddElement(captionVarModello);
                    //FormattedTextAreaPDF varModello = new FormattedTextAreaPDF(dati.Tables["labelControvalore" + i].Rows[0]["Varportafogliomodello"].ToString(), EnvironmentFacade.RendererFacade.XLeftLimit + 500) { FontSize = 7, BackGroundColor = ColorPDF.Bianco, AutoIncrementYWritable = true };
                    //AddElement(varModello);
                    
                    //#endregion

                    AddElement(new SpacePDF(20));

                    string valore = isControvalore() ? "(€)" : "(%)";

                    AddElement(new FormattedTextAreaPDF(isAssetClass() ? "Asset class" : "Macro asset class", EnvironmentFacade.RendererFacade.XLeftLimit, 130) { BackGroundColor = ColorPDF.Standard_Grigio_SfondoColonnaTabella, FontBold = true, FontSize = 7, FontColor = ColorPDF.ConsulenzaUnica_Rosso, AutoIncrementYWritable = false, BackGroundMarginLeft = 5 });
                    AddElement(new FormattedTextAreaPDF("Portafoglio modello " + valore, EnvironmentFacade.RendererFacade.XLeftLimit + 133.5f, 190) { BackGroundColor = ColorPDF.Standard_Grigio_SfondoColonnaTabella, FontBold = true, FontSize = 7, FontColor = ColorPDF.ConsulenzaUnica_Rosso, AutoIncrementYWritable = false, BackGroundMarginLeft = 5 });
                    AddElement(new FormattedTextAreaPDF("Portafoglio " + (isAdeguata ? "proposto " : "prospettico ") + valore, EnvironmentFacade.RendererFacade.XLeftLimit + 327.5f, 190) { BackGroundColor = ColorPDF.Standard_Grigio_SfondoColonnaTabella, FontBold = true, FontSize = 7, FontColor = ColorPDF.ConsulenzaUnica_Rosso, BackGroundMarginLeft = 5 }); //340 = + 145 + 195

                    #region asset

                    var tabellaAsset = new TablePDF(EnvironmentFacade.RendererFacade.XLeftLimit, dtOrdinamento)
                   {
                       Style = Style.ConsulenzaUnica,
                       Header = false,

                       Footer = false,
                       AlternateRow = false,
                       RowHeight = 28,
                       ShowSeparationLines = false

                   };
                    tabellaAsset.Columns.Add(new ColumnPDF("descrizione", 145, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Testo, "Descrizione", "") { HeaderFontSize = 7, FontSize = 7 });
                    tabellaAsset.Columns.Add(new ColumnPDF("portafogliomodello", 179, HorizontalAlignmentType.Destra, false, false, 7, ColumnType.Objectpdf, "PercentualeControvaloreModello", "") { HeaderPaddingLeft = 5, HeaderFontSize = 7, DeltaYContent = 2, FontSize = 7 });
                    tabellaAsset.Columns.Add(new ColumnPDF("portafoglioproposto", 180, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Objectpdf, "PercentualeControvaloreProposto", "") { HeaderPaddingLeft = 5, HeaderFontSize = 7, PaddingLeft = 3.5f, DeltaYContent = 2, FontSize = 7 });

                    int o = 0;
                    var list = new List<double>();
                    list.Add(Convert.ToDouble(dati.Tables["assetClass" + i].AsEnumerable().Max(x => x["PercentualeControvaloreModello"])));
                    list.Add(Convert.ToDouble(dati.Tables["assetClass" + i].AsEnumerable().Max(x => x["PercentualeControvaloreProposto"])));
                    var max = (float)Helper.Round(list.Max());

                    float larghezzaBarra = 0;
                    float deltaXBarra = 0;
                    var width = 0;
                    foreach (DataRow row in dtOrdinamento.Rows)
                    {

                        var colore = new ColorPDF(Convert.ToInt32(row["Red"]), Convert.ToInt32(row["Green"]), Convert.ToInt32(row["Blue"]));

                        #region barra colonna Portafogliomodello
                        width = tabellaAsset.Columns[1].Width - (isControvalore() ? 50 : 20);
                        larghezzaBarra = Helper.GetWidthProportional(Convert.ToDouble(row["PercentualeControvaloreModello"]) == 0 ? (float)0.01 : (float)Convert.ToDouble(row["PercentualeControvaloreModello"]), max, width);
                        deltaXBarra = -larghezzaBarra + (isControvalore() ? 0 : 7);
                        if (Convert.ToDouble(row["PercentualeControvaloreModello"]) == 0)
                        {
                            tabellaAsset.Cells[1, o].ValueObjectList = new List<Business.Entity.ObjectPDF>()
                            {
                    
                               new FormattedTextAreaPDF(isControvalore() ? Helper.FormatCurrency(row["PercentualeControvaloreModello"].ToString()) : Helper.FormatDecimal(row["PercentualeControvaloreModello"].ToString(), 2), deltaXBarra-10, isControvalore()? 50 : 35) 
                                { 
                                    DeltaY = 4, 
                                    TextHorizontalAlign = ceTe.DynamicPDF.TextAlign.Left, 
                                    DeltaX = isControvalore() ? deltaXBarra+30 : deltaXBarra+10,
                                    FontSize = 7
                                },
                                new RectanglePDF(12, 1 , ColorPDF.Bianco){DeltaY = 4}
                            };
                        }
                        else
                        {


                            tabellaAsset.Cells[1, o].ValueObjectList = new List<Business.Entity.ObjectPDF>()
                            {
                    
                                new FormattedTextAreaPDF(isControvalore() ? Helper.FormatCurrency(row["PercentualeControvaloreModello"].ToString()) : Helper.FormatDecimal(row["PercentualeControvaloreModello"].ToString(), 2), deltaXBarra, isControvalore()? 50 : 35) 
                                { 
                                    DeltaY = 4, 
                                    TextHorizontalAlign = ceTe.DynamicPDF.TextAlign.Left, 
                                    DeltaX = deltaXBarra,
                                    FontSize = 7
                                },
                                new RectanglePDF(12, larghezzaBarra , colore){DeltaY = 4}
                            };
                        }
                        #endregion


                        #region barra colonna Portafoglioattuale
                        width = tabellaAsset.Columns[2].Width - (isControvalore() ? 50 : 20);
                        larghezzaBarra = Helper.GetWidthProportional(Convert.ToDouble(row["PercentualeControvaloreProposto"]) == 0 ? (float)0.01 : (float)Convert.ToDouble(row["PercentualeControvaloreProposto"]), max, width);
                        deltaXBarra =  isControvalore() ? larghezzaBarra + 3 : larghezzaBarra - 5;
                        if (Convert.ToDouble(row["PercentualeControvaloreProposto"]) == 0)
                        {
                            tabellaAsset.Cells[2, o].ValueObjectList = new List<Business.Entity.ObjectPDF>()
                            {
                    
                                 new RectanglePDF(12, 1 , ColorPDF.Bianco){DeltaY = 4}, 
                                new FormattedTextAreaPDF(isControvalore() ? Helper.FormatCurrency(row["PercentualeControvaloreProposto"].ToString()) :Helper.FormatDecimal(row["PercentualeControvaloreProposto"].ToString(), 2), deltaXBarra-10, isControvalore()? 50 : 35) 
                                { 
                                    DeltaY = 4, 
                                    TextHorizontalAlign = ceTe.DynamicPDF.TextAlign.Right, 
                                    DeltaX = isControvalore() ? deltaXBarra-35 : deltaXBarra-10,
                                    FontSize = 7
                                }          
                            };
                        }
                        else
                        {
                            tabellaAsset.Cells[2, o].ValueObjectList = new List<Business.Entity.ObjectPDF>()
                            {
                               new RectanglePDF(12, larghezzaBarra , colore){DeltaY = 4}, 
                                new FormattedTextAreaPDF(isControvalore() ? Helper.FormatCurrency(row["PercentualeControvaloreProposto"].ToString()) :Helper.FormatDecimal(row["PercentualeControvaloreProposto"].ToString(), 2), deltaXBarra, isControvalore()? 50 : 35) 
                                { 
                                    DeltaY = 4, 
                                    TextHorizontalAlign = ceTe.DynamicPDF.TextAlign.Right, 
                                    DeltaX =  deltaXBarra,
                                    FontSize = 7
                                }                             
                            };
                        }
                        #endregion
                        o++;
                    }

                    #endregion

                    AddElement(tabellaAsset);

                    string note = "*";
                    if (getNota1().Length > 0)
                    {
                       tabellaAsset.Notes.Add(
                            new TableNotePDF(TableNotePDF.TableNotePositionType.PièDiTabella,
                                getNota1(),
                                new[] { "" },
                                string.Empty,
                                TableNotePDF.TableNoteAsteriskPositionType.CorpoTabella) { FontSize = 6, TextHorizontalAlign = ceTe.DynamicPDF.TextAlign.Justify }
                                );
                        //captionAderenzaModello.Text += note;
                        //captionCtvProposto.Text += note;
                        //note += "*";
                    }

                    if (getNota2().Length > 0)
                    {
                        tabellaAsset.Notes.Add(
                            new TableNotePDF(TableNotePDF.TableNotePositionType.PièDiTabella,
                                getNota2(),
                                new[] { "" },
                                string.Empty,
                                TableNotePDF.TableNoteAsteriskPositionType.CorpoTabella) { FontSize = 6, TextHorizontalAlign = ceTe.DynamicPDF.TextAlign.Justify }
                                );
                        //captionVarProposto.Text += note;
                        
                        note += "*";
                    }

                }
            }
        }
        /// <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()
        {
            //ricordarsi che la scheda viene stampata per ogni progetto 
            var ds = new DataSet();
          // propostaUnit.stPianificazioneVerticale.stAreePianificazione[X].progetti[Y].valoreAderenza
            #region progetti
            ds.Tables.Add(new DataTable("NomeProgetto"));
            ds.Tables["NomeProgetto"].Columns.Add(new DataColumn("NomeProgetto", typeof(string)));
            ds.Tables["NomeProgetto"].Columns.Add(new DataColumn("ChiaveProgetto", typeof(string)));

            var progettiInvestimento = datiSeiUnico.pianificazioneUnit().pianificazioneOrizzontale.Where(o => o.portafoglioModello.area.Equals("Inv")).ToList();
            var listaProgettiProposta = isAssetClass() ? datiSeiUnico.propostaUnit().assetClass.distribuzioneAree.Where(o => o.area.Equals("Inv") && o.chiaveProgetto != null) : datiSeiUnico.propostaUnit().macroAssetClass.distribuzioneAree.Where(o => o.area.Equals("Inv") && o.chiaveProgetto != null);
            listaProgettiProposta = listaProgettiProposta.OrderByDescending(o => o.distribuzione.totaleCtv);
            if (listaProgettiProposta != null)
            {
                var displayInfoM = datiSeiUnico.displayInfos().macroAssetDisplayInfos.ToList();
                var displayInfoA = datiSeiUnico.displayInfos().assetDisplayInfos.ToList();
                int i = 0;
                foreach (rsDistibuzioneAree valoriAssetProposto in listaProgettiProposta)
                {
                    var item = datiSeiUnico.pianificazioneUnit().pianificazioneOrizzontale.FirstOrDefault(o => o.chiaveProgetto.ToString() == valoriAssetProposto.chiaveProgetto);
                    var progettoPro = datiSeiUnico.propostaUnit().stPianificazioneVerticale.stAreePianificazione.FirstOrDefault(o => o.area.Equals("Inv")).progetti.FirstOrDefault(l => l.chiaveProgetto == item.chiaveProgetto);
                    var valoreCtvTotaleAttuale = progettoPro.ctvProgettoPro; 

           
                    var valoriAssetModello = isAssetClass() ? item.portafoglioModello.distribuzioniPtfModello.Where(l => l.asset.livello == 2).ToList() : item.portafoglioModello.distribuzioniPtfModello.Where(l => l.asset.livello == 1).ToList();
                    
                    ds.Tables["NomeProgetto"].Rows.Add(item.nomeProgetto, item.chiaveProgetto);

                    string labelcontrovalore = "labelControvalore" + i;
                    
                    string assetclass = "assetClass" + i;
                    ds.Tables.Add(new DataTable(labelcontrovalore));
                   
                    ds.Tables.Add(new DataTable(assetclass));

                    #region patrimonio controvalore
                    ds.Tables[labelcontrovalore].Columns.Add("ControvalorepropostoString", typeof(string));
                    ds.Tables[labelcontrovalore].Columns.Add("Controvaloreproposto", typeof(string));
                    ds.Tables[labelcontrovalore].Columns.Add("AderenzaportafogliomodelloString", typeof(string));
                    ds.Tables[labelcontrovalore].Columns.Add("Aderenzaportafogliomodello", typeof(string));
                    ds.Tables[labelcontrovalore].Rows.Add(
                        "Controvalore " + (datiSeiUnico.flagAdeguatezzaPro() ? " proposto (€)" : "prospettico (€)") + 
                            (getNota1().Length > 0 && getNota1().Contains("Grado") ? "*" : ""),
                        Helper.FormatCurrency(valoriAssetProposto.distribuzione.totaleCtv.ToString()),
                         "Aderenza al portafoglio<br> modello (%)" + (getNota1().Length > 0 ? "*" : ""),
                        //Helper.FormatDecimal(item.aderenza.valoreAderenza.ToString(), 2));
                        Helper.FormatDecimal(progettoPro.valoreAderenza.ToString(), 2));
                    ds.Tables[labelcontrovalore].Rows.Add(
                        "VaR " + (datiSeiUnico.flagAdeguatezzaPro() ? " proposto (%)" : "prospettico (%)")  + (getNota2().Length > 0 ? "*" : ""),
                        progettoPro.varProgettoPro,
                        "VaR portafoglio modello (%)", 
                        Helper.FormatDecimal(item.varPianificatoDec, 2));
                   
                  
                    #endregion
                    #region asset
                    ds.Tables[assetclass].Columns.Add(new DataColumn("Codice", typeof(string)));
                    ds.Tables[assetclass].Columns.Add(new DataColumn("Descrizione", typeof(string)));
                    ds.Tables[assetclass].Columns.Add(new DataColumn("Red", typeof(int)));
                    ds.Tables[assetclass].Columns.Add(new DataColumn("Green", typeof(int)));
                    ds.Tables[assetclass].Columns.Add(new DataColumn("Blue", typeof(int)));
                    ds.Tables[assetclass].Columns.Add(new DataColumn("PercentualeControvaloreModello", typeof(decimal)));
                    ds.Tables[assetclass].Columns.Add(new DataColumn("PercentualeControvaloreProposto", typeof(decimal)));
                    ds.Tables[assetclass].Columns.Add(new DataColumn("Ordinamento", typeof(int)));
                   
                    #region portafoglio modello

                    if (isAssetClass())
                    {
                        foreach (var valore in from c in  displayInfoA
                                             join l in valoriAssetModello on c.key equals l.asset.asset
                                             //orderby c.value.order
                                             select new
                                             {
                                                 l.asset.asset,
                                                 l.asset.descrizione,
                                                 new ColorPDF(c.value.fill).Red,
                                                 new ColorPDF(c.value.fill).Green,
                                                 new ColorPDF(c.value.fill).Blue,
                                                 l.percentuale,
                                                 c.value.order
                                             })
                        {
                            ds.Tables[assetclass].Rows.Add(
                                valore.asset,
                                valore.descrizione,
                                valore.Red,
                                valore.Green,
                                valore.Blue,
                               isControvalore() ? valore.percentuale * valoreCtvTotaleAttuale : valore.percentuale * 100,
                               0,//portafoglio proposto che viene caricato successivamente
                               valore.order
                            );
                        }


                    }
                    else
                    {

                        foreach (var valore in from c in displayInfoM
                                               join l in valoriAssetModello on c.key equals l.asset.asset
                                               //orderby c.value.order
                                               select new
                                               {
                                                   l.asset.asset,
                                                   l.asset.descrizione,
                                                   new ColorPDF(c.value.fill).Red,
                                                   new ColorPDF(c.value.fill).Green,
                                                   new ColorPDF(c.value.fill).Blue,
                                                   l.percentuale,
                                                   c.value.order
                                               })
                        {
                            ds.Tables[assetclass].Rows.Add(
                                valore.asset,
                                valore.descrizione,
                                valore.Red,
                                valore.Green,
                                valore.Blue,
                                isControvalore() ? valore.percentuale * valoreCtvTotaleAttuale : valore.percentuale * 100,
                                0,//portafoglio proposto che viene caricato successivamente
                                valore.order
                            );
                        }
                    }
                    #endregion

                    #region portafoglioproposto
                    
                        if (isAssetClass())
                        {
                            foreach (var valore in from c in displayInfoA
                                                   join l in valoriAssetProposto.distribuzione.elencoSlice on c.key equals l.codice
                                                    //orderby c.value.order
                                                       select new
                                                       {
                                                           l.codice,
                                                           l.descrizione,
                                                           new ColorPDF(c.value.fill).Red,
                                                           new ColorPDF(c.value.fill).Green,
                                                           new ColorPDF(c.value.fill).Blue,
                                                           l.pesoCC,
                                                           l.ctvCC,
                                                           c.value.order
                                                       })
                            {
                                if (ds.Tables[assetclass].AsEnumerable().FirstOrDefault(l => l.Field<string>("Codice") == valore.codice) != null)
                                {
                                    ds.Tables[assetclass].Select(string.Format("[Codice] = '{0}'", valore.codice))
                                         .ToList<DataRow>()
                                         .ForEach(r =>
                                         {
                                             r["PercentualeControvaloreProposto"] = isControvalore() ? Convert.ToDecimal(valore.ctvCC) : Convert.ToDecimal(valore.pesoCC * 100);

                                         });
                                }
                                else
                                {

                                    ds.Tables[assetclass].Rows.Add(
                                        valore.codice,
                                        valore.descrizione,
                                        valore.Red,
                                        valore.Green,
                                        valore.Blue,
                                        0,//portafoglio modello per un item che non è presente
                                        isControvalore() ? valore.ctvCC : valore.pesoCC * 100,
                                        valore.order
                                    );
                                }
                            }
                          

                        }
                        else
                        {
                            foreach (var valore in from c in displayInfoM
                                                   join l in valoriAssetProposto.distribuzione.elencoSlice on c.key equals l.codice
                                                   //orderby c.value.order
                                                   select new
                                                   {
                                                       l.codice,
                                                       l.descrizione,
                                                       new ColorPDF(c.value.fill).Red,
                                                       new ColorPDF(c.value.fill).Green,
                                                       new ColorPDF(c.value.fill).Blue,
                                                       l.pesoCC,
                                                       l.ctvCC,
                                                       c.value.order
                                                   })
                            {
                                if (ds.Tables[assetclass].AsEnumerable().FirstOrDefault(l => l.Field<string>("Codice") == valore.codice) != null)
                                {
                                    ds.Tables[assetclass].Select(string.Format("[Codice] = '{0}'", valore.codice))
                                         .ToList<DataRow>()
                                         .ForEach(r =>
                                         {
                                             r["PercentualeControvaloreProposto"] = isControvalore() ? valore.ctvCC : valore.pesoCC * 100;

                                         });
                                }
                                else
                                {

                                    ds.Tables[assetclass].Rows.Add(
                                        valore.codice,
                                        valore.descrizione,
                                        valore.Red,
                                        valore.Green,
                                        valore.Blue,
                                        0,//portafoglio modello per un item che non è present
                                        isControvalore() ? valore.ctvCC : valore.pesoCC * 100,
                                        valore.order
                                    );
                                }
                            }
                        }
                        
                    #endregion

                    #endregion
                    i++;
                    
                }
                
            }
            #endregion

            return ds;
        }
        public virtual string getTesto1()
        {
            bool isAdeguata = datiSeiUnico.flagAdeguatezzaPro();
            string adegutaStr = isAdeguata ? "la presente proposta," : "le operazioni da lei richieste al suo private banker,";
            return isAssetClass() ? !isControvalore() ?
                "In questa scheda è riportato il confronto, sulla base delle principali asset class finanziarie, tra il patrimonio che, secondo " + adegutaStr + " è destinato al progetto di investimento ''" + TitoloProgetto + "'', e il relativo portafoglio modello, con evidenza dell'esposizione, in termini percentuali, a ciascuna asset class, e con indicazione del grado di Aderenza."
                : "In questa scheda è riportato il confronto, sulla base delle principali asset class finanziarie, tra il patrimonio che, secondo " + adegutaStr + " è destinato al progetto di investimento ''" + TitoloProgetto + "'', e il relativo portafoglio modello, con evidenza dell'esposizione, in termini di controvalore, a ciascuna asset class, e con indicazione del grado di Aderenza."
                : isControvalore() ? "In questa scheda è riportato il confronto, sulla base delle principali macro asset class finanziarie, tra il patrimonio che, secondo " + adegutaStr + " è destinato al progetto di investimento ''" + TitoloProgetto + "'', e il relativo portafoglio modello, con evidenza dell'esposizione, in termini di controvalore, a ciascuna macro asset class, e con indicazione del grado di Aderenza."
                : "In questa scheda è riportato il confronto, sulla base delle principali macro asset class finanziarie, tra il patrimonio che, secondo " + adegutaStr + " è destinato al progetto di investimento ''" + TitoloProgetto + "'', e il relativo portafoglio modello, con evidenza dell'esposizione, in termini percentuali, a ciascuna macro asset class, e con indicazione del grado di Aderenza.";

        }
        //note da fare
        public virtual string getNota1()
        {
            // Nota Portafoglio Consigliato
            var aderenza = datiSeiUnico.pianificazioneUnit().pianificazioneOrizzontale.FirstOrDefault(o => o.chiaveProgetto == ChiaveProgetto) != null ?
                datiSeiUnico.pianificazioneUnit().pianificazioneOrizzontale.FirstOrDefault(o => o.chiaveProgetto == ChiaveProgetto).aderenza.portafoglioConsiderato : 0;
            var gradoCoperturaAllocation = datiSeiUnico.pianificazioneUnit().pianificazioneVerticale.varInfos.stat.copertura;
            string nota = "";
            if (gradoCoperturaAllocation < 100)
            {
                string var = isAssetClass() ? "asset" : "macro asset";
                nota += string.Format("Grado di copertura prodotti rappresentabili in " + var + " allocation (%): {0}.", Helper.FormatDecimal(gradoCoperturaAllocation.ToString(), 2));
            }
            if (aderenza > 0 && aderenza < 100)
                    nota += string.Format(" Portafoglio considerato nel calcolo dell'aderenza (%): {0}.", Helper.FormatDecimal(aderenza.ToString(), 2));
            return nota;
        }
        
        public virtual string getNota2()
        {
            var coperturaRischioMercato = datiSeiUnico.propostaUnit().stDettaglioProposta.copertura;//isAssetClass() ? datiSeiUnico.propostaUnit().assetClass.distribuzione.coverageCC : datiSeiUnico.propostaUnit().macroAssetClass.distribuzione.coverageCC;
            
            string nota = "";
            if (coperturaRischioMercato < 100)
            {
                nota = string.Format("Grado di copertura prodotti in termini di Rischio Mercato (VaR%): {0}.", Helper.FormatDecimal(coperturaRischioMercato.ToString(), 2));
            }
            return nota;
        }
       

        public virtual bool isControvalore()
        {
            return  !GetOption<Opzione3_2>().Valore;
        }
        public virtual bool isAssetClass()
        {
            return GetOption<Opzione3_1>().Valore;
        }
    }
}
