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.CHART_PDF;
using Consulenza.ReportWriter.Business.Entity;
using Dundas.Charting.WebControl;

namespace Consulenza.ReportWriter.Manager.Section.Unica
{
    /// <summary>
    /// S43.RischioMercatoVSRischioCredito idSezione = 86
    /// </summary>
    public class S43 : Entity.Section
    {
        //private bool _visualizzaAltriIstituti;
        private bool _presenzaNotaPatrimonioCasa = false;
        private bool _presenzaNotaPatrimonioTerzi = false;
        private bool _presenzaNotaEccessivaAdeguatezza = false;

        public S43(EnvironmentFacade environmentFacade, int idSection)
            : base(environmentFacade, idSection)
        {
            try
            {

                Draw();
            }
            catch (Exception ex)
            {
                SectionLogger.Write("S43", ex.Message, SectionLoggerMessageLevel.E, EnvironmentFacade.ReportEnvironment);
            }
        }

        protected override sealed void Draw()
        {

           // if (EnvironmentFacade.ReportEnvironment.ReportId == 6) //nuclei
            var dati = GetDataSet();
            var testi = GetText();
            var nota = Helper.ReplaceVariables(GetNote(), EnvironmentFacade.ReportEnvironment);
            var series = new List<Serie>();
            var coloreSerieAreaAdeguata = new ColorPDF(228, 235, 238);
            var coloreSerieAreaNonAdeguata = new ColorPDF(204, 217, 222);

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


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


            #region Testo introduttivo

            AddElement(new SpacePDF(20));

            var sTesto = string.Empty;

            if (visualizzaAltriIstituti())
                sTesto = testi.Rows[0]["testo1"].ToString();
            else
                sTesto = testi.Rows[0]["testo2"].ToString();

            var testoIntroduttivo = Helper.ReplaceVariables(sTesto, EnvironmentFacade.ReportEnvironment);

            AddElement(new FormattedTextAreaPDF(testoIntroduttivo, EnvironmentFacade.RendererFacade.XLeftLimit) { FontSize = 7, TextHorizontalAlign = ceTe.DynamicPDF.TextAlign.Justify });
            AddElement(new SpacePDF(20));

            #endregion
            // test purposes
            //dati.Tables[3].Rows[0]["RischioCreditoMassimoProfilo"] = 8; // x
            //dati.Tables[3].Rows[0]["RischioMercatoMassimoProfilo"] = 19;

            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)
            //Adriano 20180124: per correggere la posizione del grafico, segnalato troppo a dx
            var graficoCombination = new CombinationPDF(EnvironmentFacade.RendererFacade.XLeftLimit + 110, 1F)
            //var graficoCombination = new CombinationPDF(EnvironmentFacade.RendererFacade.XLeftLimit + 150, 1F)
            //--Adriano
            {
                Name = "comb",
                Height = 200,
                Width = 300,
                MinorGridAxisY = false,
                //Adriano: per eliminare lo sfondo diverso per la non adeguatezza per i nuclei
                //BackColor = coloreSerieAreaNonAdeguata,
                //--Adriano
                BackColor = EnvironmentFacade.ReportEnvironment.ReportId == 6 ? coloreSerieAreaAdeguata: coloreSerieAreaNonAdeguata,

                //modifiche nucleo contrattualizzato

                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[3].Rows[0]["RischioMercatoMassimoProfilo"]) > 27 ? 53 : 30,
                //--Adriano
                //originale:
                //MaximumValueAxisY = 30, // valore fisso 
                // ES START su richiesta del Cliente
                //IndicatorAxisY = new CombinationPDFIndicator() { Text = "Rischio Mercato (VaR) massimo", Value = Convert.ToDouble(dati.Tables[3].Rows[0]["RischioMercatoMassimoProfilo"]), DeltaX = -120, DeltaYText = -10 },
                // END
                CustomLabelAxisY = labelPersonalizzateAsseY,

                //MaximumValueAxisY = 30, // valore fisso 

                //IndicatorAxisY = (EnvironmentFacade.ReportEnvironment.ReportId != 6)?
                //    new CombinationPDFIndicator() { Text = "Rischio Mercato (VaR) massimo", Value = Convert.ToDouble(dati.Tables[3].Rows[0]["RischioMercatoMassimoProfilo"]), DeltaX = -120, DeltaYText = -10 }:
                //    new CombinationPDFIndicator(),

            	//IndicatorAxisY = new CombinationPDFIndicator() { Text = "Rischio Mercato (VaR) massimo", Value = Convert.ToDouble(dati.Tables[3].Rows[0]["RischioMercatoMassimoProfilo"]), DeltaX = -120, DeltaYText = -10 },                
            	//IndicatorAxisY = new CombinationPDFIndicator() { Text = "",  Value = Convert.ToDouble(dati.Tables[3].Rows[0]["RischioMercatoMassimoProfilo"]), DeltaX = -120, DeltaYText = -10 },
            	//CustomLabelAxisY = labelPersonalizzateAsseY,

                ShowLineAxisX = true,
                ShowLabelAxisX = true,
                StartFromZeroAxisX = true,
                MaximumValueAxisX = 35, // valore fisso 
                IntervalNumberAxisX = 4,
                CustomLabelAxisX = labelPersonalizzateAsseX,

                //IndicatorAxisX = (EnvironmentFacade.ReportEnvironment.ReportId != 6) ?
                //    new CombinationPDFIndicator() { Text = "Rischio Credito massimo", Value = Convert.ToDouble(dati.Tables[3].Rows[0]["RischioCreditoMassimoProfilo"]), DeltaXText = 7, DeltaYText = -10, DeltaY = 4 }:
                //    new CombinationPDFIndicator()
           
            //IndicatorAxisX = new CombinationPDFIndicator() { Text = "Rischio Credito massimo", Value = Convert.ToDouble(dati.Tables[3].Rows[0]["RischioCreditoMassimoProfilo"]), DeltaXText = 7, DeltaYText = -10, DeltaY = 4 }
            //IndicatorAxisX = new CombinationPDFIndicator() {  Text = "", Value = Convert.ToDouble(dati.Tables[3].Rows[0]["RischioCreditoMassimoProfilo"]), DeltaXText = 7, DeltaYText = -10, DeltaY = 4 }
        };

            //Adriano 20180125 nel caso in cui non si tratti di un nucleo va mostrato l'indicatore
            if (EnvironmentFacade.ReportEnvironment.ReportId != 6) //Non nuclei
            {
                graficoCombination.IndicatorAxisY = new CombinationPDFIndicator() { Text = "Rischio Mercato (VaR) massimo", Value = Convert.ToDouble(dati.Tables[3].Rows[0]["RischioMercatoMassimoProfilo"]), DeltaX = -120, DeltaYText = -10 };
                graficoCombination.IndicatorAxisX = new CombinationPDFIndicator() { Text = "Rischio Credito massimo", Value = Convert.ToDouble(dati.Tables[3].Rows[0]["RischioCreditoMassimoProfilo"]), DeltaXText = 7, DeltaYText = -10, DeltaY = 4 };
            }

            #region Serie di adeguatezza
            #region modifiche nucleo contrattualizzato
            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[3].Rows[0]["RischioMercatoMassimoProfilo"])),
                                ShowLabelAxisY = false,
                                ShowLabelAxisX = false,
                                Color = coloreSerieAreaAdeguata
                            },
                            new Point {
                                Values = new ValuesPointXY(Convert.ToDouble(dati.Tables[3].Rows[0]["RischioCreditoMassimoProfilo"]), Convert.ToDouble(dati.Tables[3].Rows[0]["RischioMercatoMassimoProfilo"])),
                                ShowLabelAxisY = false,
                                ShowLabelAxisX = false,
                                Color = coloreSerieAreaAdeguata
                            },
                        }
                      }
                  );
            #endregion

            var d = dati.Tables[0].AsEnumerable().OrderByDescending(o => o.Field<int>("NumeroPatrimonio")).CopyToDataTable();

            foreach (DataRow item in d.Rows)
            {
                //series.Add(
                //    new Serie
                //    {
                //        Name = item["CodicePatrimonio"].ToString(),
                //        Type = Dundas.Charting.WebControl.SeriesChartType.Point,
                //        MarkerImage = string.Format("PallinoColorato{0}c.png", item["NumeroPatrimonio"].ToString()),
                //        MarkerSize = 25,
                //        Points = new List<Point>() {
                //            new Point {
                //                Values = new ValuesPointXY(Convert.ToDouble(item["RischioCredito"]), Convert.ToDouble(item["VaR"])),
                //                ShowLabelAxisY = false,
                //                ShowLabelAxisX = false
                //            }
                //        }
                //    }
                //);
                if (item["RischioCreditoString"].ToString() != "n.c." && item["VaRString"].ToString() != "n.c.")
                {

                    #region Patryk #3594
                    //sotto modifica di Patryk per centrare indicatori del grafico tra le classi.(a,b,c,d)
                    //var classea = Convert.ToDouble(dati.Tables[1].Rows[0]["Valore"]);
                    //float xVal = (float)Convert.ToDouble(item["RischioCredito"]);
                    //if (item["RischioCreditoString"].ToString().ToLower() == "classe a")
                    //{

                    //    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
                    //}
                    #endregion
                    graficoCombination.Markers.Add(new Marker()
                    {
                        Image = String.Format("PallinoColorato{0}d.png", item["NumeroPatrimonio"].ToString()),
                        Width = 17,
                        Height = 17,
                        Scale = 1,
                        X = Convert.ToDouble(item["RischioCredito"]) >= 35 ? 35 : (float)Convert.ToDouble(item["RischioCredito"]),
                        //Patryk #3594:X = xVal,
                        Y = Convert.ToDouble(item["VaR"]) > 27 ? 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


            #endregion

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

            AddElement(graficoCombination);

            #endregion

            //Adriano 20180124: per correggere la posizione delle descrizioni asse ascisse (Classe A|Classe B|Classe C|Classe D)
            if (EnvironmentFacade.ReportEnvironment.ReportId != 6)
            {
                //AddElement(new SpacePDF(30));

                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 = true, DeltaY = -90 });

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

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

                //Adriano 20180124: per correggere la posizione della label Rischio Credito
                AddElement(new FormattedTextAreaPDF("Rischio Credito", EnvironmentFacade.RendererFacade.XLeftLimit + 400) { FontBold = true, FontSize = 7, DeltaY = -30 });
                //AddElement(new FormattedTextAreaPDF("Rischio Credito", EnvironmentFacade.RendererFacade.XLeftLimit + 420) { FontBold = true, FontSize = 7, DeltaY = -30 });
                //--Adriano 20180124

            }
            //--Adriano 20180124

            #region Tabella

            var tabella = new TablePDF(EnvironmentFacade.RendererFacade.XLeftLimit, dati.Tables[0])
            {
                Style = Style.ConsulenzaUnica,
                AlternateRow = false,
                ShowSeparationLines = true,
                RowHeight = 27,
                Footer = false,
                HeaderHeight = 27,
                YOffset = -20
            };

            //Adriano 20180125 Se si tratta di nucleo non va mostrata l'adeguatezza
            if (EnvironmentFacade.ReportEnvironment.ReportId == 6) //nuclei
            {
                tabella.Columns.Add(new ColumnPDF("ImmaginePatrimonio", 25, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Immagine, "ImmaginePatrimonio", string.Empty) { DeltaYContent = 5, ScaleColumnTypeImage = 0.32F });
                tabella.Columns.Add(new ColumnPDF("Patrimonio", 175, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Testo, "Patrimonio", "Patrimonio") { HeaderFontSize = 7, FontSize = 7 });
                tabella.Columns.Add(new ColumnPDF("Controvalore", 145, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Decimale, "Controvalore", "Controvalore attuale (€)") { PaddingRight = 30, HeaderFontSize = 7, FontSize = 7 });
                tabella.Columns.Add(new ColumnPDF("RischioCredito", 40, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Testo, "RischioCreditoString", "Rischio<BR>credito") { HeaderFontSize = 7, FontSize = 7, PaddingRight = 10 });
                tabella.Columns.Add(new ColumnPDF("Var", 50, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Testo, "VaRString", "VaR (%)") { HeaderFontSize = 7, FontSize = 7, PaddingRight = 10 });
                tabella.Columns.Add(new ColumnPDF("GradoCopertura", 85, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Testo, "GradoCopertura", "Grado di <br>copertura (%)") { HeaderFontSize = 7, FontSize = 7, PaddingRight = 10 });

            }
            else
            {
                tabella.Columns.Add(new ColumnPDF("ImmaginePatrimonio", 25, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Immagine, "ImmaginePatrimonio", string.Empty) { DeltaYContent = 5, ScaleColumnTypeImage = 0.32F });
                tabella.Columns.Add(new ColumnPDF("Patrimonio", 140, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Testo, "Patrimonio", "Patrimonio") { HeaderFontSize = 7, FontSize = 7 });
                tabella.Columns.Add(new ColumnPDF("Controvalore", 105, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Decimale, "Controvalore", "Controvalore attuale (€)") { PaddingRight = 4, HeaderFontSize = 7, FontSize = 7 });
                tabella.Columns.Add(new ColumnPDF("RischioCredito", 60, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Testo, "RischioCreditoString", "Rischio<BR>credito") { HeaderFontSize = 7, FontSize = 7, PaddingRight = 4 });
                tabella.Columns.Add(new ColumnPDF("Var", 40, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Testo, "VaRString", "VaR (%)") { HeaderFontSize = 7, FontSize = 7, PaddingRight = 4 });
                tabella.Columns.Add(new ColumnPDF("GradoCopertura", 75, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Testo, "GradoCopertura", "Grado di <br>copertura (%)") { HeaderFontSize = 7, FontSize = 7, PaddingRight = 4 });
                tabella.Columns.Add(new ColumnPDF("Adeguatezza", 75, HorizontalAlignmentType.Centrato, false, false, 7, ColumnType.Testo, "AdeguatezzaString", "Adeguatezza") { HeaderFontSize = 7, FontSize = 7 });
            }


            // cloning entire datasource (changing Grado di copertura(%) type from decimal to string, so its possible to put there "n.c."
            DataTable dtCloned = tabella.DataSource.Clone();
            dtCloned.Columns[9].DataType = typeof(string);
            foreach (DataRow row in tabella.DataSource.Rows)
            {
                dtCloned.ImportRow(row);
            }
            tabella.DataSource = dtCloned;

            int i = 0;
            foreach (DataRow r in tabella.DataSource.Rows)
            {
                var colorAdeguatezza = Convert.ToBoolean(r["Adeguatezza"]) ? new ColorPDF(0, 176, 70) : new ColorPDF(255, 0, 0);
                tabella.Cells[6, i].FontColor = colorAdeguatezza;
                tabella.Cells[2, i].HorizontalAlignment =
                   tabella.Cells[3, i].HorizontalAlignment =
                   tabella.Cells[4, i].HorizontalAlignment =
                   tabella.Cells[5, i].HorizontalAlignment = HorizontalAlignmentType.Destra;
                tabella.Cells[3, i].Value = r["RischioCreditoString"].ToString().ToLower().Contains("classe") ? Helper.CapitalizeWords(r["RischioCreditoString"].ToString()) : r["RischioCreditoString"].ToString();
                //if (r["Patrimonio"].ToString().ToLower().Contains("altri"))
                //{
                //    tabella.Cells[6, i].FontColor = ColorPDF.Nero;
                //    tabella.Cells[6, i].Value = "n.a.";
                //}

                decimal result = 0;
                if (Decimal.TryParse(r["GradoCopertura"].ToString(), out result))
                {
                    if (result == 0)
                    {
                        tabella.Cells[5, i].Value = "n.c.";
                    }
                    else
                    {
                        tabella.Cells[5, i].Value = result.ToString("N");
                    }
                }
                i++;
            }


            //Nota della tabella
            if (nota.Length > 0)
            {
                nota = nota.Replace("(*)", "");
                if (_presenzaNotaPatrimonioTerzi && !_presenzaNotaPatrimonioCasa)
                    tabella.Notes.Add(new TableNotePDF(TableNotePDF.TableNotePositionType.PièDiTabella, nota, new[] { "Patrimonio" }, "CodicePatrimonio IN ('PT','PC')", TableNotePDF.TableNoteAsteriskPositionType.CorpoTabella) { FontSize = 6, TextHorizontalAlign = ceTe.DynamicPDF.TextAlign.Justify });
                else if (_presenzaNotaPatrimonioTerzi && _presenzaNotaPatrimonioCasa)
                    tabella.Notes.Add(new TableNotePDF(TableNotePDF.TableNotePositionType.PièDiTabella, nota, new[] { "Patrimonio" }, string.Empty, TableNotePDF.TableNoteAsteriskPositionType.CorpoTabella) { FontSize = 6, TextHorizontalAlign = ceTe.DynamicPDF.TextAlign.Justify });
                else if (!_presenzaNotaPatrimonioTerzi && _presenzaNotaPatrimonioCasa)
                    tabella.Notes.Add(new TableNotePDF(TableNotePDF.TableNotePositionType.PièDiTabella, nota, new[] { "Patrimonio" }, "CodicePatrimonio IN ('BF','PC')", TableNotePDF.TableNoteAsteriskPositionType.CorpoTabella) { FontSize = 6, TextHorizontalAlign = ceTe.DynamicPDF.TextAlign.Justify });
            }
            AddElement(tabella);
            #endregion
            if (datiSeiUnico.rischioUnit().rischio.rischioMercatoCredito.flagfiduciariaPluriMandato)
            {
                AddElement(new SpacePDF(10));
                string codicemandato = datiSeiUnico.getClienteReport().codiceMandato;
                AddElement(new FormattedTextAreaPDF(datiSeiUnico.FormatBanca("La valutazione di adeguatezza del patrimonio $/Banca/$ 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 <" + codicemandato + ">. Gli indicatori «Rischio Mercato (VaR)» e «Rischio Credito» del patrimonio $/Banca/$, invece, sono calcolati considerando esclusivamente i prodotti detenuti dal mandato " + codicemandato + "."), EnvironmentFacade.RendererFacade.XLeftLimit) { FontSize = 6, TextHorizontalAlign = ceTe.DynamicPDF.TextAlign.Justify });
            }
            if (getNotaCopertura5RMRC().Length > 0)
            {
                AddElement(new SpacePDF(10));
                AddElement(new FormattedTextAreaPDF(getNotaCopertura5RMRC(), EnvironmentFacade.RendererFacade.XLeftLimit) { FontSize = 6, TextHorizontalAlign = ceTe.DynamicPDF.TextAlign.Justify });
            }
            //Nota di eccessiva adeguatezza
            if (_presenzaNotaEccessivaAdeguatezza)
            {
                AddElement(new SpacePDF(10));
                AddElement(new FormattedTextAreaPDF(getNoteAde(), EnvironmentFacade.RendererFacade.XLeftLimit) { FontSize = 6 });
                //tabella.Notes.Add(new TableNotePDF(TableNotePDF.TableNotePositionType.PièDiTabella, getNoteAde(), new[] { "Var" }, "CodicePatrimonio IN ('BF','SPI')", TableNotePDF.TableNoteAsteriskPositionType.CorpoTabella) { FontSize = 7 });
            }

            var xAreaAdeguatezza = Convert.ToDouble(dati.Tables[3].Rows[0]["RischioCreditoMassimoProfilo"]);
            var yAreaAdeguatezza = Convert.ToDouble(dati.Tables[3].Rows[0]["RischioMercatoMassimoProfilo"]);

            if (EnvironmentFacade.ReportEnvironment.ReportId != 6) //Non nuclei
            {                                                    

                // OLD X
                // NON ADEGUATEZZA  EnvironmentFacade.RendererFacade.XLeftLimit + 365
                // ADEGUATEZZA      EnvironmentFacade.RendererFacade.XLeftLimit + 150 + ((float)xAreaAdeguatezza * graficoCombination.Width / (float)graficoCombination.MaximumValueAxisX) - 68
                // OLD Y
                // NON ADEGUATEZZA  { Y = 235, FontSize = 6.5F, AbsolutePosition = true }
                // ADEGUATEZZA      {Y = 427 - ((float)yAreaAdeguatezza * graficoCombination.Height / (float)graficoCombination.MaximumValueAxisY) + 8,FontSize = 6.5F,AbsolutePosition = true}    
                                

                AddElement(new FormattedTextAreaPDF("Area di non adeguatezza", EnvironmentFacade.RendererFacade.XLeftLimit + 325) 
                { Y = 225, FontSize = 6.5F, AbsolutePosition = true });
                
                //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 + 110 + ((float)xAreaAdeguatezza * graficoCombination.Width / (float)graficoCombination.MaximumValueAxisX) - 68)
                {
                    Y = 417 - ((float)yAreaAdeguatezza * graficoCombination.Height / (float)graficoCombination.MaximumValueAxisY) + 8,
                    FontSize = 6.5F,
                    AbsolutePosition = true
                });
            }

        }

        /// <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();

            #region Estrazione ChiavePB + Chiamate Servizio

            //Adriano
            #region Cliente/Nucleo professionale

            bool profiloProfessionale;
            bool profiloAggressivo;
            bool profiloProfessionaleAggressivo;

            Profiler profiler;

            if (EnvironmentFacade.ReportEnvironment.ReportId == 6) //nuclei
            {
                DataServices.fideuram.data.service.rsAnagraficaNucleo nucleo = datiSeiUnico.nucleiUnit().anagrafica;
                profiler = new Profiler(nucleo);
            }
            else
            {
                DataServices.fideuram.data.service.rsClienteAnagrafica cliente = datiSeiUnico.clienteUnit().anagrafica;
                profiler = new Profiler(cliente);
            }

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

            #endregion
            //--Adriano

			// TO VERIFY

            //var anagrafica =  datiSeiUnico.piramideModelloUnit().questionarioMifid;


            var rischio = datiSeiUnico.rischioUnit().rischio.rischioMercatoCredito;
            

            //Adriano 20180125 Modifica per nuclei: il profilo non è più gestito per i nuclei
            int profilo;
            decimal rischioMercatoMassimoProfiloCliente;
            int rischioCreditoMassimoProfiloCliente;

            if (EnvironmentFacade.ReportEnvironment.ReportId == 6)
            {
                 profilo = 5;
                 rischioMercatoMassimoProfiloCliente = rischio.soglieMassime.FirstOrDefault(o => o.key == profilo).value.varMax;
                 rischioCreditoMassimoProfiloCliente = Convert.ToInt32(rischio.soglieMassime.FirstOrDefault(o => o.key == profilo).value.rischioCreditoId);
                if (profiloProfessionaleAggressivo)
                    rischioMercatoMassimoProfiloCliente = 50;

            }
            else
            {
	            profilo = rischio.profileId;
                ////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
                //rischioMercatoMassimoProfiloCliente = rischio.soglieMassime.FirstOrDefault(o => o.key == profilo).value.varMax;
                //if (profiloProfessionaleAggressivo)
                //    rischioMercatoMassimoProfiloCliente = 50;
                ////--Adriano
                ////originale

                
                 rischioMercatoMassimoProfiloCliente = rischio.soglieMassime.FirstOrDefault(o => o.key == profilo).value.varMax;
                 rischioCreditoMassimoProfiloCliente = Convert.ToInt32(rischio.soglieMassime.FirstOrDefault(o => o.key == profilo).value.rischioCreditoId);
            }
            //var profilo = rischio.profileId;

			// END
            //var rischioMercatoMassimoProfiloCliente = rischio.soglieMassime.FirstOrDefault(o => o.key == profilo).value.varMax;
            //var rischioCreditoMassimoProfiloCliente = Convert.ToInt32(rischio.soglieMassime.FirstOrDefault(o => o.key == profilo).value.rischioCreditoId);
            //--Adriano 20180125

            var rischioFideuram = rischio.bancaFideuram;
            var rischioAltriIstituti = rischio.altriIstituti;
            var rischioComplessivo = rischio.totale;

            var totCasa = datiSeiUnico.rischioUnit().rischio.rischioCreditoConcetrazione.totaliFideuram;
            var totTerzi = datiSeiUnico.rischioUnit().rischio.rischioCreditoConcetrazione.totaliAltriIstituti;

            var totalePatrimonioCasa = totCasa.risorseFinanziarie + totCasa.partiteViaggianti;
            var totalePatrimonioTerzi = totTerzi.risorseFinanziarie;
            var totalePatrimonioFinanziario = totCasa.risorseFinanziarie + totCasa.partiteViaggianti + totTerzi.risorseFinanziarie;

            #endregion

            #region Rischio

            var dtRischio = new DataTable();
            dtRischio.Columns.Add(new DataColumn("Patrimonio", typeof(string)));
            dtRischio.Columns.Add(new DataColumn("NumeroPatrimonio", typeof(Int32)));
            dtRischio.Columns.Add(new DataColumn("CodicePatrimonio", typeof(string)));
            dtRischio.Columns.Add(new DataColumn("ImmaginePatrimonio", typeof(string)));
            dtRischio.Columns.Add(new DataColumn("Controvalore", typeof(decimal)));
            dtRischio.Columns.Add(new DataColumn("VaR", typeof(decimal)));
            dtRischio.Columns.Add(new DataColumn("VaRString", typeof(string)));
            dtRischio.Columns.Add(new DataColumn("RischioCredito", typeof(decimal)));
            dtRischio.Columns.Add(new DataColumn("RischioCreditoString", typeof(string)));
            dtRischio.Columns.Add(new DataColumn("GradoCopertura", typeof(decimal)));
            dtRischio.Columns.Add(new DataColumn("Adeguatezza", typeof(bool)));
            dtRischio.Columns.Add(new DataColumn("AdeguatezzaString", typeof(string)));
            _presenzaNotaEccessivaAdeguatezza = rischio.eccessivamenteAdeguato;
            #region Casa
            string banca = Helper.ReplaceVariables("$/Banca/$", EnvironmentFacade.ReportEnvironment);
            dtRischio.Rows.Add(

                   string.Format("Patrimonio {0}", Helper.ReplaceVariables("$/Banca/$", EnvironmentFacade.ReportEnvironment)), //Patrimonio
                   1, //NumeroPatrimonio
                   banca == "Fideuram" ? "BF" : "SPI", //CodicePatrimonio
                   "PallinoColorato1d.png", //ImmaginePatrimonio
                   totalePatrimonioCasa, //Controvalore
                   rischioFideuram.misure.varp, //VaR
                   rischioFideuram.varDecodificato, //VaRString
                   rischioFideuram.misure.rischioCredito * 100, //RischioCredito
                   rischioFideuram.rischioCreditoDecodificato, //RischioCreditoString                  
                   Math.Round(rischioFideuram.stat.copertura, 2), //GradoCopertura
                   rischio.patFideuramAdeguato, //Adeguatezza 
                   rischio.patFideuramAdeguato ? "Adeguato" : "Non adeguato" //AdeguatezzaString
                   );
            #endregion

            if (visualizzaAltriIstituti() && totalePatrimonioTerzi > 0)
            {
                #region Terzi
                dtRischio.Rows.Add(
                      "Patrimonio altri Istituti",  //Patrimonio
                      2, //NumeroPatrimonio
                      "PT", //CodicePatrimonio
                      "PallinoColorato2d.png", //ImmaginePatrimonio
                      totalePatrimonioTerzi,  //Controvalore
                      rischioAltriIstituti.misure.varp, //VaR
                      rischioAltriIstituti.varDecodificato, //VaRString
                      rischioAltriIstituti.misure.rischioCredito * 100, //RischioCredito                  
                      rischioAltriIstituti.rischioCreditoDecodificato, //RischioCreditoString
                      Math.Round(rischioAltriIstituti.stat.copertura, 2),  //GradoCopertura
                      rischio.patAltriIstitutiAdeguato, //Adeguatezza 
                      rischio.patAltriIstitutiAdeguato ? "Adeguato" : "Non adeguato" //AdeguatezzaString
                      );
                #endregion

                #region Complessivo
                dtRischio.Rows.Add(
                       "Patrimonio finanziario complessivo",  //Patrimonio
                       3, //NumeroPatrimonio
                       "PC", //CodicePatrimonio
                       "PallinoColorato3d.png", //ImmaginePatrimonio
                       totalePatrimonioFinanziario, //Controvalore
                       rischioComplessivo.misure.varp, //VaR
                       rischioComplessivo.varDecodificato, //VaR
                       rischioComplessivo.misure.rischioCredito * 100, //RischioCredito                        
                       rischioComplessivo.rischioCreditoDecodificato, //RischioCreditoString
                       Math.Round(rischioComplessivo.stat.copertura, 2),  //GradoCopertura
                       rischio.patCompletoAdeguato, //Adeguatezza 
                       rischio.patCompletoAdeguato ? "Adeguato" : "Non adeguato" //AdeguatezzaString
                       );
                #endregion
            }

            ds.Tables.Add(dtRischio);
            #endregion

            #region Soglie Asse X

            // I valori non sono quelli reali definiti nel database ma sono riproporzionati in funzione della richiesta del cliente.
            var dtSoglieX = new DataTable();
            dtSoglieX.Columns.Add(new DataColumn("Id", typeof(int)));
            dtSoglieX.Columns.Add(new DataColumn("Valore", typeof(decimal)));
            dtSoglieX.Rows.Add(1, 8.77);
            dtSoglieX.Rows.Add(2, 17.54);
            dtSoglieX.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:
            dtSoglieX.Rows.Add(4, 35.08);

            ds.Tables.Add(dtSoglieX);

            #endregion

            #region Soglie Asse Y 

            var dtSoglieY = new DataTable();
            dtSoglieY.Columns.Add(new DataColumn("Valore", typeof(decimal)));
            dtSoglieY.Columns.Add(new DataColumn("Testo", typeof(string)));
            //Adriano:
            dtSoglieY.Rows.Add(2, "2,00");
            dtSoglieY.Rows.Add(4.5, "4,50");
            dtSoglieY.Rows.Add(9.5, "9,50");
            dtSoglieY.Rows.Add(15, "15,00");
            if (profiloProfessionaleAggressivo)
                dtSoglieY.Rows.Add(50, "50,00");
            else
                dtSoglieY.Rows.Add(27, "27,00");
            //--Adriano
            //originale
            //dtSoglieY.Rows.Add(2, "2,00");
            //dtSoglieY.Rows.Add(4.5, "4,50");
            //dtSoglieY.Rows.Add(9.5, "9,50");
            //dtSoglieY.Rows.Add(15, "15,00");
            //dtSoglieY.Rows.Add(27, "27,00");

            ds.Tables.Add(dtSoglieY);

            #endregion

            #region Cliente

            var dtCliente = new DataTable();
            dtCliente.Columns.Add(new DataColumn("RischioMercatoMassimoProfilo", typeof(decimal)));
            dtCliente.Columns.Add(new DataColumn("RischioCreditoMassimoProfilo", typeof(decimal)));
            dtCliente.Rows.Add(rischioMercatoMassimoProfiloCliente, dtSoglieX.AsEnumerable().FirstOrDefault(o => o.Field<int>("Id").Equals(rischioCreditoMassimoProfiloCliente))["Valore"]);

            ds.Tables.Add(dtCliente);

            #endregion

            return ds;
        }
        public virtual string getNotaCopertura5RMRC() //40.5 copertura rischio mercato var e rischio credito
        {
            string nota = "";
            bool gradoCoperturaRM;
            bool gradoCoperturaRC;
            try
            {
                gradoCoperturaRM = Convert.ToDouble(datiSeiUnico.rischioUnit().adeguatezza.adeguatezzaTopBean.listaAdeguatezza.AsEnumerable().FirstOrDefault(o => o.id == "RM").copertura.Replace(".", ",")) > 0 && Convert.ToDecimal(datiSeiUnico.rischioUnit().adeguatezza.adeguatezzaTopBean.listaAdeguatezza.AsEnumerable().FirstOrDefault(o => o.id == "RM").copertura.Replace(".", ",")) < 90;
                gradoCoperturaRC = Convert.ToDouble(datiSeiUnico.rischioUnit().adeguatezza.adeguatezzaTopBean.listaAdeguatezza.AsEnumerable().FirstOrDefault(o => o.id == "RC").copertura.Replace(".", ",")) > 0 && Convert.ToDecimal(datiSeiUnico.rischioUnit().adeguatezza.adeguatezzaTopBean.listaAdeguatezza.AsEnumerable().FirstOrDefault(o => o.id == "RC").copertura.Replace(".", ",")) < 90;



                string rm = gradoCoperturaRM ? "Rischio Mercato (VaR)" : "";
                string rc = gradoCoperturaRM && gradoCoperturaRC ? " e di Rischio Credito" : !gradoCoperturaRM && gradoCoperturaRC ? " Rischio Credito" : "";
                if (gradoCoperturaRM || gradoCoperturaRC)
                {
                    nota += "Il patrimonio che lei detiene presso $/Banca/$ risulta non adeguato al suo profilo finanziario in quanto alcuni prodotti non sono coperti in termini di " + rm + rc + ", determinando un grado di copertura inferiore a 90%: in questo caso, a prescindere dai singoli indicatori di rischio, il patrimonio $/Banca/$ viene considerato sempre come non adeguato.";


                }
            }
            catch { }
            return datiSeiUnico.FormatBanca(nota);
        }
        /// <summary>
        /// Recupera la nota dinamica
        /// </summary>
        /// <param name="nota"></param>
        /// <returns></returns>
        private string getNoteAde()
        {
            return Helper.ReplaceVariables("Il patrimonio che lei detiene presso $/Banca/$ risulta adeguato al suo profilo finanziario. Le segnaliamo, tuttavia, che il livello di Rischio Mercato (VaR) del patrimonio che lei detiene presso $/Banca/$ si posiziona su un valore sensibilmente inferiore rispetto alla soglia minima attribuita al suo profilo finanziario.", base.EnvironmentFacade.ReportEnvironment);
        }
        public virtual bool visualizzaAltriIstituti()
        {
            return GetOption<Opzione4>().Valore;
        }
        private string GetNote()
        {

            string nota = "";
            string token = "";

            var pianificazioneVerticale = datiSeiUnico.pianificazioneUnit().pianificazioneVerticale;

            decimal CCN_CASA = pianificazioneVerticale.contoCorrenteNegativo; //cc negativi del patrimonio casa
            decimal CCN_TERZI = datiSeiUnico.patrimonioUnit().patrimonioTerzi.patrimonioTerziBean.contoCorrentiNegativi;
            _presenzaNotaPatrimonioTerzi = CCN_TERZI != 0 && visualizzaAltriIstituti();

            decimal GPELIGOFONDI_CASA = pianificazioneVerticale.liqEligoFondiNeg; // liquidità sottostante la GP Eligo Fondi del patrimonio casa
            decimal GPELIGTITOLI_CASA = pianificazioneVerticale.liqEligoTitoliNeg; //liquidità sottostante la GP Eligo Titoli del patrimonio casa

            // 20181009 AC
            decimal TUOFOGLIO_CASA = pianificazioneVerticale.liqFogliNeg; //liquidità sottostante Il Mio Foglio del patrimonio casa
            //--20181009 AC

            // 20181009 AC
            _presenzaNotaPatrimonioCasa = CCN_CASA != 0 || GPELIGOFONDI_CASA != 0 || GPELIGTITOLI_CASA != 0 || TUOFOGLIO_CASA!=0;
            //--20181009 AC
            
            decimal GC = 100;
            decimal OC_CASA = 0;//patrimonioCasa.totaliPatrimonio.partiteViaggianti; //Operazioni in corso del patrimonio casa
            decimal CC_CASA = 0;// patrimonioCasa.totaliPatrimonio.contoCorrentePositivo; //cc positivo del patrimonio casa
            decimal CC_TERZI = 0;// patrimonioTerzi.totaliPatrimonio.contoCorrentePositivo; //cc positivo del patrimonio terzi
            decimal PNR_CASA = 0;  //Patrimonio non rappresentabile per macroassetclass del patrimonio casa
            decimal PNR_TERZI = 0;

            if (CCN_CASA != 0 || GPELIGOFONDI_CASA != 0 || GPELIGTITOLI_CASA != 0 || TUOFOGLIO_CASA!=0)
            {
                nota += token + "Il controvalore";
                token = " ";
                if (CCN_CASA != 0 || GPELIGOFONDI_CASA != 0 || GPELIGTITOLI_CASA != 0|| TUOFOGLIO_CASA!=0)
                {
                    nota += token + "del patrimonio $/Banca/$  esclude il saldo negativo";

                    if (CCN_CASA != 0)
                    {
                        nota += token + datiSeiUnico.FormatDecimal("dei conti correnti ({0} €)", CCN_CASA);
                        token = (GPELIGOFONDI_CASA != 0 || GPELIGTITOLI_CASA != 0) ? ", " : "";
                    }
                    // 20181009 AC
                    if (TUOFOGLIO_CASA != 0)
                    {
                        nota += token + datiSeiUnico.FormatDecimal("della liquidità sottostante Il Mio Foglio ({0} €)", TUOFOGLIO_CASA);
                        token = (TUOFOGLIO_CASA != 0) ? ", " : "";
                    }
                    //--20181009 AC
                    if (GPELIGOFONDI_CASA != 0)
                    {
                        nota += token + datiSeiUnico.FormatDecimal("della liquidità sottostante la GP Eligo Fondi ({0} €)", GPELIGOFONDI_CASA);
                        token = (GPELIGTITOLI_CASA != 0) ? ", " : "";
                    }
                    if (GPELIGTITOLI_CASA != 0)
                    {
                        nota += token + datiSeiUnico.FormatDecimal("della liquidità sottostante la GP Eligo Titoli ({0} €)", GPELIGTITOLI_CASA);
                    }
                    token = ". ";
                }
            }

            if (CCN_TERZI != 0 && visualizzaAltriIstituti())
            {
                nota += token + datiSeiUnico.FormatDecimal(" Il controvalore del patrimonio altri Istituti esclude il saldo negativo dei conti correnti ({0} €)", CCN_TERZI);
            }

            //if (GC < 100)
            //{
            //    nota += token + datiSeiUnico.FormatDecimal("Grado di copertura (%) della rappresentazione grafica per macro asset class pari a {0}", GC);
            //    token = ": ";
            //    if (PNR_CASA != 0 || CC_CASA != 0 || OC_CASA != 0 || PNR_TERZI != 0 || CC_TERZI != 0)
            //    {
            //        nota += token + "non sono considerati";
            //        token = " ";
            //        if (PNR_CASA != 0 || CC_CASA != 0 || OC_CASA != 0)
            //        {
            //            if (PNR_CASA != 0)
            //            {
            //                nota += token + datiSeiUnico.FormatDecimal("i prodotti non rappresentabili ({0} €)", PNR_CASA);
            //                token = ", ";
            //            }
            //            if (CC_CASA != 0)
            //            {
            //                nota += token + datiSeiUnico.FormatDecimal("i conti correnti ({0} €)", CC_CASA);
            //                token = ", ";
            //            }
            //            if (OC_CASA != 0)
            //            {
            //                nota += token + datiSeiUnico.FormatDecimal("gli importi relativi alle operazioni in corso ({0} €)", OC_CASA);
            //                token = ", ";
            //            }
            //            token = " ";
            //            nota += token + "del patrimonio $/Banca/$";
            //            token = ", ";
            //        }
            //        if ((PNR_TERZI != 0 || CC_TERZI != 0) && visualizzaAltriIstituti())
            //        {
            //            if (PNR_TERZI != 0)
            //            {
            //                nota += token + datiSeiUnico.FormatDecimal("i prodotti non rappresentabili ({0} €)", PNR_TERZI);
            //                token = ", ";
            //            }
            //            if (CC_TERZI != 0)
            //            {
            //                nota += token + datiSeiUnico.FormatDecimal("i conti correnti ({0} €)", CC_TERZI);
            //                token = ", ";
            //            }
            //            token = " ";
            //            nota += token + "del patrimonio Altri Istituti";
            //            token = ", ";
            //        }
            //    }
            //}
            nota += ".";

            //nota = !nota.Equals("") ? "(*) " + nota : nota;
            return datiSeiUnico.FormatBanca(nota);
        }

    }
}
