using System;
using Consulenza.ReportWriter.Business;
using Consulenza.ReportWriter.Business.OBJ_PDF;
using System.Data;
using Consulenza.ReportCommon;
using System.Collections.Generic;
using System.Linq;
using Consulenza.ReportWriter.Business.CHART_PDF;
using Consulenza.ReportWriter.Business.CUSTOM_PDF.ConsulenzaUnica;
using Consulenza.ReportWriter.Business.Entity;

namespace Consulenza.ReportWriter.Manager.Section.Unica
{
    public class S63 : Entity.Section
    {

        /// <summary>
        ///S63.PropostaRischioMercatoVSRischioCredito idSezione = 106
        /// </summary>
        bool presenzaColonnaGradoCopertura;
        public S63(EnvironmentFacade environmentFacade, int idSection)
            : base(environmentFacade, idSection)
        {
            try
            {
                Draw();
            }
            catch (Exception ex)
            {
                SectionLogger.Write("S63", ex.Message, SectionLoggerMessageLevel.E, EnvironmentFacade.ReportEnvironment);
            }
        }

        protected override sealed void Draw()
        {
            var dati = GetDataSet();
            bool isAdeguata = datiSeiUnico.flagAdeguatezzaPro();
            AddElement(new PagePDF(PagePDF.PagePDFType.Generic));

            var intestazione = new SectionHeadingPDF(
                (isAdeguata ? "Proposta" : "Operazioni richieste") + ": rischio mercato vs rischio credito",

                EnvironmentFacade.RendererFacade.XLeftLimit,
                EnvironmentFacade.RendererFacade.YUpperLimit,
                EnvironmentFacade.ReportEnvironment.FontFamily);

            AddElement(intestazione.ToElement());


            #region Testo Introduttivo
            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(20));
            }
            #endregion

            #region Serie, Colori, Label del Grafico
            var series = new List<Serie>();
            var coloreSerieAreaAdeguata = new ColorPDF(228, 235, 238);
            var coloreSerieAreaNonAdeguata = new ColorPDF(204, 217, 222);
            var labelPersonalizzateAsseX = new List<CombinationPDFCustomLabel>();
            var labelPersonalizzateAsseY = new List<CombinationPDFCustomLabel>();


            foreach (DataRow rowX in dati.Tables["soglieX"].Rows)
            {
                labelPersonalizzateAsseX.Add(new CombinationPDFCustomLabel { Text = string.Empty, Value = Convert.ToDouble(rowX["Valore"]) });
            }

            foreach (DataRow rowX in dati.Tables["soglieY"].Rows)
            {
                labelPersonalizzateAsseY.Add(new CombinationPDFCustomLabel { Text = rowX["Testo"].ToString(), Value = Convert.ToDouble(rowX["Valore"]) });
            }

            #endregion

            AddElement(new FormattedTextAreaPDF("Rischio Mercato (VaR %)", EnvironmentFacade.RendererFacade.XLeftLimit + 110) { FontBold = true, FontSize = 7 });
            AddElement(new SpacePDF(7));

            #region Grafico Rischio Mercato - Rischio Credito

            var graficoCombination = new CombinationPDF(EnvironmentFacade.RendererFacade.XLeftLimit + 150, 1F)
            {
                Height = 200,
                Width = 300,
                MinorGridAxisY = false,
                BackColor = coloreSerieAreaNonAdeguata,
                LegendFontSizeText = 7,
                MarginAxisY = 0,
                ShowLineAxisY = true,
                ShowLabelAxisY = true,
                IntervalNumberAxisY = 5,
                StartFromZeroAxisY = true,
                //Adriano
                // imposta il valore massimo per la scala, per i clienti Retail, per i quali il valore massimo è 27, è 30, per i professionali, per i quali il valore può arrivare a 50, è 55
                MaximumValueAxisY = Convert.ToInt32(dati.Tables["cliente"].Rows[0]["RischioMercatoMassimoProfilo"]) > 27 ? 53 : 30,
                //--Adriano
                //originale:
                //MaximumValueAxisY = 30, // valore fisso 
                IndicatorAxisY = new CombinationPDFIndicator() { Text = "Rischio Mercato (VaR) massimo", Value = Convert.ToDouble(dati.Tables["cliente"].Rows[0]["RischioMercatoMassimoProfilo"]), DeltaX = -120, DeltaYText = -10 },
                CustomLabelAxisY = labelPersonalizzateAsseY,
                LabelFormatAxisY = FormatType.Decimale2,

                ShowLineAxisX = true,
                ShowLabelAxisX = true,
                StartFromZeroAxisX = true,
                MaximumValueAxisX = 35, // valore fisso 
                IntervalNumberAxisX = 4,
                CustomLabelAxisX = labelPersonalizzateAsseX,
                IndicatorAxisX = new CombinationPDFIndicator() { Text = "Rischio Credito massimo", Value = Convert.ToDouble(dati.Tables["cliente"].Rows[0]["RischioCreditoMassimoProfilo"]), DeltaXText = 7 }
            };

            #region Serie di adeguatezza
            series.Add(
                      new Serie
                      {
                          Name = "AreaDiAdeguatezza",
                          Type = Dundas.Charting.WebControl.SeriesChartType.Area,
                          Color = coloreSerieAreaAdeguata,
                          BorderColor = ColorPDF.Nero,
                          BorderWidth = 1,

                          Points = new List<Point>() {
                            new Point {
                                Values = new ValuesPointXY(0, Convert.ToDouble(dati.Tables["cliente"].Rows[0]["RischioMercatoMassimoProfilo"])),
                                ShowLabelAxisY = false,
                                ShowLabelAxisX = false,
                                Color = coloreSerieAreaAdeguata
                            },
                            new Point {
                                Values = new ValuesPointXY(Convert.ToDouble(dati.Tables["cliente"].Rows[0]["RischioCreditoMassimoProfilo"]), Convert.ToDouble(dati.Tables[3].Rows[0]["RischioMercatoMassimoProfilo"])),
                                ShowLabelAxisY = false,
                                ShowLabelAxisX = false,
                                Color = coloreSerieAreaAdeguata
                            },
                        }
                      }
                  );
            var d = dati.Tables[0].AsEnumerable().OrderByDescending(o => o.Field<int>("NumeroPatrimonio")).CopyToDataTable();

            foreach (DataRow item in d.Rows)
            {
                graficoCombination.Markers.Add(new Marker()
                {
                    Image = item["CodicePatrimonio"].ToString().Equals("PA") ? "PallinoPortafoglioAttuale.png" : "PallinoPortafoglioProposto.png",
                    Width = 15,
                    Height = 15,
                    //Scale = 1,
                    //20180907 AC
                    //X = (float)Convert.ToDouble(item["RischioCredito"]),
                    X = (float)Convert.ToDouble(xPosRC(item["RischioCreditoString"].ToString())),
                    // E.S. To Check
                    Y = (float)Convert.ToDouble(item["VaR"]) > 30 ? 30 : (float)Convert.ToDouble(item["VaR"])
                });
            }
            #endregion

            #region Serie di non adeguatezza

            // ***************Lo sfondo grigio del grafico è dato dalla proprietà BackColor del CombinationPDF. *************

            #endregion

            #region Serie Patrimoni

            //foreach (DataRow item in dati.Tables["rischio"].Rows)
            //{
            //    //double puntoY = Convert.ToDouble(item["VaR"]) >= 30 ? 30 : Convert.ToDouble(item["VaR"]);
            //    //double puntoX = Convert.ToDouble(item["RischioCredito"]) <= 0 ? 0.0 : Convert.ToDouble(item["RischioCredito"]);
            //    double puntoY = Convert.ToDouble(item["VaR"]);
            //    double puntoX = Convert.ToDouble(item["RischioCredito"]);

            //    series.Add(
            //        new Serie
            //        {
            //            Name = item["CodicePatrimonio"].ToString(),
            //            Type = Dundas.Charting.WebControl.SeriesChartType.Point,
            //            MarkerImage = item["CodicePatrimonio"].ToString().Equals("PA") ? "PallinoPortafoglioAttuale2.png" : "PallinoPortafoglioProposto2.png",
            //            Points = new List<Point>() {
            //                new Point {                            
            //                    Values = new ValuesPointXY(puntoX, puntoY),                            
            //                    ShowLabelAxisY = false,
            //                    ShowLabelAxisX = false                            
            //                }
            //            }
            //        }
            //    );
            //};
            #endregion

            // aggiungo le Serie al grafico
            graficoCombination.SeriesCollection = series;

            AddElement(graficoCombination);

            #endregion

            AddElement(new FormattedTextAreaPDF("Classe A", graficoCombination.X + 20) { FontSize = 7, AutoIncrementYWritable = false, DeltaY = -90 });
            AddElement(new FormattedTextAreaPDF("Classe B", graficoCombination.X + 97) { FontSize = 7, AutoIncrementYWritable = false, DeltaY = -90 });
            AddElement(new FormattedTextAreaPDF("Classe C", graficoCombination.X + 170) { FontSize = 7, AutoIncrementYWritable = false, DeltaY = -90 });
            AddElement(new FormattedTextAreaPDF("Classe D", graficoCombination.X + 247) { FontSize = 7, AutoIncrementYWritable = false, DeltaY = -90 });


            AddElement(new FormattedTextAreaPDF("Rischio Credito", EnvironmentFacade.RendererFacade.XLeftLimit + 420) { FontBold = true, FontSize = 7, DeltaY = -80 });

            #region Tabella

            var tabella = new TablePDF(EnvironmentFacade.RendererFacade.XLeftLimit, dati.Tables["rischio"])
            {
                Style = Style.ConsulenzaUnica,
                AlternateRow = false,
                ShowSeparationLines = true,
                RowHeight = 27,
                Footer = false,
                HeaderHeight = 30,
                ShowBorderLastLine = true
            };

            tabella.Columns.Add(new ColumnPDF("ImmaginePatrimonio", 15, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Immagine, "ImmaginePatrimonio", string.Empty) { DeltaYContent = 6.5F, ScaleColumnTypeImage = 0.27F });
            if (presenzaColonnaGradoCopertura)
                tabella.Columns.Add(new ColumnPDF("Patrimonio", 110, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Testo, "Patrimonio", "Portafoglio") { HeaderPaddingLeft = 10, PaddingLeft = 10, HeaderFontSize = 7 });
            else
                tabella.Columns.Add(new ColumnPDF("Patrimonio", 185, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Testo, "Patrimonio", "Portafoglio") { HeaderPaddingLeft = 10, PaddingLeft = 10, HeaderFontSize = 7 });
            tabella.Columns.Add(new ColumnPDF("Controvalore", 100, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Decimale, "Controvalore", "Controvalore (€)") { HeaderFontSize = 7, PaddingRight = 4 });
            tabella.Columns.Add(new ColumnPDF("RischioCredito", 80, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Testo, "RischioCreditoString", "Rischio Credito") { HeaderFontSize = 7, PaddingRight = 4 });
            tabella.Columns.Add(new ColumnPDF("Var", 60, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Testo, "VaRString", "VaR (%)") { HeaderFontSize = 7, PaddingRight = 4 });
            if (presenzaColonnaGradoCopertura)
                tabella.Columns.Add(new ColumnPDF("GradoCopertura", 80, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Decimale, "GradoCopertura", "Grado di <br>copertura (%)") { HeaderFontSize = 7, PaddingRight = 4 });
            tabella.Columns.Add(new ColumnPDF("Adeguatezza", 75, HorizontalAlignmentType.Centrato, false, false, 7, ColumnType.Testo, "AdeguatezzaString", "Adeguatezza") { HeaderFontSize = 7, PaddingRight = 2 });

            int i = 0;
            int colonna = 0;
            foreach (DataRow r in tabella.DataSource.Rows)
            {
                if (presenzaColonnaGradoCopertura)
                    colonna = 6;
                else
                    colonna = 5;
                switch (r["AdeguatezzaString"].ToString())
                {
                    case "Adeguato":
                        tabella.Cells[colonna, i].FontColor = ColorPDF.Verde;
                        break;
                    case "Non adeguato":
                        tabella.Cells[colonna, i].FontColor = ColorPDF.Rosso;
                        break;
                    default:
                        tabella.Cells[colonna, i].FontColor = ColorPDF.Nero;
                        break;
                }
                //var colorAdeguatezza = Convert.ToBoolean(r["Adeguatezza"]) ? new ColorPDF(0, 176, 70) : new ColorPDF(255, 0, 0);
                //if (presenzaColonnaGradoCopertura)
                //    tabella.Cells[6, i].FontColor = colorAdeguatezza;
                //else
                //    tabella.Cells[5, i].FontColor = colorAdeguatezza;
                tabella.Cells[2, i].HorizontalAlignment =
                      tabella.Cells[3, i].HorizontalAlignment =
                       tabella.Cells[4, i].HorizontalAlignment = HorizontalAlignmentType.Destra;
                tabella.Cells[3, i].Value = r["RischioCreditoString"].ToString().ToLower().Contains("classe") ? Helper.CapitalizeWords(r["RischioCreditoString"].ToString()) : r["RischioCreditoString"].ToString();

                if (presenzaColonnaGradoCopertura)
                    tabella.Cells[5, i].HorizontalAlignment = HorizontalAlignmentType.Destra;
                i++;
            }
            #endregion

            //manca il grafico sopra

            AddElement(tabella);

            #region Label Grafico
            AddElement(new FormattedTextAreaPDF("Area di non adeguatezza", EnvironmentFacade.RendererFacade.XLeftLimit + 365) { Y = 227, FontSize = 6.5F, AbsolutePosition = true });

            var xAreaAdeguatezza = Convert.ToDouble(dati.Tables["cliente"].Rows[0]["RischioCreditoMassimoProfilo"]);
            var yAreaAdeguatezza = Convert.ToDouble(dati.Tables["cliente"].Rows[0]["RischioMercatoMassimoProfilo"]);
            //AddElement(new FormattedTextAreaPDF("Area adeguatezza", EnvironmentFacade.RendererFacade.XLeftLimit + 230) { Y = 410, FontSize = 6.5F, AbsolutePosition = true });
            AddElement(new FormattedTextAreaPDF("Area di adeguatezza", EnvironmentFacade.RendererFacade.XLeftLimit + 140 + ((float)xAreaAdeguatezza * graficoCombination.Width / (float)graficoCombination.MaximumValueAxisX) - 59)
            {
                Y = 417 - ((float)yAreaAdeguatezza * graficoCombination.Height / (float)graficoCombination.MaximumValueAxisY) + 8,
                FontSize = 6.5F,
                AbsolutePosition = true
            });
            #endregion

            AddElement(new SpacePDF(-15));
            if (GetNota1().Length + GetNota2().Length > 0)
            {
                tabella.Notes.Add(
                    new TableNotePDF(TableNotePDF.TableNotePositionType.PièDiTabella,
                        GetNota1() + GetNota2(),
                        new[] { /*"Patrimonio", "CodicePatrimonio='PA'"*/ "" },
                        string.Empty,
                        TableNotePDF.TableNoteAsteriskPositionType.CorpoTabella)
                    { FontSize = 6, TextHorizontalAlign = ceTe.DynamicPDF.TextAlign.Justify, DeltaY = 5 }
                        );
                AddElement(new SpacePDF(5));
            }

            if (GetNota3().Length > 0)
            {
                AddElement(new SpacePDF(GetNota1().Length + GetNota2().Length > 0 ? 10 : 5));
                AddElement(new FormattedTextAreaPDF(GetNota3(), EnvironmentFacade.RendererFacade.XLeftLimit) { FontSize = 6, TextHorizontalAlign = ceTe.DynamicPDF.TextAlign.Justify });

            }

            if (datiSeiUnico.rischioUnit().adeguatezza.adeguatezzaTopBean.datiPortafoglio != null && GetNota4().Length > 0)
            {
                AddElement(new SpacePDF(GetNota1().Length + GetNota2().Length > 0 || GetNota3().Length > 0 ? 10 : 5));
                AddElement(new FormattedTextAreaPDF(GetNota4(), EnvironmentFacade.RendererFacade.XLeftLimit) { FontSize = 6, TextHorizontalAlign = ceTe.DynamicPDF.TextAlign.Justify });

            }

            if (GetNota5().Length > 0)
            {
                AddElement(new SpacePDF(GetNota1().Length + GetNota2().Length > 0 || GetNota3().Length > 0 || GetNota4().Length > 0 ? 10 : 5));
                AddElement(new FormattedTextAreaPDF(GetNota5(), EnvironmentFacade.RendererFacade.XLeftLimit) { FontSize = 6, TextHorizontalAlign = ceTe.DynamicPDF.TextAlign.Justify });

            }

            if (GetNota6().Length > 0)
            {
                AddElement(new SpacePDF(GetNota1().Length + GetNota2().Length > 0 || GetNota3().Length > 0 || GetNota4().Length > 0 || GetNota5().Length > 0 ? 10 : 5));
                AddElement(new FormattedTextAreaPDF(GetNota6(), EnvironmentFacade.RendererFacade.XLeftLimit) { FontSize = 6, TextHorizontalAlign = ceTe.DynamicPDF.TextAlign.Justify });

            }

            if (datiSeiUnico.rischioUnit().adeguatezza.adeguatezzaTopBean.flagfiduciariaPluriMandato)
            {
                string testonota637 = isAdeguata ? "La valutazione di adeguatezza del \"portafoglio attuale\" e del \"portafoglio proposto\" in termini di \"Rischio Mercato (VaR)\" e di \"Rischio Credito\" prende in considerazione il patrimonio detenuto presso $/Banca/$ da tutti i mandati fiduciari associati al medesimo fiduciante a cui appartiene il mandato " + datiSeiUnico.getClienteReport().codiceMandato + ", insieme al patrimonio del mandato " + datiSeiUnico.getClienteReport().codiceMandato + " derivante dalla presente proposta (limitatamente al \"portafoglio proposto\"). Gli indicatori \"Rischio Mercato (VaR)\" e \"Rischio Credito\", invece, sono calcolati considerando esclusivamente i prodotti detenuti dal mandato " + datiSeiUnico.getClienteReport().codiceMandato + ", insieme alle operazioni effettuate nella presente proposta. "
                : "La valutazione di adeguatezza del \"portafoglio attuale\" e del \"portafoglio prospettico\" in termini di \"Rischio Mercato (VaR)\" e di \"Rischio Credito\" prende in considerazione il patrimonio detenuto presso $/Banca/$ da tutti i mandati fiduciari associati al medesimo fiduciante a cui appartiene il mandato " + datiSeiUnico.getClienteReport().codiceMandato + ", insieme al patrimonio del mandato " + datiSeiUnico.getClienteReport().codiceMandato + " derivante dalle operazioni da lei richieste al suo private banker (limitatamente al \"portafoglio prospettico\"). Gli indicatori \"Rischio Mercato (VaR)\" e \"Rischio Credito\", invece, sono calcolati considerando esclusivamente i prodotti detenuti dal mandato " + datiSeiUnico.getClienteReport().codiceMandato + ", insieme alle operazioni da lei richieste al suo private banker. ";
                AddElement(new SpacePDF(GetNota1().Length + GetNota2().Length > 0 || GetNota3().Length > 0 || GetNota4().Length > 0 || GetNota5().Length > 0 || GetNota6().Length > 0 ? 10 : 5));
                AddElement(new FormattedTextAreaPDF(datiSeiUnico.FormatBanca(testonota637), EnvironmentFacade.RendererFacade.XLeftLimit) { FontSize = 6, TextHorizontalAlign = ceTe.DynamicPDF.TextAlign.Justify });
            }

            if (GetNota7().Length > 0)
            {
                AddElement(new SpacePDF(datiSeiUnico.rischioUnit().adeguatezza.adeguatezzaTopBean.flagfiduciariaPluriMandato || GetNota1().Length + GetNota2().Length > 0 || GetNota3().Length > 0 || GetNota4().Length > 0 || GetNota5().Length > 0 || GetNota6().Length > 0 ? 10 : 5));
                AddElement(new FormattedTextAreaPDF(GetNota7(), EnvironmentFacade.RendererFacade.XLeftLimit) { FontSize = 6, TextHorizontalAlign = ceTe.DynamicPDF.TextAlign.Justify });

            }
        }

        /// <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()
        {
            var ds = new DataSet();
            ds.Tables.Add(new DataTable("rischio"));
            ds.Tables.Add(new DataTable("soglieX"));
            ds.Tables.Add(new DataTable("soglieY"));
            ds.Tables.Add(new DataTable("cliente"));

            //profilo finanziario cliente/nucleo
            var anagrafica = datiSeiUnico.piramideModelloUnit().questionarioMifid;
            //Adriano
            #region Cliente professionale
            var cliente = datiSeiUnico.clienteUnit().anagrafica;

            bool profiloProfessionale;
            bool profiloAggressivo;
            bool profiloProfessionaleAggressivo;

            var profiler = new Profiler(cliente);

            profiloProfessionale = profiler.ProfiloProfessionale;
            profiloAggressivo = profiler.ProfiloAggressivo;
            profiloProfessionaleAggressivo = profiler.ProfiloProfessionaleAggressivo;

            //Adriano per test:
            //profiloProfessionale = true;
            //profiloAggressivo = true;
            //profiloProfessionaleAggressivo = true;

            #endregion
            //--Adriano
            var rischioMercatoMassimoProfiloCliente = anagrafica.profileVarMax;
            var rischioCreditoMassimoProfiloCliente = Convert.ToInt32(anagrafica.profileClassRcId);

            //Adriano: forzo a 50 il Rischio Mercato Massimo per simulare il caso dei Clienti Pro
            // Verificare il valore fornito dal WS, che potrebbe essere già corretto
            if (profiloProfessionaleAggressivo)
                rischioMercatoMassimoProfiloCliente = 50;
            //--Adriano
            ////RC
            //var adegRischioCreditoAttuale = (from o in  datiSeiUnico.rischioUnit().adeguatezza.adeguatezzaTopBean.listaAdeguatezza where o.id == "RC" select o).LastOrDefault();
            ////RM
            //var adegRischioMercatoAttuale = (from o in datiSeiUnico.rischioUnit().adeguatezza.adeguatezzaTopBean.listaAdeguatezza where o.id == "RM" select o).LastOrDefault();

            //RC
            var adegRischioCreditoAttuale = (from o in datiSeiUnico.rischioUnit().adeguatezza.adeguatezzaTopBean.listaAdeguatezza where o.id == "RC" select o).LastOrDefault();
            //RM
            var adegRischioMercatoAttuale = (from o in datiSeiUnico.rischioUnit().adeguatezza.adeguatezzaTopBean.listaAdeguatezza where o.id == "RM" select o).LastOrDefault();

            //RC
            var adegRischioCreditoProposto = (from o in datiSeiUnico.propostaUnit().stAdequatezza.listaDettagliAdeguatezza where o.idDescIndicatore == "RC" select o).LastOrDefault();
            //RM
            var adegRischioMercatoProposto = (from o in datiSeiUnico.propostaUnit().stAdequatezza.listaDettagliAdeguatezza where o.idDescIndicatore == "RM" select o).LastOrDefault();


            var datiPortaglioAttuale = datiSeiUnico.rischioUnit().adeguatezza.adeguatezzaTopBean.datiPortafoglio;

            var portafoglioproposto = datiSeiUnico.propostaUnit().stDettaglioProposta;
            var datiAdeguatezzaProposta = datiSeiUnico.propostaUnit().stAdequatezza;

            string[] lowerString = { "-", "n.a.", "n.d.", "n.c." };

            var rischioCreditoPortafoglioProposto = "";

            foreach (var item in from a in datiAdeguatezzaProposta.listaDettagliAdeguatezza orderby a.ordinamento select a)
            {
                {

                    if (item.descrizioneIndicatore != null && item.descrizioneIndicatore.ToLower().Equals("rischio credito")) {
                        rischioCreditoPortafoglioProposto = item.ptfProspettico.Equals("") ? "-" :
                                      !lowerString.Contains(item.ptfProspettico.ToLower()) && !item.descrizioneIndicatore.ToLower().Contains("frequenza") ?
                                          Helper.FormatCurrency(item.ptfProspettico.ToString().Replace(".", ",")) : Helper.FormatDecimal(item.ptfProspettico, 0);
                    }

                }
            }


                    if (datiPortaglioAttuale != null)
                presenzaColonnaGradoCopertura = datiPortaglioAttuale.copertura < 100 || portafoglioproposto.copertura < 100;
            else
                presenzaColonnaGradoCopertura = false;

            #region Rischio

            ds.Tables["rischio"].Columns.Add(new DataColumn("Patrimonio", typeof(string)));
            ds.Tables["rischio"].Columns.Add(new DataColumn("NumeroPatrimonio", typeof(int)));
            ds.Tables["rischio"].Columns.Add(new DataColumn("CodicePatrimonio", typeof(string)));
            ds.Tables["rischio"].Columns.Add(new DataColumn("ImmaginePatrimonio", typeof(string)));
            ds.Tables["rischio"].Columns.Add(new DataColumn("Controvalore", typeof(decimal)));
            ds.Tables["rischio"].Columns.Add(new DataColumn("VaR", typeof(decimal)));
            ds.Tables["rischio"].Columns.Add(new DataColumn("VaRString", typeof(string)));
            ds.Tables["rischio"].Columns.Add(new DataColumn("RischioCredito", typeof(decimal)));
            ds.Tables["rischio"].Columns.Add(new DataColumn("RischioCreditoString", typeof(string)));
            ds.Tables["rischio"].Columns.Add(new DataColumn("GradoCopertura", typeof(decimal)));
            ds.Tables["rischio"].Columns.Add(new DataColumn("Adeguatezza", typeof(bool)));
            ds.Tables["rischio"].Columns.Add(new DataColumn("AdeguatezzaString", typeof(string)));

            #region Portafoglio Attuale
            if (datiPortaglioAttuale != null)
            {
                ds.Tables["rischio"].Rows.Add(
                    "Portafoglio attuale" + (GetNota1().Length > 0 ? "*" : ""), //Patrimonio
                       1,
                       "PA", //CodicePortafoglio
                       "PallinoPortafoglioAttuale.png", //pallino
                       datiSeiUnico.ATTUTALE_TOTALEPOSITIVO, //Controvalore
                       Convert.ToDecimal(datiPortaglioAttuale.valoreVaR), //VaR
                       adegRischioMercatoAttuale.patrimonioFideuram.Replace(".", ","), //VaRString
                       datiPortaglioAttuale.classeRischioCredito.ToString(), //RischioCredito
                       Helper.resultValueVariousString(adegRischioCreditoAttuale.patrimonioFideuram), //RischioCreditoString                  
                                                                                                      //datiPortaglioAttuale.copertura, //GradoCopertura
                       datiSeiUnico.pianificazioneUnit().pianificazioneVerticale.varInfos.stat.copertura,
                       adegRischioCreditoAttuale.isAdeguato && adegRischioMercatoAttuale.isAdeguato, //Adeguatezza 
                                                                                                     //!adegRischioCreditoAttuale.isAdeguatoSpecified ? "n.a." : (datiPortaglioAttuale.copertura > 0 ? adegRischioMercatoAttuale.isAdeguato ? "Adeguato" : "Non Adeguato" : "n.c.") //AdeguatezzaString                       
                       !adegRischioCreditoAttuale.isAdeguatoSpecified ? "n.a." : (adegRischioCreditoAttuale.isAdeguato && adegRischioMercatoAttuale.isAdeguato ? "Adeguato" : "Non adeguato") //AdeguatezzaString
                       );
            }
            #endregion

            #region Portafoglio Proposto
            ds.Tables["rischio"].Rows.Add(
                "Portafoglio " + (datiSeiUnico.flagAdeguatezzaPro() ? "proposto" : "prospettico") + (GetNota2().Length > 0 ? "*" : ""), //Patrimonio
                   2,
                   "PP", //CodicePortafoglio
                   "PallinoPortafoglioProposto.png", //pallino
                   datiSeiUnico.PROPOSTO_TOTALEPOSITIVO, //Controvalore
                   portafoglioproposto.rischioMercato, //VaR
                   portafoglioproposto.rischioMercatoDec, //VaRString
                   portafoglioproposto.rischioCredito, //RischioCredito
                   Helper.resultValueVariousString(rischioCreditoPortafoglioProposto.Equals("")? portafoglioproposto.rischioCreditoDec : rischioCreditoPortafoglioProposto), //RischioCreditoString                  
                   Math.Round(portafoglioproposto.copertura, 2), //GradoCopertura
                   adegRischioCreditoProposto.flagAdeguatezza && adegRischioMercatoProposto.flagAdeguatezza, //Adeguatezza TODO
                   !adegRischioCreditoProposto.flagAdeguatezzaSpecified ? "n.a." : (adegRischioCreditoProposto.flagAdeguatezza && adegRischioMercatoProposto.flagAdeguatezza ? "Adeguato" : "Non adeguato") //AdeguatezzaString
                   );
            #endregion

            #endregion

            #region Soglie Asse X

            // I valori non sono quelli reali definiti nel database ma sono riproporzionati in funzione della richiesta del cliente.

            ds.Tables["soglieX"].Columns.Add(new DataColumn("Id", typeof(int)));
            ds.Tables["soglieX"].Columns.Add(new DataColumn("Valore", typeof(decimal)));
            ds.Tables["soglieX"].Rows.Add(1, 8.77);
            ds.Tables["soglieX"].Rows.Add(2, 17.54);
            ds.Tables["soglieX"].Rows.Add(3, 26.31);
            //  dtSoglieX.Rows.Add(4, 32);m valore cliente: modificato il 30 maggio perchè ppt è diverso. e quindi mettiamo quello sotto:
            ds.Tables["soglieX"].Rows.Add(4, 35.08);

            #endregion

            #region Soglie Asse Y
            ds.Tables["soglieY"].Columns.Add(new DataColumn("Valore", typeof(decimal)));
            ds.Tables["soglieY"].Columns.Add(new DataColumn("Testo", typeof(string)));
            ds.Tables["soglieY"].Rows.Add(2, "2,00");
            ds.Tables["soglieY"].Rows.Add(4.5, "4,50");
            ds.Tables["soglieY"].Rows.Add(9.5, "9,50");
            ds.Tables["soglieY"].Rows.Add(15, "15,00");
            //Adriano
            //ds.Tables["soglieY"].Rows.Add(27, "27,00");
            if (profiloProfessionaleAggressivo)
                ds.Tables["soglieY"].Rows.Add(50, "50,00");
            else
                ds.Tables["soglieY"].Rows.Add(27, "27,00");
            //--Adriano

            #endregion

            #region Cliente
            ds.Tables["cliente"].Columns.Add(new DataColumn("RischioMercatoMassimoProfilo", typeof(decimal)));
            ds.Tables["cliente"].Columns.Add(new DataColumn("RischioCreditoMassimoProfilo", typeof(decimal)));
            var RischioCreditoMassimoProfilo = ds.Tables["soglieX"].AsEnumerable().FirstOrDefault(o => o.Field<int>("Id").Equals(rischioCreditoMassimoProfiloCliente))["Valore"];
            ds.Tables["cliente"].Rows.Add(rischioMercatoMassimoProfiloCliente, RischioCreditoMassimoProfilo);

            #endregion

            return ds;
        }
        public virtual string GetTesto1()
        {
            bool isAdeguata = datiSeiUnico.flagAdeguatezzaPro();
            string testo = "";
            testo = isAdeguata ?
                Helper.ReplaceVariables("In questa scheda è riportato il confronto, in termini di Rischio Mercato (VaR) e di Rischio Credito, tra il patrimonio che lei attualmente detiene presso $/Banca/$ (\"portafoglio attuale\"), il patrimonio derivante dalla presente proposta (\"portafoglio proposto\"), e i limiti massimi associati al suo profilo finanziario. Nel grafico sono indicate l'area di adeguatezza e l'area di non adeguatezza: la prima individua le situazioni in cui sia il Rischio Mercato (VaR) sia il Rischio Credito del singolo portafoglio sono inferiori ai livelli massimi associati al suo profilo finanziario.", base.EnvironmentFacade.ReportEnvironment) :
                Helper.ReplaceVariables("In questa scheda è riportato il confronto, in termini di Rischio Mercato (VaR) e di Rischio Credito, tra il patrimonio che lei attualmente detiene presso $/Banca/$ (\"portafoglio attuale\"), il patrimonio derivante dalle operazioni da lei richieste al suo private banker (\"portafoglio prospettico\"), e i limiti massimi associati al suo profilo finanziario. Nel grafico sono indicate l'area di adeguatezza e l'area di non adeguatezza: la prima individua le situazioni in cui sia il Rischio Mercato (VaR) sia il Rischio Credito del singolo portafoglio sono inferiori ai livelli massimi associati al suo profilo finanziario.", base.EnvironmentFacade.ReportEnvironment);
            return testo;
        }

        public virtual string GetNota1()
        {
            string nota = "";

            // 20181009 AC
            //if (getCCN_CASA() != 0 || getGPELIGOFONDI_CASA() != 0 || getGPELIGOTITOLI_CASA() != 0)
            if (getCCN_CASA() != 0 || getGPELIGOFONDI_CASA() != 0 || getGPELIGOTITOLI_CASA() != 0 || getTUOFOGLIO_CASA() != 0)
            //--20181009 AC
            {
                nota = "Il controvalore del portafoglio attuale esclude il saldo negativo ";
                if (getCCN_CASA() != 0)
                    nota += "dei conti correnti (" + Helper.FormatCurrency(getCCN_CASA().ToString()) + " €)";
                // 20181009 AC
                if (getTUOFOGLIO_CASA() != 0)
                {
                    nota += getCCN_CASA() != 0 ? ", " : "";
                    nota += "della liquidità sottostante Il Mio Foglio (" + Helper.FormatCurrency(getTUOFOGLIO_CASA().ToString()) + "€)";
                }
                //--20181009 AC
                if (getGPELIGOFONDI_CASA() != 0)
                {
                    nota += getCCN_CASA() != 0 ? ", " : "";
                    nota += "della liquidità sottostante la GP Eligo Fondi (" + Helper.FormatCurrency(getGPELIGOFONDI_CASA().ToString()) + "€)";
                }

                if (getGPELIGOTITOLI_CASA() != 0)
                {
                    nota += (getCCN_CASA() != 0 || getGPELIGOFONDI_CASA() != 0) ? ", " : "";
                    nota += "della liquidità sottostante la GP Eligo Titoli (" + Helper.FormatCurrency(getGPELIGOTITOLI_CASA().ToString()) + "€)";
                }
                nota += ". ";
            }
            return nota;
        }
        public virtual string GetNota2()
        {
            string nota = "";

            // 20181009 AC
            //if (getPropostaCCN_CASA() != 0 || getPropostaGPELIGOFONDI_CASA() != 0 || getPropostaGPELIGOTITOLI_CASA() != 0)
            if (getPropostaCCN_CASA() != 0 || getPropostaGPELIGOFONDI_CASA() != 0 || getPropostaGPELIGOTITOLI_CASA() != 0 || getPropostaTUOFOGLIO_CASA() != 0)
            //--20181009 AC
            {
                nota += "Il controvalore del portafoglio " + (datiSeiUnico.flagAdeguatezzaPro() ? "proposto" : "prospettico") + " esclude il saldo negativo ";
                if (getPropostaCCN_CASA() != 0)
                    nota += "dei conti correnti (" + Helper.FormatCurrency(getTotaleNonRappr().ToString()) + " €)";

                // 20181009 AC
                if (getPropostaTUOFOGLIO_CASA() != 0)
                {
                    nota += getCCN_CASA() != 0 ? ", " : "";
                    nota += "della liquidità sottostante Il Mio Foglio (" + Helper.FormatCurrency(getPropostaTUOFOGLIO_CASA().ToString()) + "€)";
                }
                //--20181009 AC
                if (getPropostaGPELIGOFONDI_CASA() != 0)
                {
                    nota += getCCN_CASA() != 0 ? ", " : "";
                    nota += "della liquidità sottostante la GP Eligo Fondi (" + Helper.FormatCurrency(getPropostaGPELIGOFONDI_CASA().ToString()) + "€)";
                }

                if (getGPELIGOTITOLI_CASA() != 0)
                {
                    nota += (getPropostaCCN_CASA() != 0 || getPropostaGPELIGOFONDI_CASA() != 0) ? ", " : "";
                    nota += "della liquidità sottostante la GP Eligo Titoli (" + Helper.FormatCurrency(getPropostaGPELIGOTITOLI_CASA().ToString()) + "€)";
                }
                nota += ". ";
            }
            return nota;
        }
        public virtual string GetNota3()
        {

            foreach (var item in datiSeiUnico.propostaUnit().dettaglioOperazioni.elencoDettagliOperazioni)
            {
                foreach (var i in item.listaOperzioni)
                {
                    if (i.investi != 0) return "";
                }
            }
            string nota = "A prescindere dai singoli indicatori di rischio relativi al patrimonio derivante dalla presente proposta (";
            nota += "\"portafoglio proposto\"), la proposta risulta adeguata in quanto contiene esclusivamente operazioni di vendita ";
            nota += "/ liquidazione / riscatto, che non sono oggetto di valutazione di adeguatezza. ";
            return nota;
        }


        public virtual string GetNota4()
        {
            string nota = "";
            var GCproposto = datiSeiUnico.propostaUnit().stDettaglioProposta.copertura;
            var coperturaDeltaRM = datiSeiUnico.propostaUnit().stAdequatezza.listaDettagliAdeguatezza.FirstOrDefault(x => x.idDescIndicatore.Equals("RM")).coperturaDelta;
            var coperturaDeltaRC = datiSeiUnico.propostaUnit().stAdequatezza.listaDettagliAdeguatezza.FirstOrDefault(x => x.idDescIndicatore.Equals("RC")).coperturaDelta;
            var GCattuale = datiSeiUnico.pianificazioneUnit().pianificazioneVerticale.varInfos.stat.copertura;
            bool coperturaAdeguatezza = GCproposto < 90 & coperturaDeltaRM.Equals("100.00");

            var varProposto = datiSeiUnico.propostaUnit().stDettaglioProposta.rischioMercato;
            var varAttuale = Convert.ToDecimal(datiSeiUnico.rischioUnit().adeguatezza.adeguatezzaTopBean.datiPortafoglio.valoreVaR);
            var varMax = datiSeiUnico.piramideModelloUnit().questionarioMifid.profileVarMax;
            bool prospetticoMigliorativoVar = varProposto < varAttuale & varProposto > varMax;

            var rischioCreditoProposto = datiSeiUnico.propostaUnit().stDettaglioProposta.rischioCredito;
            var rischioCreditoMax = Convert.ToDecimal(datiSeiUnico.piramideModelloUnit().questionarioMifid.profileClassRcId);
            var rischioAttuale = datiSeiUnico.rischioUnit().adeguatezza.adeguatezzaTopBean.datiPortafoglio.classeRischioCredito;
            bool prospetticoMigliorativoRC = rischioCreditoProposto < rischioAttuale & rischioCreditoProposto > rischioCreditoMax;

            string adeguata = datiSeiUnico.flagAdeguatezzaPro() ?
                        "effettuate sia coerente con la soglia massima associata al suo profilo finanziario" :
                        "da lei richieste al suo private banker sia coerente con la soglia massima associata al suo profilo finanziario";

            if (prospetticoMigliorativoVar || prospetticoMigliorativoRC || coperturaAdeguatezza)
            {
                nota = "La valutazione di adeguatezza in termini di ";
                if (prospetticoMigliorativoVar || coperturaAdeguatezza)
                    nota += "Rischio Mercato (VaR) " + (prospetticoMigliorativoRC || coperturaAdeguatezza ? "e " : "");
                if (prospetticoMigliorativoRC || coperturaAdeguatezza)
                    nota += "Rischio Credito ";
                nota += "è stata effettuata verificando che ";
                if (prospetticoMigliorativoVar || coperturaAdeguatezza)
                    nota += "il livello di Rischio Mercato (VaR) delle sole operazioni d’investimento " + adeguata + (prospetticoMigliorativoRC || coperturaAdeguatezza ? " e che " : "");
                if (prospetticoMigliorativoRC || coperturaAdeguatezza)
                    nota += "la Classe di Rischio Credito delle sole operazioni d’investimento " + adeguata;
                nota += ". ";
            }

            return nota;
        }

        public virtual string GetNota5()
        {
            string nota = "";

            var RM = !datiSeiUnico.propostaUnit().stAdequatezza.listaDettagliAdeguatezza.AsEnumerable().FirstOrDefault(o => o.idDescIndicatore == "RM").copertura.Equals("100.00");
            var RC = !datiSeiUnico.propostaUnit().stAdequatezza.listaDettagliAdeguatezza.AsEnumerable().FirstOrDefault(o => o.idDescIndicatore == "RC").copertura.Equals("100.00");
            if (!datiSeiUnico.flagAdeguatezzaPro() && (RM || RC))
            {



                nota += "Il patrimonio derivante dalle operazioni da lei richieste al suo private banker (\"portafoglio prospettico\") risulta non adeguato al suo profilo finanziario in termini di " +
                        (RM ? RC ? "Rischio Mercato (VaR) e di Rischio Credito" : "Rischio Mercato (VaR)" : RC ? "Rischio Credito" : "") +
                        ", in quanto le operazioni da lei richieste al suo private banker hanno ad oggetto uno o più prodotti per cui non è disponibile " +
                        (RM ? RC ? "il relativo livello di Rischio Mercato (VaR) e la relativa classe di Rischio Credito" : "il relativo livello di Rischio Mercato (VaR)" : RC ? "la relativa classe di Rischio Credito" : "") +
                        ".";



            }
            return datiSeiUnico.FormatBanca(nota);
        }


        public virtual string GetNota6()
        {
            string nota = string.Empty;
            if (datiSeiUnico.propostaUnit().stAdequatezza.flagAdeguatezzaMIFIDPro)
            {
                nota += "La valutazione di adeguatezza del patrimonio derivante dalla presente proposta (\"portafoglio proposto\") ";
                nota += "non è necessaria in quanto tutti i prodotti oggetto delle operazioni di investimento effettuate non sono ";
                nota += "soggetti alla valutazione di adeguatezza MiFID. ";
            }
            return nota;
        }

        public virtual string GetNota7()
        {
            string nota = string.Empty;
            if (datiSeiUnico.propostaUnit().stAdequatezza.flagVarEccessivamenteAdeguatoPro)
            {
                nota += "Il patrimonio derivante dalla presente proposta (\"portafoglio proposto\") risulta adeguato al suo profilo ";
                nota += "finanziario. Le segnaliamo, tuttavia, che il livello di Rischio Mercato (VaR) del patrimonio derivante dalla ";
                nota += "presente proposta (\"portafoglio proposto\") si posiziona su un valore sensibilmente inferiore rispetto alla ";
                nota += "soglia minima attribuita al suo profilo finanziario. ";
            }
            return nota;
        }

        public virtual decimal getCCN_CASA()
        {
            return datiSeiUnico.pianificazioneUnit().pianificazioneVerticale.contoCorrenteNegativo;
        }
		public virtual decimal getTotaleNonRappr()
		{
			return datiSeiUnico.patrimonioUnit().patrimonioCasa.esposizioneValutariaTutte.distribuzione.totaleNonRappr;
		}

		public virtual decimal getGPELIGOFONDI_CASA()
        {
            return datiSeiUnico.pianificazioneUnit().pianificazioneVerticale.liqEligoFondiNeg;
        }

        public virtual decimal getGPELIGOTITOLI_CASA()
        {
            return datiSeiUnico.pianificazioneUnit().pianificazioneVerticale.liqEligoTitoliNeg;
        }

        public virtual decimal getPropostaCCN_CASA()
        {
            return datiSeiUnico.propostaUnit().stDettaglioProposta.contoCorrenteNegativo;
        }

        public virtual decimal getPropostaGPELIGOFONDI_CASA()
        {
            return datiSeiUnico.propostaUnit().stDettaglioProposta.liqEligoFondiNeg;
        }

        public virtual decimal getPropostaGPELIGOTITOLI_CASA()
        {
            return datiSeiUnico.propostaUnit().stDettaglioProposta.liqEligoTitoliNeg;
        }

        // 20181009 AC
        public virtual decimal getTUOFOGLIO_CASA()
        {
            return datiSeiUnico.pianificazioneUnit().pianificazioneVerticale.liqFogliNeg;
        }

        public virtual decimal getPropostaTUOFOGLIO_CASA()
        {
            return datiSeiUnico.propostaUnit().stDettaglioProposta.liqFogliNeg;
        }
        //--20181009 AC

        //20180907 AC
        private double xPosRC(string val)
        {
            double retVal = 0;
            switch (val.ToLower())
            {
                case "classe a": retVal = 4.385; break;
                case "classe b": retVal = 13.155; break;
                case "classe c": retVal = 21.925; break;
                case "classe d": retVal = 30.695; break;
                default: retVal = 0; break;
            }

            return retVal;

        }

        //    xVal = 4.375f; // middle of classe A
        //}
        //else if (item["RischioCreditoString"].ToString().ToLower() == "classe b")
        //{
        //    xVal = 13.125f; // middle of classe B
        //}
        //else if (item["RischioCreditoString"].ToString().ToLower() == "classe c")
        //{
        //    xVal = 21.875f; // middle of classe C
        //}
        //else if (item["RischioCreditoString"].ToString().ToLower() == "classe d")
        //{
        //    xVal = 26.25f; // middle of classe D
    }
}
