using System;
using System.Collections.Generic;
using System.Linq;
using Consulenza.ExternalServices;
using Consulenza.ReportWriter.Business;
using Consulenza.ReportWriter.Business.OBJ_PDF;
using System.Data;
using ceTe.DynamicPDF;
using Consulenza.ReportWriter.Business.CHART_PDF;
using Consulenza.ReportCommon;
using Consulenza.ReportWriter.Business.Entity;

namespace Consulenza.ReportWriter.Manager.Section.Immobiliare.Diagnosi.Nucleo
{
    /// <summary>
    /// Distribuzione geografica Fabbricati (id 35)
    /// </summary>
    public class S3 : Immobiliare.Diagnosi.S3
    {
        private readonly float _xLocalizzazioneGeografica;

        public S3(EnvironmentFacade environmentFacade, int idSection)
            : base(environmentFacade, idSection)
        {
        }

        /// <summary>
        /// Disegna il grafico. Se presente la cartina verra disegnato dopo la tabella altrimenti al posto della cartina.
        /// </summary>
        /// <param name="dati"></param>
        /// <param name="cartinaPresente"></param>
        protected override void AddChart(DataTable dati, bool cartinaPresente,int spazioInizale=40)
        {
            // Il grafico sarà disegnato al posto della cartina se questa non è presente
            float xGrafico = EnvironmentFacade.RendererFacade.XLeftLimit + 100;
            if (!cartinaPresente)
            {
                xGrafico = _xLocalizzazioneGeografica + 50;
                AddElement(new ResetterYPDF());
                AddElement(new SpacePDF(47));
            }

            var serieCollezione = new List<Serie>();
            var datiGrafico = dati;
            bool pagebreak = datiGrafico.Rows.Count > 7;
            var graficoBarre = new StackedPDF(xGrafico, 1F)
            {
                HeightSingleBar = 25,
                Width = 250,
                ShowLegend = true,
                BorderLineTop = true,
                BorderLineX = xGrafico - 100,
                BorderLineWidth = 360,
                PageBreak = pagebreak,
                MarginAxisYFromTop = 0,
                MarginAxisY = 7,
                DinamicFloatXEtichettaLateraleBarra = false
            };

            serieCollezione.Add(new Serie { Name = "ProprietaCliente", Text = "Proprietà del nucleo", Color = new ColorPDF(174, 150, 81) });
            serieCollezione.Add(new Serie { Name = "ProprietaAltriIntestatari", Text = "Proprietà di altri intestatari", Color = new ColorPDF(206, 219, 209) });

            foreach (DataRow item in datiGrafico.Rows)
            {
                serieCollezione[0].Points.Add(new Point
                {
                    LabelAxisX = item["Comune"].ToString(),
                    Color = serieCollezione[0].Color,
                    Value = Convert.ToDouble(item["ValoreStimatoProprieta"]),
                    ShowLabelAxisX = true,
                    ShowLabelAxisY = false
                });

                serieCollezione[1].Points.Add(new Point
                {
                    LabelAxisY = Helper.FormatCurrency(item["ValoreStimatoTotale"].ToString()),
                    Color = serieCollezione[1].Color,
                    Value = Convert.ToDouble(item["ValoreStimatoAltri"]),
                    ShowLabelAxisY = true,
                    ShowLabelAxisX = false
                });
            }

            graficoBarre.SeriesCollection = serieCollezione;

            AddElement(new SpacePDF(spazioInizale));

            AddElement(graficoBarre);
        }

        /// <summary>
        /// Recupera i dati necessari alla Section restituendo un DataSet.
        /// </summary>
        /// <returns></returns>
        protected override DataSet GetDataSet()
        {
            var ds = new DataSet();

            #region Definizione dei parametri

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

            #endregion

            var dt = EnvironmentFacade.ReportEnvironment.NucleoImmobiliare.ImmobiliareCEUnica ? DataAccess.ExecuteDataTableStoredProcedure(DBProvider.SqlServerConsulenzaUnica, "REP_Nucleo_Immobiliare_S3_DistribuzioneGeoFabbricati", parametri)
                : DataAccess.ExecuteDataTableStoredProcedure(DBProvider.SqlServerConsulenzaEvoluta, "REP_Nucleo_Immobiliare_S3_DistribuzioneGeoFabbricati", parametri);

            #region Riaggregazioni

            var dt1 = new DataTable();
            dt1.Columns.Add("Comune_Tipologia", typeof(string));
            dt1.Columns.Add("NumeroImmobili", typeof(decimal));
            dt1.Columns.Add("ValoreStimatoProprieta", typeof(decimal));
            dt1.Columns.Add("ValoreStimatoTotale", typeof(decimal));
            dt1.Columns.Add("FontBold", typeof(bool));
            dt1.Columns.Add("ReplaceIfZero", typeof(string));
            dt1.Columns.Add("CanLastRow", typeof(bool));
            dt1.Columns.Add("Codice_Tipologia", typeof(string));

            var dt2 = new DataTable();
            dt2.Columns.Add("Comune", typeof(string));
            dt2.Columns.Add("ValoreStimatoProprieta", typeof(decimal));
            dt2.Columns.Add("ValoreStimatoAltri", typeof(decimal));
            dt2.Columns.Add("ValoreStimatoTotale", typeof(decimal));


            // Distinct sui comuni            
            var distinctComuni = new DataView(dt).ToTable(true, "Comune");

            foreach (DataRow comune in distinctComuni.Rows)
            {
                IEnumerable<DataRow> query = from tipologie in dt.AsEnumerable()
                                             where tipologie.Field<string>("Comune").Equals(comune["Comune"].ToString())
                                             select tipologie;

                var intestazione = true;
                foreach (var item in query)
                {
                    if (intestazione)
                    {
                        dt1.Rows.Add(string.Format("{0} ({1})", item["comune"], item["provincia"]), 0, 0, 0, true, " ", false, string.Empty); // Intestazione                    
                        dt2.Rows.Add(
                            string.Format("{0} ({1})",
                            item["comune"], item["provincia"]),
                            Convert.ToDecimal(query.Sum(o => o.Field<decimal>("valorestimatoproprieta"))),
                            Convert.ToDecimal(query.Sum(o => o.Field<decimal>("valorestimatototale")) - query.Sum(o => o.Field<decimal>("valorestimatoproprieta"))),
                            Convert.ToDecimal(query.Sum(o => o.Field<decimal>("valorestimatototale"))));
                        intestazione = false;
                    }

                    dt1.Rows.Add(item["tipologia"], Convert.ToDecimal(item["numeroimmobili"]), Convert.ToDecimal(item["valorestimatoproprieta"]), Convert.ToDecimal(item["valorestimatototale"]), false, "-", true, item["codicetipologia"]); // Dettaglio

                }
            }

            #endregion

            ds.Tables.Add(dt.Copy());
            ds.Tables.Add(dt1);
            ds.Tables.Add(dt2);

            return ds;
        }
    }
}
