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

namespace Consulenza.ReportWriter.Manager.Section.Immobiliare.MappaturaPreliminare
{
    /// <summary>
    /// Dettaglio immobili con anomalie catastali (id 134)
    /// </summary>
    public class S5 : Entity.Section
    {
        public S5(EnvironmentFacade environmentFacade, int idSection)
            : base(environmentFacade, idSection)
        {
            try
            {
                Draw();
            }
            catch (Exception ex)
            {
                SectionLogger.Write("S5", ex.Message, SectionLoggerMessageLevel.E, EnvironmentFacade.ReportEnvironment);
            }
        }

        /// <summary>
        /// Scheda8. Dettaglio immobili con anomalie catastali (riepilogo delle anomalie catastali per immobile)
        /// </summary>
        protected override sealed void Draw()
        {
            var dati = GetDataSet();
            var testi = GetText();

            var titolo = new FormattedTextAreaPDF(testi.Rows[0]["testo1"].ToString(), EnvironmentFacade.RendererFacade.XLeftLimit, 600) { FontSize = 10, FontColor = ColorPDF.Immobiliare_Grigio_TestoStandard };
            AddElement(new SpacePDF(40));
            AddElement(titolo);

            #region Oggetti da ripetere al salto pagina della tabella

            var listaOggettiDaRipetere = new List<ObjectPDF> { new SpacePDF(40), titolo, new SpacePDF(20) };
            AddElement(new RepeaterPDF(listaOggettiDaRipetere));

            #endregion

            AddElement(new SpacePDF(20));

            #region Tabella

            var tabella = new TablePDF(EnvironmentFacade.RendererFacade.XLeftLimit, dati.Tables[0])
            {
                Style = Style.Immobiliare,
                Footer = false,
                ShowBorderLastLine = true,
                ShowSeparationLines = true
            };


            tabella.Columns.Add(new ColumnPDF("descrizione", 205, HorizontalAlignmentType.Sinistra, false, false, 8, ColumnType.Testo, "descrizione", "Descrizione") { FontColor = ColorPDF.Nero });
            tabella.Columns.Add(new ColumnPDF("diritto", 100, HorizontalAlignmentType.Destra, false, false, 8, ColumnType.Testo, "diritto", "Tipologia diritto") { FontColor = ColorPDF.Nero });
            tabella.Columns.Add(new ColumnPDF("quota", 40, HorizontalAlignmentType.Destra, false, false, 8, ColumnType.Percentuale, "quotaproprieta", "Quota") { FontColor = ColorPDF.Nero });
            tabella.Columns.Add(new ColumnPDF("SEP1", 10, HorizontalAlignmentType.Nonimpostato, false, false, 8, ColumnType.Testo, "sep1", string.Empty)); //Separatore
            tabella.Columns.Add(new ColumnPDF("anomalierilevate", 385, HorizontalAlignmentType.Sinistra, true, false, 8, ColumnType.Testo, "anomalierilevate", "Anomalie rilevate")
            {
                HeaderBackgroundColor = ColorPDF.Immobiliare_Grigio_TitoloPiccolo,
                FontColor = ColorPDF.Nero,
                BackgroundColor = new ColorPDF(196, 196, 187)
            });
          
            AddElement(tabella);

            #endregion
        }

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

        /// <summary>
        /// Recupera i dati necessari alla Section restituendo un DataSet.
        /// </summary>
        /// <returns></returns>
        protected sealed override DataSet GetDataSet()
        {
            #region Definizione dei parametri

            var parametri = new List<Parametro>
            {
                new Parametro
                {
                    Direction = ParameterDirection.Input,
                    DbType = DbType.Int64,
                    ParameterName = "ChiaveClientePB",
                    Value = EnvironmentFacade.ReportEnvironment.Cliente.Chiave
                }
            };

            #endregion
            var ds = new DataSet();

            var dt = EnvironmentFacade.ReportEnvironment.MappaturaPreliminare.ImmobiliareCEUnica ? DataAccess.ExecuteDataSetStoredProcedure(DBProvider.SqlServerConsulenzaUnica, "REP_MappaturaPreliminare_S5_DettaglioImmobiliAnomalieCatastali", parametri)
                : DataAccess.ExecuteDataSetStoredProcedure(DBProvider.SqlServerConsulenzaEvoluta, "REP_MappaturaPreliminare_S5_DettaglioImmobiliAnomalieCatastali", parametri);


            //Riaggregazione
            var query = (from p in dt.Tables[0].AsEnumerable()
                         group p by p.Field<string>("IdImmobileCatasto") into g
                         select new
                         {
                             IdImmobileCatasto = g.Key,
                             TipoImmobile = g.Select(x => x.Field<int>("TipoImmobile")).FirstOrDefault(),
                             Descrizione = g.Select(x => x.Field<string>("Descrizione")).FirstOrDefault(),
                             Diritto = g.Select(x => x.Field<string>("Diritto")).FirstOrDefault(),
                             QuotaProprieta = g.Select(x => x.Field<decimal>("QuotaProprieta")).FirstOrDefault(),
                             ValoreStimato = g.Select(x => x.Field<decimal>("ValoreStimato")).FirstOrDefault(),
                             AnomalieRilevate = string.Join("<BR><BR>", g.Select(x => x.Field<string>("AnomalieRilevate")))
                         }).ToList();


            var dtResult = dt.Tables[0].Clone();

            foreach (var item in query)
                dtResult.Rows.Add(item.IdImmobileCatasto,item.TipoImmobile, item.Descrizione, item.Diritto, item.QuotaProprieta,item.ValoreStimato, string.Empty, item.AnomalieRilevate);

            ds.Tables.Add(dtResult);
            return ds;
        }
    }
}
