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

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

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

           

            #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(15));
            }
            #endregion

            #region Tabella
            var tabella = new TablePDF(EnvironmentFacade.RendererFacade.XLeftLimit, dati.Tables["monitoraggio"])
                {
                    Style = Style.ConsulenzaUnica,
                    Header = true,
                    Footer = true,
                    RowHeight=24,
                    AlternateRow = false,
                    HeaderHeight = 30,
                    HeaderMargin = 2
                };


            #region Columns
            int immagine = 10;
            int larghezzaColonnaAreaBisogno = 155;
            int dataAvvio = 55;
            int larghezzaRendimentoAvvio = 55;
            int vaR = 55;
            int controvaloreAttuale = 80;
            int allocazioneAttuale = 55;
            int larghezzaAllocazioneModello = 55;
            
            if (!RendimentoDaAvvio())
                larghezzaColonnaAreaBisogno += larghezzaRendimentoAvvio;
            if (!AllocazioneModello())
                larghezzaColonnaAreaBisogno += larghezzaAllocazioneModello;

            tabella.Columns.Add(new ColumnPDF("Immagine", immagine, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Objectpdf, string.Empty, string.Empty) { DeltaYContent = 7, PaddingLeft = 2, HeaderFontSize = 7 });
            tabella.Columns.Add(new ColumnPDF("DescrizioneAreaBisogno", larghezzaColonnaAreaBisogno, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Testo, "DescrizioneAreaBisogno", "Area di bisogno") {PaddingLeft=5, HeaderFontSize = 7 });
            tabella.Columns.Add(new ColumnPDF("DataAvvio", dataAvvio, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Testo, "sDataAvvio", "Data<br>avvio") { HeaderFontSize = 7, PaddingRight = 4 });
            if (RendimentoDaAvvio())
                tabella.Columns.Add(new ColumnPDF("RendimentoAvvio", larghezzaRendimentoAvvio, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Decimale, "RendimentoAvvio", "Rend. da<br>avvio (%)") { HeaderFontSize = 7, PaddingRight = 4 });
            tabella.Columns.Add(new ColumnPDF("VaR", vaR, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Testo, "VaR", "VaR (%)") { HeaderFontSize = 7, PaddingRight = 4 });
            tabella.Columns.Add(new ColumnPDF("ControvaloreAttuale", controvaloreAttuale, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Decimale, "ControvaloreAttuale", "Controvalore<br>attuale (€)") { HeaderFontSize = 7, PaddingRight = 4 });
            tabella.Columns.Add(new ColumnPDF("AllocazioneAttuale", allocazioneAttuale, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Decimale, "AllocazioneAttuale", "Allocazione<br>attuale (%)") { HeaderFontSize = 7, PaddingRight = 4 });
            if (AllocazioneModello())
                tabella.Columns.Add(new ColumnPDF("AllocazioneModello", larghezzaAllocazioneModello, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Decimale, "AllocazioneModello", "Allocazione<br>modello (%)") { HeaderFontSize = 7, PaddingRight = 4 });
            
            #endregion
            
            
            #region Cells


            for (int r = 0; r < dati.Tables["monitoraggio"].Rows.Count; r++)
            {
                DataRow rw = dati.Tables["monitoraggio"].Rows[r];
                int iImmagine = 0;
                string testo = new AreaBisogno(rw["CodiceAreaBisogno"].ToString()).Abbreviazione;
                float deltaXSwitch;
                switch (testo.ToUpper()){
                    case "E":
                        deltaXSwitch = 1.5F;
                        break;
                    case "I":
                        deltaXSwitch = 2;
                        break;
                    case "P":
                        deltaXSwitch = 1.5F;
                        break;
                    case "R":
                        deltaXSwitch = 1;
                        break;
                    case "L":
                        deltaXSwitch = 1.5F;
                        break;
                    default:
                        deltaXSwitch = 2;
                        break;
                }
                if (rw["DescrizioneProgetto"].Equals("Default"))  {   
                    var listaOggetti = new List<ObjectPDF>() {
                                    new RectanglePDF(7.5F, 8, ColorPDF.GetBy_AreaBisogno(rw["CodiceAreaBisogno"].ToString())){DeltaY = 0.75F},  
                                    new FormattedTextAreaPDF
                                    {
                                        Text = testo,
                                        FontBold = true,
                                        FontColor = ColorPDF.Bianco,
                                        FontSize=7,
                                        DeltaX = deltaXSwitch
                                    }                            
                                };
                    tabella.Cells[iImmagine, r].ValueObjectList.AddRange(listaOggetti);
                }
                else  
                {
                    tabella.Cells[iImmagine, r].ColSpan = 2;
                    var deltay = rw["DescrizioneProgetto"].ToString().Length > 30 ? -2 : 0;
                    tabella.Cells[iImmagine, r].ValueObject = new FormattedTextAreaPDF() { Text = rw["DescrizioneProgetto"].ToString(), FontSize = 7, Width = larghezzaColonnaAreaBisogno, DeltaY = deltay, FontBold = Convert.ToBoolean(rw["FontBold"]) };                    
                }

               
                for (int c = 0; c < tabella.Columns.Count; c++)  {
                    if (Convert.ToBoolean(rw["BackgroundGray"]))  
                        tabella.Cells[c, r].BackgroundColor = ColorPDF.Standard_Grigio_SfondoColonnaTabella;
                    if(tabella.Columns[c].Name.Equals("RendimentoAvvio"))
                        tabella.Cells[c, r].HorizontalAlignment = HorizontalAlignmentType.Destra;
                    if (tabella.Columns[c].Name.Equals("VaR"))
                        tabella.Cells[c, r].HorizontalAlignment = HorizontalAlignmentType.Destra;
                    if (tabella.Columns[c].Name.Equals("ControvaloreAttuale"))
                        tabella.Cells[c, r].HorizontalAlignment = HorizontalAlignmentType.Destra;
                    if (tabella.Columns[c].Name.Equals("AllocazioneAttuale"))
                        tabella.Cells[c, r].HorizontalAlignment = HorizontalAlignmentType.Destra;
                    if (tabella.Columns[c].Name.Equals("AllocazioneModello"))
                        tabella.Cells[c, r].HorizontalAlignment = HorizontalAlignmentType.Destra;        
                                
                }
                 

            }

            #endregion

            AddElement(tabella);
            #endregion
        }

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

       
        protected override DataSet GetDataSet()
        {
            var ds = new DataSet();
            ds.Tables.Add("monitoraggio");

            ds.Tables["monitoraggio"].Columns.Add(new DataColumn("CodiceAreaBisogno", typeof(string)));
            ds.Tables["monitoraggio"].Columns.Add(new DataColumn("DescrizioneAreaBisogno", typeof(string)));
            ds.Tables["monitoraggio"].Columns.Add(new DataColumn("OrdinamentoAreaBisogno", typeof(string)));
            ds.Tables["monitoraggio"].Columns.Add(new DataColumn("DescrizioneProgetto", typeof(string)));
            ds.Tables["monitoraggio"].Columns.Add(new DataColumn("ChiaveProgetto", typeof(string)));
            ds.Tables["monitoraggio"].Columns.Add(new DataColumn("sDataAvvio", typeof(string)));
            ds.Tables["monitoraggio"].Columns.Add(new DataColumn("RendimentoAvvio", typeof(string)));
            ds.Tables["monitoraggio"].Columns.Add(new DataColumn("VaR", typeof(string)));
            ds.Tables["monitoraggio"].Columns.Add(new DataColumn("ControvaloreAttuale", typeof(string)));
            ds.Tables["monitoraggio"].Columns.Add(new DataColumn("AllocazioneAttuale", typeof(string)));
            ds.Tables["monitoraggio"].Columns.Add(new DataColumn("AllocazioneModello", typeof(string)));
            ds.Tables["monitoraggio"].Columns.Add(new DataColumn("FontBold", typeof(bool)));
            ds.Tables["monitoraggio"].Columns.Add(new DataColumn("BackgroundGray", typeof(bool)));
            //ds.Tables["monitoraggio"].Columns.Add(new DataColumn("ReplaceIfZero", typeof(string)));
            //ds.Tables["monitoraggio"].Columns.Add(new DataColumn("IsTotal", typeof(bool)));
            //ds.Tables["monitoraggio"].Columns.Add(new DataColumn("IsSubTotal", typeof(bool)));            

             

            var areeMonitorate = datiSeiUnico.monitoraggioUnit().monitoraggio.ToList();
            var areeDisplayInfos = datiSeiUnico.displayInfos().areeDisplayInfos;
            var prodottiPatrimonioAltro = datiSeiUnico.pianificazioneUnit().pianificazioneVerticale;
            var pianificazione = datiSeiUnico.all().pianificazioneUnit.pianificazioneVerticale;
            var piramideModello = datiSeiUnico.piramideModelloUnit().piramideModello;

            
            #region Recupero i dati


            foreach (var area in from o in pianificazione.aree 
                                           join i in areeDisplayInfos on o.area.ToUpper() equals i.key.ToUpper()
                                           where o.isVisibile && o.ctvArea > 0
                                           orderby i.value.order select o)  {

                 
                 var areaModello = piramideModello.areaModello.LastOrDefault(o => o.area == area.area);
                 var areaPianificazione = pianificazione.aree.LastOrDefault(o => o.area == area.area);

                 if (area.area.Equals("Inv") || area.area.Equals("Pre"))
                 {
                     var row = ds.Tables["monitoraggio"].NewRow();
                     row["CodiceAreaBisogno"] = area.area;
                     row["DescrizioneAreaBisogno"] = area.descAreaEstesa;
                     row["DescrizioneProgetto"] = "Default";
                     row["ChiaveProgetto"] = 0;
                     row["OrdinamentoAreaBisogno"] = 0;
                     row["sDataAvvio"] = "";
                     row["RendimentoAvvio"] = "";
                     row["VaR"] = area.varInfos.varDecodificato;
                     row["ControvaloreAttuale"] = area.ctvArea;
                     row["AllocazioneAttuale"] = area.percArea * 100;
                     row["AllocazioneModello"] = areaModello.percentualeArea;
                     row["FontBold"] = true;
                     row["BackgroundGray"] = true;
                     ds.Tables["monitoraggio"].Rows.Add(row);
                 }

                 foreach (var progetto in from o in area.progetti orderby o.ctvProgetto descending select o)
                 {
                    var progettoPianificazione = areaPianificazione.progetti.LastOrDefault(o => o.chiaveProgetto == progetto.chiaveProgetto);
                    string sDataAvvio = progetto.progettoModello.nomeProgetto.Equals("Default") ? "" : "-";
                    string RendimentoAvvio = progetto.progettoModello.nomeProgetto.Equals("Default") ? "" : "-"; 
                    try {
                        var progettoMonitorato = areeMonitorate.LastOrDefault(o => o.area == area.area).progetti.LastOrDefault(o => o.chiaveProgetto == progetto.chiaveProgetto);
                          sDataAvvio = progettoMonitorato.rendimentoProgetto.dtAvvio == DateTime.MinValue ? "" : progettoMonitorato.rendimentoProgetto.dtAvvio.ToShortDateString();
                          RendimentoAvvio = progettoMonitorato.rendimentoProgetto.rendAvvio.ToString();
                    } catch {}


                    if (progettoPianificazione.ctvProgetto > 0)
                    {

                        var row = ds.Tables["monitoraggio"].NewRow();
                        row["CodiceAreaBisogno"] = area.area;
                        row["DescrizioneAreaBisogno"] = area.descAreaEstesa;
                        row["DescrizioneProgetto"] = progetto.progettoModello.nomeProgetto;
                        row["ChiaveProgetto"] = progetto.chiaveProgetto;
                        row["OrdinamentoAreaBisogno"] = 0;
                        row["sDataAvvio"] = sDataAvvio;
                        row["RendimentoAvvio"] = RendimentoAvvio;
                        row["VaR"] = progettoPianificazione.progettoVarInfos.varDecodificato;
                        row["ControvaloreAttuale"] = progettoPianificazione.ctvProgetto;
                        row["AllocazioneAttuale"] = progettoPianificazione.percProgetto * 100;
                        row["AllocazioneModello"] = progettoPianificazione.progettoModello.percentualeProgetto;
                        row["FontBold"] = progetto.progettoModello.nomeProgetto.Equals("Default") ? true : false;
                        row["BackgroundGray"] = progetto.progettoModello.nomeProgetto.Equals("Default") ? true : false;
                        ds.Tables["monitoraggio"].Rows.Add(row);
                    }
                }             
            }


            #region OC + CCN + Eligo
            var listReturn = new List<rsPosizione>();

            if (datiSeiUnico.CASA_OC != 0)
                listReturn.Add(new rsPosizione { prodotto = new rsProdotto() { nomeProdotto = "Operazioni in corso" }, ctv = datiSeiUnico.CASA_OC });
            if (datiSeiUnico.CASA_CCN != 0)
                listReturn.Add(new rsPosizione { prodotto = new rsProdotto() { nomeProdotto = "Conto corrente" }, ctv = datiSeiUnico.CASA_CCN });
            if (datiSeiUnico.CASA_GPELIGO != 0)
                listReturn.Add(new rsPosizione { prodotto = new rsProdotto() { nomeProdotto = "Liquidità negativa GP Eligo" }, ctv = datiSeiUnico.CASA_GPELIGO });
            #endregion

            if (listReturn.Count >0 )
            {
                ds.Tables["monitoraggio"].Rows.Add(
                    "",//CodiceAreaBisogno
                    "",//DescrizioneAreaBisogno
                     0,//OrdinamentoAreaBisogno
                    datiSeiUnico.FormatBanca("Totale risorse allocate"),//DescrizioneProgetto                  
                    0,//ChiaveProgetto                  
                    "-",//sDataAvvio
                    "-",//RendimentoAvvio
                    pianificazione.varRisorseAllocateInfos.varDecodificato,//VaR
                    datiSeiUnico.CASA_SUBTOTALE,//ControvaloreAttuale
                    pianificazione.percentualeTot * 100,//AllocazioneAttuale
                    piramideModello.totPercModello,//AllocazioneModello
                    true,//FontBold
                    true//BackgroundGray
                );

                 
                    foreach (var item in listReturn)
                    {
                        ds.Tables["monitoraggio"].Rows.Add(
                            "",//CodiceAreaBisogno
                            "",//DescrizioneAreaBisogno
                            0,//OrdinamentoAreaBisogno
                            item.prodotto.nomeProdotto, //Colonna1
                            0,//ChiaveProgetto                    
                           "-",//sDataAvvio
                           "-",//RendimentoAvvio
                           "-",//VaR
                            item.ctv, //Colonna3
                            "-",//AllocazioneAttuale
                           "-",//AllocazioneModello
                           false,//FontBold
                           false//BackgroundGray
                            );
                    }
                    
                }
             
            ds.Tables["monitoraggio"].Rows.Add(
                  "",//CodiceAreaBisogno
                  "",//DescrizioneAreaBisogno
                   0,//OrdinamentoAreaBisogno
                  datiSeiUnico.FormatBanca("Patrimonio $/Banca/$"),//DescrizioneProgetto                  
                  0,//ChiaveProgetto                   
                  "-",//sDataAvvio
                  "-",//RendimentoAvvio
                  pianificazione.varInfos.varDecodificato,//VaR
                  datiSeiUnico.CASA_TOTALE,//ControvaloreAttuale
                  pianificazione.altro != 0 ? "" : (pianificazione.percentualeTot * 100).ToString(),//AllocazioneAttuale
                   pianificazione.altro != 0 ? "" : (piramideModello.totPercModello).ToString(),//AllocazioneModello
                  true,//FontBold
                  true//BackgroundGray
              );
            #endregion


            return ds;   
        }
        private DataTable dtFooter(decimal contoCorrenteNegativo, decimal partiteViaggianti, decimal liqEligoFondiNeg, decimal liqEligoTitoliNeg)
        {      
                DataTable dt = new DataTable();
                dt.Columns.Add(new DataColumn("DescrizioneProgetto", typeof(string)));
                dt.Columns.Add(new DataColumn("ControvaloreAttuale", typeof(decimal)));
                
                if (contoCorrenteNegativo != 0)
                    dt.Rows.Add("Conto Corrente", contoCorrenteNegativo);
                
                
                
                if (liqEligoFondiNeg != 0)
                    dt.Rows.Add("GP EF - Liquidità", liqEligoFondiNeg);
                
                if (liqEligoTitoliNeg != 0)
                    dt.Rows.Add("GP ET - Liquidità", liqEligoTitoliNeg);

                if (partiteViaggianti != 0)
                    dt.Rows.Add("Operazioni in corso", partiteViaggianti);

                return dt;// new DataView(dt) { Sort = "ControvaloreAttuale" }.ToTable();        
        }

        public virtual bool RendimentoDaAvvio() { return GetOption<Opzione4_1>().Valore; }
        public virtual bool AllocazioneModello() { return GetOption<Opzione4_2>().Valore; }
        public virtual string GetTesto1() {
            string nota = "";

            if(AllocazioneModello() && !RendimentoDaAvvio())
                nota+= "In questa scheda sono riportati i principali dettagli relativi alle aree di bisogno e ai progetti di investimento su cui è attivo il monitoraggio: data di avvio del monitoraggio, Rischio Mercato (VaR),  allocazione corrente e ottimale, sulle aree di bisogno e sui progetti di investimento, delle risorse finanziarie che lei detiene presso $/Banca/$.";

            if(!AllocazioneModello() && RendimentoDaAvvio())
                nota+= "In questa scheda sono riportati i principali dettagli relativi alle aree di bisogno e ai progetti di investimento su cui è attivo il monitoraggio: data di avvio del monitoraggio, rendimento da avvio monitoraggio, Rischio Mercato (VaR), e allocazione corrente, sulle aree di bisogno e sui progetti di investimento, delle risorse finanziarie che lei detiene presso $/Banca/$.";
         
            if(!AllocazioneModello() && !RendimentoDaAvvio())
                nota+= "In questa scheda sono riportati i principali dettagli relativi alle aree di bisogno e ai progetti di investimento su cui è attivo il monitoraggio: data di avvio del monitoraggio, Rischio Mercato (VaR) e allocazione corrente, sulle aree di bisogno e sui progetti di investimento, delle risorse finanziarie che lei detiene presso $/Banca/$.";

            if(AllocazioneModello() && RendimentoDaAvvio())
                nota+= "In questa scheda sono riportati i principali dettagli relativi alle aree di bisogno e ai progetti di investimento su cui è attivo il monitoraggio: data di avvio del monitoraggio, rendimento da avvio monitoraggio, Rischio Mercato (VaR),  allocazione corrente e ottimale, sulle aree di bisogno e sui progetti di investimento, delle risorse finanziarie che lei detiene presso $/Banca/$.";

            return datiSeiUnico.FormatBanca(nota);
        }
       
         
    }
}
