using System;
using System.Collections.Generic;
using System.Data;
using Consulenza.ReportWriter.Business.OBJ_PDF;
using ceTe.DynamicPDF;
using Consulenza.ReportWriter.Business.CHART_PDF;
using Consulenza.ReportWriter.Business;

namespace Consulenza.ReportWriter.Manager.Section.Base.Proposta
{
    public class P2 : Entity.Section
    {
        public P2(EnvironmentFacade environmentFacade, int idSection)
            : base(environmentFacade, idSection)
        {
            try
            {
                Draw();
            }
            catch (Exception ex)
            {
                SectionLogger.Write("P2", ex.Message, SectionLoggerMessageLevel.E, EnvironmentFacade.ReportEnvironment);
            }
        }

        /// <summary>
        /// Disegna l'oggetto P2
        /// </summary>
        protected override sealed void Draw()
        {
            //Guida l'aumento di dimensione verticale della sezione delle torte:
            const int deltaSommaPixelVerticale = 20;

            var dsP2 = GetDataSet();

            var dtTabellaRisorseFinanziarie = dsP2.Tables[0];
            var dtTabellaPatrimonio = dsP2.Tables[1];
            var dtTabellaNotaPresente = dsP2.Tables[2];

            if (dtTabellaRisorseFinanziarie.Rows.Count <= 0) return;

            var totaleControvaloreAttuale_RisorseFinanziarie = Convert.ToDecimal(dtTabellaRisorseFinanziarie.Compute("Sum(Ctv_Attuale)", string.Empty));
            var totaleControvaloreProspettico_RisorseFinanziarie = Convert.ToDecimal(dtTabellaRisorseFinanziarie.Compute("Sum(Ctv_Prospettico)", string.Empty));
            var totaleControvaloreAttuale_PatrimonioTotale = dtTabellaPatrimonio.Rows.Count > 0 ? totaleControvaloreAttuale_RisorseFinanziarie + Convert.ToDecimal(dtTabellaPatrimonio.Compute("Sum(Ctv_Attuale)", string.Empty)) : totaleControvaloreAttuale_RisorseFinanziarie;
            var totaleControvaloreProspettico_PatrimonioTotale = dtTabellaPatrimonio.Rows.Count > 0 ? totaleControvaloreProspettico_RisorseFinanziarie + Convert.ToDecimal(dtTabellaPatrimonio.Compute("Sum(Ctv_Prospettico)", string.Empty)) : totaleControvaloreProspettico_RisorseFinanziarie;

            bool visualizzareTabellaDelPatrimonioTotale = false;

            if (dtTabellaPatrimonio.Rows.Count > 0)
            {
                if (!Convert.ToDecimal(dtTabellaPatrimonio.Compute("Sum(Ctv_Attuale)", string.Empty)).Equals(0) ||
                    !Convert.ToDecimal(dtTabellaPatrimonio.Compute("Sum(Ctv_Prospettico)", string.Empty)).Equals(0))
                {
                    visualizzareTabellaDelPatrimonioTotale = true;
                }
            }

            #region Tabella Risorse Finanziarie

            var tabellaRisorseFinanziarie = new TablePDF(EnvironmentFacade.RendererFacade.XLeftLimit, dtTabellaRisorseFinanziarie)
            {
                ShowBorderFooter = false,
                ID = "Tabella_P2"
            };

            tabellaRisorseFinanziarie.Columns.Add(new ColumnPDF("ColoriMacroAsset", 23, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Objectpdf, string.Empty, string.Empty) { DeltaYContent = 5 });
            tabellaRisorseFinanziarie.Columns.Add(new ColumnPDF("MacroAsset", 140, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Testo, "MacroAsset", "Macro asset class"));
            tabellaRisorseFinanziarie.Columns.Add(new ColumnPDF("Ctv_Attuale", 150, HorizontalAlignmentType.Destra, false, false, 7, ColumnType.Decimale, "Ctv_Attuale", "Controvalore attuale (€)"));
            tabellaRisorseFinanziarie.Columns.Add(new ColumnPDF("Ctv_Prospettico", 210, HorizontalAlignmentType.Destra, false, false, 7, ColumnType.Decimale, "Ctv_Prospettico", "Controvalore prospettico (€)"));


            // Aggiungo i colori alla colonna ColoriMacroAsset
            var indiceRiga = 0;
            var percentualiControvaloreAttuale = new List<double>();
            var percentualiControvaloreProspettico = new List<double>();

            var serieCollezione = new List<Serie>
            {
                new Serie {Name = "TortaControvaloreAttuale"},
                new Serie {Name = "TortaControvaloreProspettico"}
            };


            foreach (DataRow row in tabellaRisorseFinanziarie.DataSource.Rows)
            {
                var color = new ColorPDF(Convert.ToInt32(row["Red"]), Convert.ToInt32(row["Green"]), Convert.ToInt32(row["Blue"]));
                tabellaRisorseFinanziarie.Cells[0, indiceRiga].ValueObject = new CirclePDF(10, 10, color);
                indiceRiga++;

                percentualiControvaloreAttuale.Add(Convert.ToDouble(row["Perc_Attuale"]));
                percentualiControvaloreProspettico.Add(Convert.ToDouble(row["Perc_Prospettico"]));

                //Serie Controvalore Attuale
                serieCollezione[0].Points.Add(new Point
                {
                    LabelAxisX = row["MacroAsset"].ToString(),
                    Color = color,
                    Value = Convert.ToDouble(row["Perc_Attuale"]),
                    ShowLabelAxisX = false,
                    ShowLabelAxisY = false
                });


                //Serie Controvalore Prospettico
                serieCollezione[1].Points.Add(new Point
                {
                    LabelAxisX = row["MacroAsset"].ToString(),
                    Color = color,
                    Value = Convert.ToDouble(row["Perc_Prospettico"]),
                    ShowLabelAxisX = false,
                    ShowLabelAxisY = false
                });

            }

            // Footer
            tabellaRisorseFinanziarie.FooterColumns.Add(new ColumnPDF("Totale Risorse Finanziarie", 163, HorizontalAlignmentType.Sinistra, false, true, 8, ColumnType.Testo));
            tabellaRisorseFinanziarie.FooterColumns.Add(new ColumnPDF("Totale Controvalore Attuale", 150, HorizontalAlignmentType.Destra, false, true, 8, ColumnType.Decimale));
            tabellaRisorseFinanziarie.FooterColumns.Add(new ColumnPDF("Totale Controvalore Prospettico", 210, HorizontalAlignmentType.Destra, false, true, 8, ColumnType.Decimale));

            tabellaRisorseFinanziarie.FooterCells[0, 0].Value = visualizzareTabellaDelPatrimonioTotale ? "Totale risorse finanziarie" : "Totale patrimonio";
            tabellaRisorseFinanziarie.FooterCells[1, 0].Value = totaleControvaloreAttuale_RisorseFinanziarie.ToString();
            tabellaRisorseFinanziarie.FooterCells[2, 0].Value = totaleControvaloreProspettico_RisorseFinanziarie.ToString();
            #endregion

            #region Tabella Patrimonio
            TablePDF tabellaPatrimonio = null;

            if (visualizzareTabellaDelPatrimonioTotale)
            {
                tabellaPatrimonio = new TablePDF(EnvironmentFacade.RendererFacade.XLeftLimit, dtTabellaPatrimonio);
                tabellaPatrimonio.Columns.Add(new ColumnPDF("Descrizione", 163, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Testo, "Descrizione", string.Empty));
                tabellaPatrimonio.Columns.Add(new ColumnPDF("Ctv_Attuale", 150, HorizontalAlignmentType.Destra, false, false, 7, ColumnType.Decimale, "Ctv_Attuale", string.Empty));
                tabellaPatrimonio.Columns.Add(new ColumnPDF("Ctv_Prospettico", 210, HorizontalAlignmentType.Destra, false, false, 7, ColumnType.Decimale, "Ctv_Prospettico", string.Empty));
                tabellaPatrimonio.Header = false;
                tabellaPatrimonio.ShowBorderFooter = false;
                tabellaPatrimonio.ShowBorderHeader = false;

                #region Nota del patrimonio non rappresentabile

                var notaPatrimonioNonRappresentabile = new TableNotePDF(TableNotePDF.TableNotePositionType.PièDiTabella, "Dettaglio riportato nel capitolo ''Patrimonio non rappresentabile''")
                {
                    Width = 200,
                    AutoIncrementYWritable = false
                };

                #endregion

                // Footer
                tabellaPatrimonio.FooterColumns.Add(new ColumnPDF("Totale Patrimonio", 163, HorizontalAlignmentType.Sinistra, false, true, 8, ColumnType.Testo));
                tabellaPatrimonio.FooterColumns.Add(new ColumnPDF("Totale Controvalore Attuale", 150, HorizontalAlignmentType.Destra, false, true, 8, ColumnType.Decimale));
                tabellaPatrimonio.FooterColumns.Add(new ColumnPDF("Totale Controvalore Prospettico", 210, HorizontalAlignmentType.Destra, false, true, 8, ColumnType.Decimale));

                tabellaPatrimonio.FooterCells[0, 0].Value = "Totale patrimonio";
                tabellaPatrimonio.FooterCells[1, 0].Value = totaleControvaloreAttuale_PatrimonioTotale.ToString();
                tabellaPatrimonio.FooterCells[2, 0].Value = totaleControvaloreProspettico_PatrimonioTotale.ToString();

                //Check presenza nota di dettagliamento del Patrimonio Non Rappresentabile:
                if (Convert.ToInt16(dtTabellaNotaPresente.Rows[0]["NotaPresente"]) > 0)
                    tabellaPatrimonio.Notes.Add(notaPatrimonioNonRappresentabile);
            }
            #endregion

            #region Grafici a Torta

            #region Cornice Sinistra
            var bordoSinistro = new RectanglePDF(EnvironmentFacade.RendererFacade.XLeftLimit + 180 - 90, 120 + deltaSommaPixelVerticale, 5, ColorPDF.ConsulenzaBase_Grigio_BordoColonnaHeaderFooterTabella)
            {
                AutoIncrementYWritable = false
            };

            var bordoSinistroBianco = new RectanglePDF(EnvironmentFacade.RendererFacade.XLeftLimit + 181 - 90, 118 + deltaSommaPixelVerticale, 5, ColorPDF.Bianco)
            {
                AutoIncrementYWritable = false,
                DeltaY = 1
            };

            #endregion

            #region Grafico Controvalore Attuale
            //var tortaControvaloreAttuale = new PiePDF(EnvironmentFacade.RendererFacade.XLeftLimit + 186 - 30, 1F)
            //{
            //    Width = 170,
            //    Height = 170,
            //    SeriesCollection = serieCollezione.FindAll(s => s.Name.Equals("TortaControvaloreAttuale"))
            //};
            var tortaControvaloreAttuale = new PiePDF(EnvironmentFacade.RendererFacade.XLeftLimit + 186 - 80, 1F)
            {
                Width = 200,
                Height = 200,
                SeriesCollection = serieCollezione.FindAll(s => s.Name.Equals("TortaControvaloreAttuale")),
                StartAngle = 0,
                ShowLabelPoints = true,
                Style3DEnabled = false,
                AutoIncrementYWritable = true,
                LabelDecimalDigitsCount = 1,
                FontLabelSize = 5f,
                CustomPlottingHeight = 50,
                CustomPlottingWidth = 50,
                CustomPlottingX = 25,
                CustomPlottingY = 7,
                UseCustomPlotting = true,
            };

            #endregion

            #region Grafico Controvalore Prospettico
            //var tortaControvaloreProspettico = new PiePDF(EnvironmentFacade.RendererFacade.XLeftLimit + 356 - 30, 1F)
            //{
            //    Width = 170,
            //    Height = 170,
            //    SeriesCollection = serieCollezione.FindAll(s => s.Name.Equals("TortaControvaloreProspettico"))
            //};
            var tortaControvaloreProspettico = new PiePDF(EnvironmentFacade.RendererFacade.XLeftLimit + 356 - 70, 1F)
            {
                Width = 200,
                Height = 200,
                SeriesCollection = serieCollezione.FindAll(s => s.Name.Equals("TortaControvaloreProspettico")),
                StartAngle = 0,
                ShowLabelPoints = true,
                Style3DEnabled = false,
                AutoIncrementYWritable = true,
                LabelDecimalDigitsCount = 1,
                FontLabelSize = 5f,
                CustomPlottingHeight = 50,
                CustomPlottingWidth = 50,
                CustomPlottingX = 25,
                CustomPlottingY = 7,
                UseCustomPlotting = true,
            };
            #endregion

            #region Cornice Destra
            var bordoDestro = new RectanglePDF(EnvironmentFacade.RendererFacade.XRightLimit - 5, 120 + deltaSommaPixelVerticale, 5, ColorPDF.ConsulenzaBase_Grigio_BordoColonnaHeaderFooterTabella)
            {
                AutoIncrementYWritable = false
            };

            var bordoDestroBianco = new RectanglePDF(EnvironmentFacade.RendererFacade.XRightLimit - 6, 118 + deltaSommaPixelVerticale, 5, ColorPDF.Bianco)
            {
                AutoIncrementYWritable = false,
                DeltaY = 1
            };

            #endregion

            #endregion

            #region Rettangolo chiusura sezione
            //Disegno un rettangolo in secondo piano che dia l'effetto cornice all'intestazione
            var rectangleFooterBorder = new RectanglePDF(EnvironmentFacade.RendererFacade.XLeftLimit - 1, 10, 523, ColorPDF.ConsulenzaBase_Grigio_BordoColonnaHeaderFooterTabella)
            {
                DeltaY = 11,
                AutoIncrementYWritable = false
            };

            // rettangolo contenitore grigio
            var rectangleFooter = new RectanglePDF(EnvironmentFacade.RendererFacade.XLeftLimit, 20, 521, ColorPDF.ConsulenzaBase_Grigio_SfondoColonnaHeaderFooterTabella)
            {
                AutoIncrementYWritable = false
            };

            #endregion

            AddElement(tabellaRisorseFinanziarie);
            if (visualizzareTabellaDelPatrimonioTotale)
            {
                AddElement(tabellaPatrimonio);
            }
            AddElement(new SpacePDF(12));

            if (serieCollezione.Count > 0)
            {
                AddElement(bordoSinistro);
                AddElement(bordoSinistroBianco);
                AddElement(tortaControvaloreAttuale);
                AddElement(tortaControvaloreProspettico);
                AddElement(bordoDestro);
                AddElement(bordoDestroBianco);
            }

            //AddElement(new SpacePDF(125 + deltaSommaPixelVerticale));
            AddElement(new SpacePDF(135 + deltaSommaPixelVerticale));
            AddElement(rectangleFooterBorder);
            AddElement(rectangleFooter);
            AddElement(new SpacePDF(10));
        }

        /// <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 parametri = new List<Parametro>();

            #region Definizione dei parametri

            var parametro = new Parametro
            {
                Direction = ParameterDirection.Input,
                DbType = DbType.Int64,
                ParameterName = "chiaveClientePB",
                Value = EnvironmentFacade.ReportEnvironment.Cliente.Chiave
            };
            parametri.Add(parametro);

            parametro = new Parametro
            {
                Direction = ParameterDirection.Input,
                DbType = DbType.Int32,
                ParameterName = "chiaveProposta",
                Value = EnvironmentFacade.ReportEnvironment.Proposta.Chiave
            };
            parametri.Add(parametro);

            #endregion

            return EnvironmentFacade.ReportEnvironment.Proposta.PropostaCBUnica ? DataAccess.ExecuteDataSetStoredProcedure(DBProvider.SqlServerConsulenzaUnica, "REP_Prop_P2", parametri)
                : DataAccess.ExecuteDataSetStoredProcedure(DBProvider.SqlServerConsulenzaBase, "REP_Prop_P2", parametri);
        }
    }
}
