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

namespace Consulenza.ReportWriter.Manager.Section.Unica
{
    /// <summary>
    /// S71.MonitoraggioEvoluzionePatrimonioERischio idSezione = 114
    /// </summary>
    public class S71 : Entity.Section
    {
        private int _numeroFasiPresenti = 2;

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

        protected override sealed void Draw()
        {
            var dati = GetDataSet();
            

            var fase1Data = Convert.ToDateTime(dati.Tables[0].Select().Max(r => r["Fase1_Data"]));
            var sFase1Data = fase1Data.Equals(DateTime.MinValue) ? "-" : fase1Data.ToShortDateString();

            var fase2Data = Convert.ToDateTime(dati.Tables[0].Select().Max(r => r["Fase2_Data"]));
            var sFase2Data = fase2Data.Equals(DateTime.MinValue) ? "-" : fase2Data.ToShortDateString();

            var fase3Data = Convert.ToDateTime(dati.Tables[0].Select().Max(r => r["Fase3_Data"]));
            var sFase3Data = fase3Data.Equals(DateTime.MinValue) ? "-" : fase3Data.ToShortDateString();

            // int larghezzaColonnaImmagine = 20;
            int larghezzaColonnaSingolaFase = 130;
            int larghezzaColonnaVariabile = 520 - (larghezzaColonnaSingolaFase * _numeroFasiPresenti);


            int larghezzaColonnaImmagine2 = 25;
            int larghezzaColonnaSingolaFase2 = 108;
            int larghezzaColonnaVariabile2 = 520 - (larghezzaColonnaSingolaFase2 * _numeroFasiPresenti) - (larghezzaColonnaImmagine2 * _numeroFasiPresenti);


            #region Tabella Evoluzione del Controvalore
            if (evoluzionePatrimonio())
            {

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


                var tabellaEvoluzioneControvalore = new TablePDF(EnvironmentFacade.RendererFacade.XLeftLimit, dati.Tables["EvoluzioneControvalore"], dati.Tables["FooterEvoluzioneControvalore"])
                {
                    Style = Style.ConsulenzaUnica,
                    AlternateRow = false,
                    ShowSeparationLines = false,
                    RowsPadding = 10,
                    HeaderHeight = 30,
                    HeaderMargin = 5
                                 
                };

                tabellaEvoluzioneControvalore.Columns.Add(new ColumnPDF("Area2", larghezzaColonnaVariabile, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Objectpdf, "Area", "Area di bisogno") { DeltaYContent = -1, ScaleColumnTypeImage = 0.5F, HeaderFontSize = 7, FontSize = 7 });
                tabellaEvoluzioneControvalore.Columns.Add(new ColumnPDF("Fase1", larghezzaColonnaSingolaFase, HorizontalAlignmentType.Destra, false, false, 7, ColumnType.Decimale, "Fase1_Controvalore", string.Format("Avvio monitoraggio<BR>({0})", sFase1Data))
                {
              
                    HeaderVerticalAlignment = VerticalAlignmentType.Centrato,
                    HeaderGroupWidth = larghezzaColonnaSingolaFase,
                    HeaderGroupPathImage ="freccia71b.png",
                    HeaderGroupScaleImage = 0.30F,
                    HeaderGroupTextDeltaX = larghezzaColonnaSingolaFase,//-4,
                   // HeaderGroupTextDeltaY = 35,
                    HeaderGroupBorderLine = true,                
                    DeltaYContent = 3,
                    HeaderFontSize = 7,
                    FontSize = 7
                    
                });

                if (_numeroFasiPresenti.Equals(3))
                    tabellaEvoluzioneControvalore.Columns.Add(new ColumnPDF("Fase2", larghezzaColonnaSingolaFase, HorizontalAlignmentType.Destra, false, false, 7, ColumnType.Decimale, "Fase2_Controvalore", string.Format("Precedente invio report<BR>({0})", sFase2Data))
                    {
                      //  HeaderPaddingRight = 2,                    
                        HeaderVerticalAlignment = VerticalAlignmentType.Centrato,
                        HeaderGroupWidth = larghezzaColonnaSingolaFase,
                        HeaderGroupPathImage = "freccia71b.png",
                        HeaderGroupScaleImage = 0.30F,
                        HeaderGroupTextDeltaX = larghezzaColonnaSingolaFase,//-4,
                        // HeaderGroupTextDeltaY = 35,
                        HeaderGroupBorderLine = true,
                        DeltaYContent = 3,
                        HeaderFontSize = 7,
                        FontSize = 7
                    });

                tabellaEvoluzioneControvalore.Columns.Add(new ColumnPDF("Fase3", larghezzaColonnaSingolaFase, HorizontalAlignmentType.Destra, false, false, 7, ColumnType.Decimale, "Fase3_Controvalore", string.Format("Situazione corrente<BR>({0})", sFase3Data))
                {
                    DeltaYContent = 3,
                    HeaderFontSize = 7,
                    FontSize = 7
                });

                tabellaEvoluzioneControvalore.FooterColumns.Add(new ColumnPDF("Area", larghezzaColonnaVariabile, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Testo) { FontSize = 7 });
                tabellaEvoluzioneControvalore.FooterColumns.Add(new ColumnPDF("Fase1", larghezzaColonnaSingolaFase, HorizontalAlignmentType.Destra, false, false, 7, ColumnType.Decimale) { FontSize = 7 });
                if (_numeroFasiPresenti.Equals(3))
                    tabellaEvoluzioneControvalore.FooterColumns.Add(new ColumnPDF("Fase2", larghezzaColonnaSingolaFase, HorizontalAlignmentType.Destra, false, false, 7, ColumnType.Decimale) { FontSize = 7 });
                tabellaEvoluzioneControvalore.FooterColumns.Add(new ColumnPDF("Fase3", larghezzaColonnaSingolaFase, HorizontalAlignmentType.Destra, false, false, 7, ColumnType.Decimale) { FontSize = 7 });


                for (int a = 0; a < dati.Tables["EvoluzioneControvalore"].Rows.Count; a++)
                {
                    tabellaEvoluzioneControvalore.Cells[0, a].ValueObjectList.Add(new ImagePDF(0, 1, dati.Tables["EvoluzioneControvalore"].Rows[a].ItemArray[0].ToString())
                    {
                        DeltaX = 3,
                        DeltaY = 0,
                        Scale = 0.66f,
                        Height = 27,
                        Width = 145
                    });
                    var textArea = new FormattedTextAreaPDF(dati.Tables["EvoluzioneControvalore"].Rows[a].ItemArray[1].ToString(), 0)
                    {
                        DeltaY = 8f,
                        FontSize = 8f
                    };
                    var labelSize = Helper.GetNumericStringWidth(textArea.Text);
                    float addition = 0;
                    switch (textArea.Text)
                    {
                        case "Investimento":
                        case "Previdenza":
                            addition = 3;
                            break;
                        case "Riserva":
                            addition = 2;
                            break;
                        case "Liquidità":
                            addition = 1;
                            break;
                        case "Extra Rendimento":
                            addition = 6;
                            break;
                    }
                    textArea.DeltaX = 76 + addition - labelSize;
                    textArea.Text = Helper.FirstCharToUpper(textArea.Text);
                    tabellaEvoluzioneControvalore.Cells[0, a].ValueObjectList.Add(textArea);
                }

                AddElement(tabellaEvoluzioneControvalore);
                

        }
            #endregion
            
       

            #region Tabella Evoluzione del Rischio
            if (evoluzioneRischio())
            {
                // Testo introduttivo       
                AddElement(new SpacePDF(20));
                AddElement(new FormattedTextAreaPDF(Helper.ReplaceVariables(GetTesto2(), EnvironmentFacade.ReportEnvironment), EnvironmentFacade.RendererFacade.XLeftLimit, 520) { TextHorizontalAlign = ceTe.DynamicPDF.TextAlign.Justify, FontSize = 7 });
                AddElement(new SpacePDF(15));

                // Tabella
                var tabellaEvoluzioneRischio = new TablePDF(EnvironmentFacade.RendererFacade.XLeftLimit, dati.Tables["EvoluzioneRischio"])
                {
                    Style = Style.ConsulenzaUnica,
                    AlternateRow = true,
                    ShowSeparationLines = false,
                    RowHeight = 30,
                    HeaderHeight = 30
                };
                tabellaEvoluzioneRischio.Columns.Add(new ColumnPDF("Descrizione", larghezzaColonnaVariabile2, HorizontalAlignmentType.Sinistra, false, true, 7, ColumnType.Testo, "Descrizione", "") { HeaderFontSize = 7, FontSize = 7 });
                tabellaEvoluzioneRischio.Columns.Add(new ColumnPDF("Fase1", larghezzaColonnaSingolaFase2, HorizontalAlignmentType.Destra, false, false, 7, ColumnType.Decimale, "Fase1_sValore", string.Format("Avvio monitoraggio<BR>({0})", sFase1Data))
                {
                    HeaderVerticalAlignment = VerticalAlignmentType.Centrato,
                    HeaderGroupWidth = larghezzaColonnaSingolaFase,
                    //     HeaderGroupPathImage = "freccia71b.png",
                    //   HeaderGroupScaleImage = 0.30F,
                    HeaderGroupTextDeltaX = larghezzaColonnaSingolaFase,//-4,
                    // HeaderGroupTextDeltaY = 35,
                    HeaderGroupBorderLine = true,
                    // DeltaYContent = 35,
                    HeaderFontSize = 7,
                    FontSize = 7
                });
                tabellaEvoluzioneRischio.Columns.Add(new ColumnPDF("Fase1_Immagine", larghezzaColonnaImmagine2, HorizontalAlignmentType.Destra, false, false, 7, ColumnType.Immagine, "Fase1_Immagine", "") { DeltaYContent = 8, ScaleColumnTypeImage = 0.15F, HeaderGroupScaleImage = 0.30F, HeaderGroupPathImage = "freccia71b.png" });
                if (_numeroFasiPresenti.Equals(3))
                {
                    tabellaEvoluzioneRischio.Columns.Add(new ColumnPDF("Fase2", larghezzaColonnaSingolaFase2, HorizontalAlignmentType.Destra, false, false, 7, ColumnType.Decimale, "Fase2_sValore", string.Format("Precedente invio report<BR>({0})", sFase2Data))
                    {

                        HeaderVerticalAlignment = VerticalAlignmentType.Centrato,
                        HeaderGroupWidth = larghezzaColonnaSingolaFase,
                        //HeaderGroupPathImage = "freccia71b.png",
                        //HeaderGroupScaleImage = 0.30F,
                        HeaderGroupTextDeltaX = larghezzaColonnaSingolaFase,//-4,
                        // HeaderGroupTextDeltaY = 35,
                        HeaderGroupBorderLine = true,

                        // DeltaYContent = 35,
                        HeaderFontSize = 7,
                        FontSize = 7
                    });
                    tabellaEvoluzioneRischio.Columns.Add(new ColumnPDF("Fase2_Immagine", larghezzaColonnaImmagine2, HorizontalAlignmentType.Destra, false, false, 7, ColumnType.Immagine, "Fase2_Immagine", "") { HeaderFontSize = 7, FontSize = 7, DeltaYContent = 8, HeaderGroupScaleImage = 0.30F, ScaleColumnTypeImage = 0.15F, HeaderGroupPathImage = "freccia71b.png" });
                }
                tabellaEvoluzioneRischio.Columns.Add(new ColumnPDF("Fase3", larghezzaColonnaSingolaFase2, HorizontalAlignmentType.Destra, false, false, 7, ColumnType.Decimale, "Fase3_sValore", string.Format("Situazione corrente<BR>({0})", sFase3Data)) { HeaderFontSize = 7, FontSize = 7, HeaderPaddingRight = 5, PaddingRight = 5 });
                tabellaEvoluzioneRischio.Columns.Add(new ColumnPDF("Fase3_Immagine", larghezzaColonnaImmagine2, HorizontalAlignmentType.Destra, false, false, 7, ColumnType.Immagine, "Fase3_Immagine", "") { HeaderFontSize = 7, FontSize = 7, DeltaYContent = 8, ScaleColumnTypeImage = 0.15F });

                AddElement(tabellaEvoluzioneRischio);
            }
            #endregion
        }

        
        protected sealed override DataTable GetDataTable()
        {
            return null;
        }
 
       
        protected sealed override DataSet GetDataSet()
        {
            //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
            var ds = new DataSet();
            ds.Tables.Add("EvoluzioneControvalore");
            ds.Tables.Add("FooterEvoluzioneControvalore");
            ds.Tables.Add("EvoluzioneRischio");

            ds.Tables["EvoluzioneControvalore"].Columns.Add(new DataColumn("Area", typeof(string)));
            ds.Tables["EvoluzioneControvalore"].Columns.Add(new DataColumn("Description", typeof(string)));
            ds.Tables["EvoluzioneControvalore"].Columns.Add(new DataColumn("Fase1_Controvalore", typeof(decimal)));
            ds.Tables["EvoluzioneControvalore"].Columns.Add(new DataColumn("Fase1_Data", typeof(DateTime)));
            ds.Tables["EvoluzioneControvalore"].Columns.Add(new DataColumn("Fase2_Controvalore", typeof(decimal)));
            ds.Tables["EvoluzioneControvalore"].Columns.Add(new DataColumn("Fase2_Data", typeof(DateTime)));
            ds.Tables["EvoluzioneControvalore"].Columns.Add(new DataColumn("Fase3_Controvalore", typeof(decimal)));
            ds.Tables["EvoluzioneControvalore"].Columns.Add(new DataColumn("Fase3_Data", typeof(DateTime)));
            ds.Tables["EvoluzioneControvalore"].Columns.Add(new DataColumn("ReplaceIfZero", typeof(string)));

           
            ds.Tables["EvoluzioneRischio"].Columns.Add(new DataColumn("Descrizione", typeof(string)));
            ds.Tables["EvoluzioneRischio"].Columns.Add(new DataColumn("Fase1_Valore", typeof(decimal)));
            ds.Tables["EvoluzioneRischio"].Columns.Add(new DataColumn("Fase1_sValore", typeof(string)));
            ds.Tables["EvoluzioneRischio"].Columns.Add(new DataColumn("Fase1_Data", typeof(DateTime)));
            ds.Tables["EvoluzioneRischio"].Columns.Add(new DataColumn("Fase1_Immagine", typeof(string)));
            ds.Tables["EvoluzioneRischio"].Columns.Add(new DataColumn("Fase2_Valore", typeof(decimal)));
            ds.Tables["EvoluzioneRischio"].Columns.Add(new DataColumn("Fase2_sValore", typeof(string)));
            ds.Tables["EvoluzioneRischio"].Columns.Add(new DataColumn("Fase2_Data", typeof(DateTime)));
            ds.Tables["EvoluzioneRischio"].Columns.Add(new DataColumn("Fase2_Immagine", typeof(string)));
            ds.Tables["EvoluzioneRischio"].Columns.Add(new DataColumn("Fase3_Valore", typeof(decimal)));
            ds.Tables["EvoluzioneRischio"].Columns.Add(new DataColumn("Fase3_sValore", typeof(string)));
            ds.Tables["EvoluzioneRischio"].Columns.Add(new DataColumn("Fase3_Data", typeof(DateTime)));
            ds.Tables["EvoluzioneRischio"].Columns.Add(new DataColumn("Fase3_Immagine", typeof(string)));
            ds.Tables["EvoluzioneRischio"].Columns.Add(new DataColumn("ReplaceIfZero", typeof(string)));

            areaMon areaRiferimento;
            fase fase1;
            fase fase2;
            fase fase3;

            var piramideModello =  datiSeiUnico.piramideModelloUnit()
                                    .piramideModello.areaModello.ToList()
                                        .OrderBy(o => o.ordinamento).ToList().FindAll(o => o.visible);
            decimal fase2NA = 0;
            var areeMonotorate = datiSeiUnico.monitoraggioUnit().monitoraggio.ToList();
            #region Tabella evoluzione controvalore            
           
                foreach (var item in piramideModello)
                {
                    areaRiferimento = areeMonotorate.FirstOrDefault(o => o.area.Equals(item.area));
                    if (areaRiferimento != null)
                    {
                        fase1 = areaRiferimento.fasi.FirstOrDefault(o => o.fase1.Equals(1));
                        fase2 = areaRiferimento.fasi.FirstOrDefault(o => o.fase1.Equals(2));
                        fase3 = areaRiferimento.fasi.FirstOrDefault(o => o.fase1.Equals(3));
                        _numeroFasiPresenti = _numeroFasiPresenti != areaRiferimento.fasi.Count() && _numeroFasiPresenti < areaRiferimento.fasi.Count() 
                            ? areaRiferimento.fasi.Count() : _numeroFasiPresenti;
                        if (areaRiferimento.fasi.Count().Equals(3) && fase2 != null && fase2NA == 0)
                            fase2NA += fase2.risorseNA + fase2.risorseAllocate;
                    }
                    else
                    {
                        fase1 = null;
                        fase2 = null;
                        fase3 = null;
                    }
                     

                        var row = ds.Tables["EvoluzioneControvalore"].NewRow();
                        row["Area"] = string.Format("{0}.png", new AreaBisogno(item.area).NomePerImmagine);
                        row["Description"] = item.descrizioneArea;
                        row["Fase1_Controvalore"] = fase1 != null ? fase1.ctv : 0;
                        row["Fase1_Data"] = fase1 != null ? fase1.dtFase : DateTime.MinValue;

                        row["Fase2_Controvalore"] = fase2 != null ? fase2.ctv : 0;
                        row["Fase2_Data"] = fase2 != null ? fase2.dtFase : DateTime.MinValue;

                        row["Fase3_Controvalore"] = fase3 != null ? fase3.ctv : 0;
                        row["Fase3_Data"] = fase3 != null ? fase3.dtFase : DateTime.MinValue;

                        row["ReplaceIfZero"] = "0,00";
                        ds.Tables["EvoluzioneControvalore"].Rows.Add(row);
                     
                }

                if (!sintesiMovimento())
                    _numeroFasiPresenti--;
           

                #region Footer della tabella Aree


                    ds.Tables["FooterEvoluzioneControvalore"].Columns.Add(new DataColumn("DescrizioneProgetto", typeof(string)));
                    ds.Tables["FooterEvoluzioneControvalore"].Columns.Add(new DataColumn("VaR", typeof(decimal)));
                    if (_numeroFasiPresenti.Equals(3))
                        ds.Tables["FooterEvoluzioneControvalore"].Columns.Add(new DataColumn("ControvaloreAttuale", typeof(decimal)));
                    ds.Tables["FooterEvoluzioneControvalore"].Columns.Add(new DataColumn("AllocazioneAttuale", typeof(decimal)));
                    ds.Tables["FooterEvoluzioneControvalore"].Columns.Add(new DataColumn("ReplaceIfZero", typeof(string)));
                    ds.Tables["FooterEvoluzioneControvalore"].Columns.Add(new DataColumn("FontBold", typeof(bool)));
                    ds.Tables["FooterEvoluzioneControvalore"].Columns.Add(new DataColumn("BackgroundGray", typeof(bool)));

                    areaRiferimento = areeMonotorate.FirstOrDefault(o => o.area.Equals("Liq"));
                    if (areaRiferimento != null) {
                            fase1 = areaRiferimento.fasi.FirstOrDefault(o => o.fase1.Equals(1));
                            fase2 = areaRiferimento.fasi.FirstOrDefault(o => o.fase1.Equals(2));
                            fase3 = areaRiferimento.fasi.FirstOrDefault(o => o.fase1.Equals(3));
                    } else {
                        fase1 = null;
                        fase2 = null;
                        fase3 = null;
                    }
                    DataRow dr = ds.Tables["FooterEvoluzioneControvalore"].NewRow();
                    bool risorseNA = fase2 != null ? 
                        fase2.risorseNA == 0 && fase1.risorseNA == 0 && fase3.risorseNA == 0 : 
                        fase1.risorseNA == 0 && fase3.risorseNA == 0;
                    
                    // Fase2 rimane valorizzata per l'ultima area presa; dato che no nsempre presente, ricontrollo ne esista una.
                    if (_numeroFasiPresenti.Equals(3) && fase2 == null){
                        foreach (var item in piramideModello)
                        {
                            areaRiferimento = areeMonotorate.FirstOrDefault(o => o.area.Equals(item.area));
                            if (areaRiferimento != null)
                                if (areaRiferimento.fasi.FirstOrDefault(o => o.fase1.Equals(2)) != null)
                                {
                                    fase2 = areaRiferimento.fasi.FirstOrDefault(o => o.fase1.Equals(2));
                                    break;
                                }
                        }
                    }

                    if (risorseNA)
                    {
                        //bisogna inserire le non allocate: qualora sianopresenti il footer totale allocate diventerà 1 tot risorse allocate, 2 risorse non allocate, 3 totale risorse finanziarie"
                        //altrimenti resta così com'è: totale risorse allocate.
                        if (fase1.investimentiInCorso != 0 || (_numeroFasiPresenti.Equals(3) && fase2 != null && fase2.investimentiInCorso != 0) || fase3.investimentiInCorso != 0 ||
                            fase1.contoCorrente != 0 || (_numeroFasiPresenti.Equals(3) && fase2 != null && fase2.contoCorrente != 0) || fase3.contoCorrente != 0 ||
                            fase1.lineaself != 0 || (_numeroFasiPresenti.Equals(3) && fase2 != null && fase2.lineaself != 0) || fase3.lineaself != 0)
                        {


                            
                            dr["DescrizioneProgetto"] = datiSeiUnico.FormatBanca("Totale risorse allocate");
                            dr["VaR"] = Convert.ToDecimal(fase1.risorseAllocate);
                            if (_numeroFasiPresenti.Equals(3))
                                dr["ControvaloreAttuale"] = fase2.risorseAllocate;
                            dr["AllocazioneAttuale"] = fase3.risorseAllocate;
                            dr["ReplaceIfZero"] = "-";
                            dr["FontBold"] = true;
                            dr["BackgroundGray"] = true;
                            ds.Tables["FooterEvoluzioneControvalore"].Rows.Add(dr);
                        }
                    }
                    else
                    {
                        dr["DescrizioneProgetto"] = datiSeiUnico.FormatBanca("Totale risorse allocate");
                            dr["VaR"] = Convert.ToDecimal(fase1.risorseAllocate);
                            if (_numeroFasiPresenti.Equals(3))
                                dr["ControvaloreAttuale"] = fase2.risorseAllocate;
                            dr["AllocazioneAttuale"] = fase3.risorseAllocate;
                            dr["ReplaceIfZero"] = "-";
                            dr["FontBold"] = true;
                            dr["BackgroundGray"] = true;
                            ds.Tables["FooterEvoluzioneControvalore"].Rows.Add(dr);

                        dr = ds.Tables["FooterEvoluzioneControvalore"].NewRow();
                                dr["DescrizioneProgetto"] = "Risorse non allocate";
                                dr["VaR"] = fase1.risorseNA;
                                if (_numeroFasiPresenti.Equals(3))
                                    dr["ControvaloreAttuale"] = fase2.risorseNA;
                                dr["AllocazioneAttuale"] = fase3.risorseNA;
                                dr["ReplaceIfZero"] = "-";
                                dr["FontBold"] = false;
                                dr["BackgroundGray"] = false;
                                ds.Tables["FooterEvoluzioneControvalore"].Rows.Add(dr);

                        if (fase1.investimentiInCorso != 0 || (_numeroFasiPresenti.Equals(3) && fase2.investimentiInCorso != 0) || fase3.investimentiInCorso != 0 ||
                                       fase1.contoCorrente != 0 || (_numeroFasiPresenti.Equals(3) && fase2.contoCorrente != 0) || fase3.contoCorrente != 0 ||
                                       fase1.lineaself != 0 || (_numeroFasiPresenti.Equals(3) && fase2.lineaself != 0) || fase3.lineaself != 0)
                        {
                                        dr = ds.Tables["FooterEvoluzioneControvalore"].NewRow();
                                        dr["DescrizioneProgetto"] = datiSeiUnico.FormatBanca("Totale risorse finanziarie");
                                        dr["VaR"] = Convert.ToDecimal(fase1.risorseAllocate+ fase1.risorseNA);
                                        if (_numeroFasiPresenti.Equals(3))
                                            dr["ControvaloreAttuale"] = fase2.risorseAllocate + fase2.risorseNA;
                                        dr["AllocazioneAttuale"] = fase3.risorseAllocate; //per fase 3 le risorseNA non esistono perchè non contemplate nel nuovo sei
                                        dr["ReplaceIfZero"] = "-";
                                        dr["FontBold"] = true;
                                        dr["BackgroundGray"] = true;
                                        ds.Tables["FooterEvoluzioneControvalore"].Rows.Add(dr);
                            }
                        }
                        if (fase1.investimentiInCorso != 0 || (_numeroFasiPresenti.Equals(3) && fase2 != null && fase2.investimentiInCorso != 0) || fase3.investimentiInCorso != 0)
                            {
                                dr = ds.Tables["FooterEvoluzioneControvalore"].NewRow();
                                dr["DescrizioneProgetto"] = "Operazioni in corso";
                                dr["VaR"] = fase1.investimentiInCorso;
                                if (_numeroFasiPresenti.Equals(3))
                                    dr["ControvaloreAttuale"] = fase2.investimentiInCorso;
                                dr["AllocazioneAttuale"] = fase3.investimentiInCorso;
                                dr["ReplaceIfZero"] = "-";
                                dr["FontBold"] = false;
                                dr["BackgroundGray"] = false;
                                ds.Tables["FooterEvoluzioneControvalore"].Rows.Add(dr);
                            }

                        if (fase1.contoCorrente != 0 || (_numeroFasiPresenti.Equals(3) && fase2 != null && fase2.contoCorrente != 0) || fase3.contoCorrente != 0)
                            {
                                dr = ds.Tables["FooterEvoluzioneControvalore"].NewRow();
                                dr["DescrizioneProgetto"] = "Conto corrente";
                                dr["VaR"] = fase1.contoCorrente;
                                if (_numeroFasiPresenti.Equals(3))
                                    dr["ControvaloreAttuale"] = fase2.contoCorrente;
                                dr["AllocazioneAttuale"] = fase3.contoCorrente;
                                dr["ReplaceIfZero"] = "-";
                                dr["FontBold"] = false;
                                dr["BackgroundGray"] = false;
                                ds.Tables["FooterEvoluzioneControvalore"].Rows.Add(dr);
                            }
                        if (fase1.lineaself != 0 || (_numeroFasiPresenti.Equals(3) && fase2 != null && fase2.lineaself != 0) || fase3.lineaself != 0)
                            {
                                dr = ds.Tables["FooterEvoluzioneControvalore"].NewRow();
                                dr["DescrizioneProgetto"] = " Liquidità negativa GP Eligo";
                                dr["VaR"] = fase1.lineaself;
                                if (_numeroFasiPresenti.Equals(3))
                                    dr["ControvaloreAttuale"] = fase2.lineaself;
                                dr["AllocazioneAttuale"] = fase3.lineaself;
                                dr["ReplaceIfZero"] = "-";
                                dr["FontBold"] = false;
                                dr["BackgroundGray"] = false;
                                ds.Tables["FooterEvoluzioneControvalore"].Rows.Add(dr);
                            }


                    var totfase1=fase1.risorseNA+fase1.lineaself+fase1.contoCorrente+fase1.investimentiInCorso+fase1.risorseAllocate;
                    var totfase2 = fase2 != null ? fase2.risorseNA + fase2.lineaself + fase2.contoCorrente + fase2.investimentiInCorso + fase2.risorseAllocate : fase2NA;
                    var totfase3 = fase3.risorseNA + fase3.lineaself + fase3.contoCorrente + fase3.investimentiInCorso + fase3.risorseAllocate;
                    
                    // Patrimonio Casa
                    var rowFooter = ds.Tables["FooterEvoluzioneControvalore"].NewRow();
                    rowFooter["DescrizioneProgetto"] = string.Format("Patrimonio {0}", Helper.ReplaceVariables("$/Banca/$", EnvironmentFacade.ReportEnvironment));
                    rowFooter["VaR"] = totfase1;
                    if (_numeroFasiPresenti.Equals(3))
                        rowFooter["ControvaloreAttuale"] = totfase2;
                    rowFooter["AllocazioneAttuale"] = totfase3;
                    rowFooter["ReplaceIfZero"] = "-";
                    rowFooter["FontBold"] = true;
                    rowFooter["BackgroundGray"] = true;
                    ds.Tables["FooterEvoluzioneControvalore"].Rows.Add(rowFooter);
                 
            #endregion

             
            #endregion


            #region Tabella evoluzione rischio
                    areaRiferimento = areeMonotorate.FirstOrDefault();
                    foreach (var areaMon in areeMonotorate)
                    { 
                        fase2 = areaMon.fasi.FirstOrDefault(o => o.fase1.Equals(2));
                        if (fase2 != null)
                        {
                            areaRiferimento = areaMon;
                            break;
                        }
                    }
                    if (areaRiferimento != null)
                    {
                        fase1 = areaRiferimento.fasi.FirstOrDefault(o => o.fase1.Equals(1));
                        fase2 = areaRiferimento.fasi.FirstOrDefault(o => o.fase1.Equals(2));
                        fase3 = areaRiferimento.fasi.FirstOrDefault(o => o.fase1.Equals(3));
                    }
                    else
                    {
                        fase1 = null;
                        fase2 = null;
                        fase3 = null;
                    }

            #region VaR massimo profilo finanziario (%)

            //Adriano: per i clienti professionali il varMaxProfilo è 50, ma solo per le fasi successive alla sottoscrizione di un contratto professionale
            // verificare che il valore sia fornito dal WS
        
            DateTime dtSottoscrizione = datiSeiUnico.clienteUnit().anagrafica.dtSottoscrizione;
            decimal varMaxProfilo = 50;
            string varMaxProfiloString = Helper.FormatDecimal(varMaxProfilo.ToString(), 2);

            bool fase1Successiva = fase1.dtFase.CompareTo(dtSottoscrizione) > 0;
            bool fase2Successiva = fase2 != null ? fase2.dtFase.CompareTo(dtSottoscrizione) > 0 : false;
            bool fase3Successiva = fase3.dtFase.CompareTo(dtSottoscrizione) > 0;

            if (profiloProfessionaleAggressivo)
                ds.Tables["EvoluzioneRischio"].Rows.Add(
                     "VaR massimo profilo finanziario (%)",

                     fase1 != null ? fase1Successiva ? varMaxProfilo : fase1.varMaxProfilo : 0,
                     fase1 != null ? fase1Successiva ? varMaxProfiloString : Helper.FormatDecimal(fase1.varMaxProfilo.ToString(), 2) : "-",
                     fase1 != null ? fase1.dtFase : DateTime.MinValue,
                     string.Empty,

                     fase2 != null ? fase2Successiva ? varMaxProfilo : fase2.varMaxProfilo : 0,
                     fase2 != null ? fase2Successiva ? varMaxProfiloString : Helper.FormatDecimal(fase2.varMaxProfilo.ToString(), 2) : "-",
                     fase2 != null ? fase2.dtFase : DateTime.MinValue,
                     string.Empty,

                     fase3 != null ? fase3Successiva ? varMaxProfilo : fase3.varMaxProfilo : 0,
                     fase3 != null ? fase3Successiva ? varMaxProfiloString : Helper.FormatDecimal(fase3.varMaxProfilo.ToString(), 2) : "-",
                     fase3 != null ? fase3.dtFase : DateTime.MinValue,
                     string.Empty
                     );
            else
                ds.Tables["EvoluzioneRischio"].Rows.Add(
                       "VaR massimo profilo finanziario (%)",

                       fase1 != null ? fase1.varMaxProfilo : 0,
                       fase1 != null ? Helper.FormatDecimal(fase1.varMaxProfilo.ToString(), 2) : "-",
                       fase1 != null ? fase1.dtFase : DateTime.MinValue,
                       string.Empty,

                       fase2 != null ? fase2.varMaxProfilo : 0,
                       fase2 != null ? Helper.FormatDecimal(fase2.varMaxProfilo.ToString(), 2) : "-",
                       fase2 != null ? fase2.dtFase : DateTime.MinValue,
                       string.Empty,

                       fase3 != null ? fase3.varMaxProfilo : 0,
                       fase3 != null ? Helper.FormatDecimal(fase3.varMaxProfilo.ToString(), 2) : "-",
                       fase3 != null ? fase3.dtFase : DateTime.MinValue,
                       string.Empty
                       );

            //--Adriano
            // originale:
            //ds.Tables["EvoluzioneRischio"].Rows.Add(
            //       "VaR massimo profilo finanziario (%)",

            //       fase1 != null ? fase1.varMaxProfilo : 0,
            //       fase1 != null ? Helper.FormatDecimal(fase1.varMaxProfilo.ToString(), 2) : "-",
            //       fase1 != null ? fase1.dtFase : DateTime.MinValue,
            //       string.Empty,

            //       fase2 != null ? fase2.varMaxProfilo : 0,
            //       fase2 != null ? Helper.FormatDecimal(fase2.varMaxProfilo.ToString(), 2) : "-",
            //       fase2 != null ? fase2.dtFase : DateTime.MinValue,
            //       string.Empty,

            //       fase3 != null ? fase3.varMaxProfilo : 0,
            //       fase3 != null ? Helper.FormatDecimal(fase3.varMaxProfilo.ToString(), 2) : "-",
            //       fase3 != null ? fase3.dtFase : DateTime.MinValue,
            //       string.Empty
            //       );

            #endregion

                #region Rischio Mercato (VaR %)

                ds.Tables["EvoluzioneRischio"].Rows.Add(
                      "Rischio Mercato<br>(VaR %)",

                      fase1 != null ? fase1.varComplessivo : 0,
                      fase1 != null ? Helper.FormatDecimal(fase1.varComplessivo.ToString(), 2) : "-",
                      fase1 != null ? fase1.dtFase : DateTime.MinValue,
                      fase1 != null ? fase1.varComplessivo <= fase1.varMaxProfilo ? "FlagOK.png" : "FlagNO.png" : string.Empty,

                      fase2 != null ? fase2.varComplessivo : 0,
                      fase2 != null ? Helper.FormatDecimal(fase2.varComplessivo.ToString(), 2) : "-",
                      fase2 != null ? fase2.dtFase : DateTime.MinValue,
                      fase2 != null ? fase2.varComplessivo <= fase2.varMaxProfilo ? "FlagOK.png" : "FlagNO.png" : string.Empty,

                      fase3 != null ? fase3.varComplessivo : 0,
                      fase3 != null ? Helper.FormatDecimal(fase3.varComplessivo.ToString(), 2) : "-",
                      fase3 != null ? fase3.dtFase : DateTime.MinValue,
                      fase3 != null ? fase3.varComplessivo <= fase3.varMaxProfilo ? "FlagOK.png" : "FlagNO.png" : string.Empty
                      );

                #endregion

                #region Rischio Credito massimo

                ds.Tables["EvoluzioneRischio"].Rows.Add(
                    "Rischio Credito massimo",

                    fase1 != null ? fase1.classeRischioMax : 0,
                    fase1 != null ? fase1.classeRischioMaxDec.Contains("CLASSE") ? Helper.CapitalizeWords(fase1.classeRischioMaxDec) : fase1.classeRischioMaxDec : "-",
                    fase1 != null ? fase1.dtFase : DateTime.MinValue,
                    string.Empty,

                    fase2 != null ? fase2.classeRischioMax : 0,
                    fase2 != null ? fase2.classeRischioMaxDec.Contains("CLASSE") ? Helper.CapitalizeWords(fase2.classeRischioMaxDec) : fase2.classeRischioMaxDec : "-",
                    fase2 != null ? fase2.dtFase : DateTime.MinValue,
                    string.Empty,

                    fase3 != null ? fase3.classeRischioMax : 0,
                    fase3 != null ? fase3.classeRischioMaxDec.Contains("CLASSE") ? Helper.CapitalizeWords(fase3.classeRischioMaxDec) : fase3.classeRischioMaxDec : "-",
                    fase3 != null ? fase3.dtFase : DateTime.MinValue,
                    string.Empty
                   );

                #endregion

                #region Rischio Credito
                string value1 = fase1 != null ? fase1.classeRischioDec != null ? fase1.classeRischioDec.Contains("CLASSE") ? Helper.CapitalizeWords(fase1.classeRischioDec) : fase1.classeRischioDec : "n.a." : "n.a.";
                string value2 = fase2 != null ? fase2.classeRischioDec != null ? fase2.classeRischioDec.Contains("CLASSE") ? Helper.CapitalizeWords(fase2.classeRischioDec) : fase2.classeRischioDec : "n.a." : "n.a.";
                string value3 = fase3 != null ? fase3.classeRischioDec != null ? fase3.classeRischioDec.Contains("CLASSE") ? Helper.CapitalizeWords(fase3.classeRischioDec) : fase3.classeRischioDec : "n.a." : "n.a.";
                ds.Tables["EvoluzioneRischio"].Rows.Add(
                       "Rischio Credito",

                       fase1 != null ? Convert.ToInt32(fase1.classeRischio) : 0,
                       value1,
                       fase1 != null ? fase1.dtFase : DateTime.MinValue,
                       fase1 != null ? value1.Equals("n.a.") ? string.Empty : Convert.ToInt32(fase1.classeRischio) <= fase1.classeRischioMax ? "FlagOK.png" : "FlagNO.png" : string.Empty,

                       fase2 != null ? Convert.ToInt32(fase2.classeRischio) : 0,
                       value2,
                       fase2 != null ? fase2.dtFase : DateTime.MinValue,
                       fase2 != null ? value2.Equals("n.a.") ? string.Empty : Convert.ToInt32(fase2.classeRischio) <= fase2.classeRischioMax ? "FlagOK.png" : "FlagNO.png" : string.Empty,

                       fase3 != null ? Convert.ToInt32(fase3.classeRischio) : 0,
                       value3,
                       fase3 != null ? fase3.dtFase : DateTime.MinValue,
                       fase3 != null ? value3.Equals("n.a.") ? string.Empty : Convert.ToInt32(fase3.classeRischio) <= fase3.classeRischioMax ? "FlagOK.png" : "FlagNO.png" : string.Empty

                       );

                #endregion

             

            #endregion


            return ds;
        }

        public virtual bool evoluzionePatrimonio() { return GetOption<Opzione4_1>().Valore; }
        public virtual bool sintesiMovimento() { return true; } // tanto deve essere sempre vibile, ne caso gestire la Opzione X_2 che arriva dai vincoli
        public virtual bool evoluzioneRischio() { return GetOption<Opzione4_3>().Valore; }


        public virtual string GetTesto1() {
            return datiSeiUnico.FormatBanca("Nella tabella sottostante è riportata l'evoluzione, in termini di controvalore, del patrimonio che lei detiene presso $/Banca/$ dall'avvio del monitoraggio alla situazione attuale.");
        }
        public virtual string GetTesto2()
        {
            return datiSeiUnico.FormatBanca("Nella tabella sottostante è riportata l'evoluzione, in termini di Rischio Mercato (VaR) e di Rischio Credito, del patrimonio che lei detiene presso $/Banca/$, dall'avvio del monitoraggio alla situazione attuale.");
        }

        public bool isAltro(List<KeyValuePair<string, string>> l1, List<KeyValuePair<string, string>> l2, List<KeyValuePair<string, string>> l3, string type) {
            if (decimal.Parse(l1.FirstOrDefault(x => x.Key.Equals(type)).Value) != 0 ||
                decimal.Parse(l3.FirstOrDefault(x => x.Key.Equals(type)).Value) != 0)
                if (l2 == null)
                    return true;
                else
                    if (decimal.Parse(l2.FirstOrDefault(x => x.Key.Equals(type)).Value) != 0)
                        return true;

            return false;
        }

        public List<KeyValuePair<string, string>> getListaProdotti(fase fase)
        { 
            var listaProdotti = new List<KeyValuePair<string, string>>();
                    {
                        // listaProdotti.Add(new KeyValuePair<string, string>("c/c negativo", pianificazione.altro.ToString()));

                            listaProdotti.Add(new KeyValuePair<string, string>("Operazioni in corso", fase.investimentiInCorso.ToString()));

                            listaProdotti.Add(new KeyValuePair<string, string>("Conto corrente", fase.contoCorrente.ToString()));

                            listaProdotti.Add(new KeyValuePair<string, string>("Liquidità negativa GP Eligo", fase.lineaself.ToString()));
                    }

                    return listaProdotti;//.FindAll(o => o.Value != "0");
        }
    }
}
