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

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

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

            var tabella = new TablePDF(EnvironmentFacade.RendererFacade.XLeftLimit, dati)
            {
                Style = Style.ConsulenzaUnica,
                Header = true,
                Footer = true,
                WhiteSpacesHorizontalSeparator = true,
                ShowSeparationLines = false,
                AlternateRow = false,
                HeaderHeight = 30,
                HeaderMargin = 2
            };

            #region Columns

            tabella.Columns.Add(new ColumnPDF("Immagine", 15, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Objectpdf, string.Empty, string.Empty) { DeltaYContent = 4, PaddingLeft = 2, HeaderFontSize = 7, FontSize = 7 });
            tabella.Columns.Add(new ColumnPDF("DataAvvio", 75, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Testo, "sDataAvvio", "Data<br>avvio") { HeaderFontSize = 7, DeltaYContent = -0.5F });
            tabella.Columns.Add(new ColumnPDF("DataInterruzione", 65, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Testo, "sDataInterruzione", "Data<br>interruzione") { HeaderFontSize = 7, FontSize = 7 });
            tabella.Columns.Add(new ColumnPDF("RisorseAssociate", 70, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Decimale, "RisorseAssociate", "Risorse<br>associate (€)") { HeaderFontSize = 7, FontSize = 7, PaddingRight = 6 });
            tabella.Columns.Add(new ColumnPDF("ApportiIniziali", 75, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Decimale, "ApportiIniziali", "Apporti<br>iniziali (€)") { HeaderFontSize = 7, FontSize = 7, PaddingRight = 6 });
            tabella.Columns.Add(new ColumnPDF("MovimentiSuccessivi", 75, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Decimale, "MovimentiSuccessivi", "Movimenti<br>successivi (€)") { HeaderFontSize = 7, FontSize = 7, PaddingRight = 6 });
            tabella.Columns.Add(new ColumnPDF("ControvaloreFinale", 75, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Decimale, "ControvaloreFinale", "Controvalore<br>finale (€)") { HeaderFontSize = 7, FontSize = 7, PaddingRight = 6 });
            tabella.Columns.Add(new ColumnPDF("RendimentoRealizzato", 70, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Decimale, "RendimentoRealizzato", "Rendimento<br>realizzato (%)") { HeaderFontSize = 7, FontSize = 7, PaddingRight = 2 });

            int j = 0;
            foreach (DataRow item in dati.Rows)
            {
                tabella.Cells[3, j].HorizontalAlignment = HorizontalAlignmentType.Destra;
                tabella.Cells[4, j].HorizontalAlignment = HorizontalAlignmentType.Destra;
                tabella.Cells[5, j].HorizontalAlignment = HorizontalAlignmentType.Destra;
                tabella.Cells[6, j].HorizontalAlignment = HorizontalAlignmentType.Destra;
                tabella.Cells[7, j].HorizontalAlignment = HorizontalAlignmentType.Destra;
                j++;
            }
                

            #endregion

            #region Cells

            int i = 0;
            foreach (DataRow rw in dati.Rows)
            {
                var isTotal = Convert.ToBoolean(rw["IsTotal"]);
                var isSubTotal = Convert.ToBoolean(rw["isSubTotal"]);

                if (isTotal || isSubTotal)
                {
                    // Sfondo grigio per la riga identificata con isTotal [quella di intestazione di area]
                    for (int c = 0; c < tabella.Columns.Count; c++)
                    {
                        tabella.Cells[c, i].BackgroundColor = ColorPDF.Standard_Grigio_SfondoColonnaTabella;
                    }
                    if (isTotal)
                    {
                        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;
                        }
                        // Simboli dell'area di bisogno
                        var listaOggetti = new List<ObjectPDF>                            
                                {
                                    new RectanglePDF(7.5F, 8, ColorPDF.GetBy_AreaBisogno(rw["CodiceAreaBisogno"].ToString())){DeltaY = 0.75F},
                                    new FormattedTextAreaPDF
                                    {
                                        Text = new AreaBisogno(rw["CodiceAreaBisogno"].ToString()).Abbreviazione,
                                        FontBold = true,
                                        FontColor = ColorPDF.Bianco,
                                        FontSize=7,
                                        DeltaX = deltaXSwitch//2.5F
                                    }                            
                                };

                        //Quadrato colorato indicatore Area
                        tabella.Cells[0, i].ValueObjectList.AddRange(listaOggetti);
                    }

                }

                if (isSubTotal)
                    tabella.Cells[1, i].ColSpan = 2;

                i++;
            }

            #endregion

            AddElement(tabella);
        }

        /// <summary>
        /// Recupera i dati necessari alla Section restituendo un DataTable.
        /// </summary>
        /// <returns></returns>
        protected sealed override DataTable GetDataTable()
        {
            #region DatiseiUnico
            var dataPiramideModello = datiSeiUnico.piramideModelloUnit().piramideModello.areaModello
                        .ToList()
                        .OrderBy(o => o.ordinamento).ToList();
            var listaAreeMonitorate = datiSeiUnico.monitoraggioUnit().monitoraggio.ToList();
            listaAreeMonitorate.RemoveAll(x => x.progetti == null);
            
            #endregion

            #region Tabella Storico dei progetti
            var dtStorico = new DataTable();
            dtStorico.Columns.Add(new DataColumn("CodiceAreaBisogno", typeof(string)));
            dtStorico.Columns.Add(new DataColumn("DescrizioneAreaBisogno", typeof(string)));
            dtStorico.Columns.Add(new DataColumn("OrdinamentoAreaBisogno", typeof(int)));
            dtStorico.Columns.Add(new DataColumn("DescrizioneProgetto", typeof(string)));
            dtStorico.Columns.Add(new DataColumn("DataAvvio", typeof(DateTime)));
            dtStorico.Columns.Add(new DataColumn("sDataAvvio", typeof(string)));
            dtStorico.Columns.Add(new DataColumn("DataInterruzione", typeof(DateTime)));
            dtStorico.Columns.Add(new DataColumn("sDataInterruzione", typeof(string)));
            dtStorico.Columns.Add(new DataColumn("RisorseAssociate", typeof(decimal)));
            dtStorico.Columns.Add(new DataColumn("ApportiIniziali", typeof(decimal)));
            dtStorico.Columns.Add(new DataColumn("MovimentiSuccessivi", typeof(decimal)));
            dtStorico.Columns.Add(new DataColumn("ControvaloreFinale", typeof(decimal)));
            dtStorico.Columns.Add(new DataColumn("RendimentoRealizzato", typeof(decimal)));
            dtStorico.Columns.Add(new DataColumn("FontBold", typeof(bool)));
            dtStorico.Columns.Add(new DataColumn("ReplaceIfZero", typeof(string)));
            dtStorico.Columns.Add(new DataColumn("IsTotal", typeof(bool)));
            dtStorico.Columns.Add(new DataColumn("IsSubTotal", typeof(bool)));
            #endregion

            #region Estrazione storico
            foreach (var area in listaAreeMonitorate)
            {

                var areaCommon = new AreaBisogno(area.area);

                if (areaCommon.Visibile)
                {
                    foreach (var progetto in area.progetti)
                    {
                        if (progetto.storici == null) continue;

                        var storico = ultimi3() ?
                            progetto.storici.OrderByDescending(o => o.dtInterruzione).Take(3) :
                            progetto.storici.OrderByDescending(o => o.dtInterruzione);

                        foreach (var item in storico)
                        {
                            if (item != null)
                            {
                                var itemPiramideModello = dataPiramideModello.FirstOrDefault(o => o.area.ToLower().Trim().Equals(areaCommon.Codice.ToLower().Trim()));

                                var row = dtStorico.NewRow();

                                row["CodiceAreaBisogno"] = areaCommon.Codice;
                                row["DescrizioneAreaBisogno"] = areaCommon.Nome;
                                row["DescrizioneProgetto"] = progetto.nomeProgetto;
                                row["OrdinamentoAreaBisogno"] = itemPiramideModello.ordinamento;

                                row["DataAvvio"] = item.dtAvvio;
                                row["sDataAvvio"] = item.dtAvvio.ToShortDateString();
                                row["DataInterruzione"] = item.dtInterruzione;
                                row["sDataInterruzione"] = item.dtInterruzione.ToShortDateString();

                                row["RisorseAssociate"] = item.risorseAssociate;
                                row["ApportiIniziali"] = item.apportiIniziali;
                                row["MovimentiSuccessivi"] = item.movimentiSuccessivi;
                                row["ControvaloreFinale"] = item.ctvFinale;
                                row["RendimentoRealizzato"] = item.rendimentoRealzzato;

                                row["FontBold"] = false;
                                row["IsTotal"] = false;
                                row["IsSubTotal"] = false;

                                dtStorico.Rows.Add(row);
                            }
                        }
                    }
                }
            } 
            #endregion

            #region Raggruppamento per area / progetto

            var dtStoricoPerArea = new DataTable();
            dtStoricoPerArea = dtStorico.Clone(); // Clono la struttura
            dtStoricoPerArea.TableName = dtStorico.TableName + "StoricoPerArea";

            var viewAree = new DataView(dtStorico) { Sort = "OrdinamentoAreaBisogno" };
            var dtAree = viewAree.ToTable(true, "CodiceAreaBisogno", "DescrizioneAreaBisogno", "OrdinamentoAreaBisogno");

            var sArea = string.Empty;
            var sProgetto = string.Empty;

            foreach (DataRow rowAreaProgetto in dtAree.Rows)
            {
                sArea = rowAreaProgetto["CodiceAreaBisogno"].ToString();

                //Progetti                   
                var viewProgetti = new DataView(dtStorico.Select("CodiceAreaBisogno='" + sArea + "'").CopyToDataTable());
                var dtProgetti = viewProgetti.ToTable(true, "DescrizioneProgetto");
                var bIntestazioneArea = true; // la riga di intestazione dell'area va stampata una sola volta.
                var bItestazioneProgetto = sArea == "Inv" || sArea == "Pre"; // la riga di intestazione del progetto va stampata solo per area Inv e Pre.

                DataRow rowStoricoPerArea;


                foreach (DataRow itemProgetto in dtProgetti.Rows)
                {
                    sProgetto = itemProgetto["DescrizioneProgetto"].ToString();

                    // Subset di prodotti filtrati per Area/Progetto
                    var dtArea = dtStorico.Select("CodiceAreaBisogno='" + sArea + "'").CopyToDataTable();
                    var dtAreaProgetto = dtStorico.Select("CodiceAreaBisogno='" + sArea + "' AND DescrizioneProgetto='" + sProgetto + "'").CopyToDataTable();

                    if (bIntestazioneArea)
                    {
                        #region riga con background grigio di intestazione per ogni area

                        rowStoricoPerArea = dtStoricoPerArea.NewRow();
                        rowStoricoPerArea["CodiceAreaBisogno"] = rowAreaProgetto["CodiceAreaBisogno"];
                        rowStoricoPerArea["sDataAvvio"] = rowAreaProgetto["DescrizioneAreaBisogno"].ToString();

                        rowStoricoPerArea["RisorseAssociate"] = 0;
                        rowStoricoPerArea["ApportiIniziali"] = 0;
                        rowStoricoPerArea["MovimentiSuccessivi"] = 0;
                        rowStoricoPerArea["ControvaloreFinale"] = 0;
                        rowStoricoPerArea["RendimentoRealizzato"] = 0;

                        rowStoricoPerArea["FontBold"] = true;
                        rowStoricoPerArea["ReplaceIfZero"] = " ";
                        rowStoricoPerArea["IsTotal"] = true;
                        rowStoricoPerArea["IsSubTotal"] = false;
                        dtStoricoPerArea.Rows.Add(rowStoricoPerArea);

                        bIntestazioneArea = false;

                        #endregion
                    }

                    if (bItestazioneProgetto)
                    {
                        #region Riga con background grigio di intestazione per ogni Progetto

                        rowStoricoPerArea = dtStoricoPerArea.NewRow();
                        rowStoricoPerArea["CodiceAreaBisogno"] = rowAreaProgetto["CodiceAreaBisogno"];
                        rowStoricoPerArea["sDataAvvio"] = sProgetto;

                        rowStoricoPerArea["RisorseAssociate"] = 0;
                        rowStoricoPerArea["ApportiIniziali"] = 0;
                        rowStoricoPerArea["MovimentiSuccessivi"] = 0;
                        rowStoricoPerArea["ControvaloreFinale"] = 0;
                        rowStoricoPerArea["RendimentoRealizzato"] = 0;

                        rowStoricoPerArea["FontBold"] = true;
                        rowStoricoPerArea["ReplaceIfZero"] = " ";
                        rowStoricoPerArea["IsTotal"] = false;
                        rowStoricoPerArea["IsSubTotal"] = true;

                        dtStoricoPerArea.Rows.Add(rowStoricoPerArea);

                        #endregion
                    }

                    // Merge
                    dtStoricoPerArea.Merge(dtAreaProgetto);

                }
            }

            #endregion

            return dtStoricoPerArea;
        }

        /// <summary>
        /// Recupera i dati necessari alla Section restituendo un DataSet.
        /// </summary>
        /// <returns></returns>
        protected sealed override DataSet GetDataSet()
        {
            return null;
        }

        protected virtual bool ultimi3()
        {
            // TO DO
            return GetOption<Opzione6_1>().Valore == "3";
        }
    }
}
