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 Consulenza.ReportWriter.Business.CHART_PDF;
using Consulenza.ReportCommon;
using Consulenza.ReportWriter.Business.Entity;

namespace Consulenza.ReportWriter.Manager.Section.Immobiliare.MappaturaPreliminare
{
    /// <summary>
    /// Distribuzione geografica Fabbricati e Terreni (id 131)
    /// </summary>
    public class S2 : Entity.Section
    {
        private readonly float _xLocalizzazioneGeografica;

        public S2(EnvironmentFacade environmentFacade, int idSection)
            : base(environmentFacade, idSection)
        {
            try
            {
                _xLocalizzazioneGeografica = EnvironmentFacade.RendererFacade.XLeftLimit + 420;
                Draw();
            }
            catch (Exception ex)
            {
                SectionLogger.Write("S2", ex.Message, SectionLoggerMessageLevel.E, EnvironmentFacade.ReportEnvironment);
            }
        }

        /// <summary>
        /// Scheda2. Patrimonio immobiliare –Distribuzione geografica (fabbricati) (distribuzione dei fabbricati del cliente divisa per Comune e categoria catastale)
        /// </summary>
        protected override sealed void Draw()
        {
            var dati = GetDataSet();

            if (dati.Tables[0].Rows.Count == 0) return;

            var testi = GetText();

            #region Recupero immagine della cartina

            //var codiciComune = (from codice in dati.Tables[0].AsEnumerable()
            //                    select codice.Field<string>("codComune")).Distinct();

            List<Consulenza.ExternalServices.PrometeiaWSPuc.mapComune> listacomunimarker = new List<Consulenza.ExternalServices.PrometeiaWSPuc.mapComune>();
            var codiciComuneMarker = (from codice in dati.Tables[0].AsEnumerable()
                                      select new
                                      {
                                          comune = codice.Field<string>("codComune"),
                                          // markerUrl = codice.Field<string>("tipo") == "F" ? "http://sla.prometeia.it/tmp/Fabbricati.png" : "http://sla.prometeia.it/tmp/Terreni.png"
                                          markerUrl = "http://sla.prometeia.it/tmp/puntatore63_v3.png"
                                      }).Distinct().ToArray();

            foreach (var u in codiciComuneMarker)
            {
                Consulenza.ExternalServices.PrometeiaWSPuc.mapComune ma = new Consulenza.ExternalServices.PrometeiaWSPuc.mapComune();
                ma.comune = u.comune;
                ma.markerUrl = u.markerUrl;
                listacomunimarker.Add(ma);
            }

            var immagine = new Prometeia().GetMapComuniItalyMappatura(listacomunimarker);

            #endregion

            bool cartinaPresente = immagine != null;

            ImagePDF iconaFabbricato;
            FormattedTextAreaPDF titoloFabbricato;
            ImagePDF iconaLocalizzazione = null;
            FormattedTextAreaPDF titoloLocalizzazione = null;
            ImagePDF cartina = null;

            #region Localizzazione geografica

            AddElement(new ResetterYPDF());
            AddElement(new SpacePDF(40));

            if (cartinaPresente)
            {
                iconaLocalizzazione = new ImagePDF(_xLocalizzazioneGeografica, 0.20F, "LocGeografica.png") { AutoIncrementYWritable = false };
                titoloLocalizzazione = new FormattedTextAreaPDF("Localizzazione geografica", _xLocalizzazioneGeografica + 30) { FontSize = 14, FontColor = ColorPDF.Immobiliare_Grigio_TitoloGrande };

                cartina = new ImagePDF(_xLocalizzazioneGeografica + 30, 0.35F, immagine) { AutoIncrementYWritable = true };

                AddElement(iconaLocalizzazione);
                AddElement(titoloLocalizzazione);
                AddElement(new SpacePDF(20));
                AddElement(cartina);


            }


            #endregion

            #region Immobili

            AddElement(new ResetterYPDF());
            AddElement(new SpacePDF(40));

            iconaFabbricato = new ImagePDF(EnvironmentFacade.RendererFacade.XLeftLimit, 0.30F, "CaseTerreni.png") { AutoIncrementYWritable = false };
            titoloFabbricato = new FormattedTextAreaPDF("Immobili", 92) { FontSize = 14, FontColor = ColorPDF.Immobiliare_Grigio_TitoloGrande };

            #region Tabella

            var datiTabella = dati.Tables[1];

            #region definizione delle note

            var campiAsterisco = new[] { "comune_tipologia" }; // campi del datasource su cui aggiungere gli asterischi di rimando alla note.
            var notaUnitaUrbane = datiTabella.Select("codice_tipologia = 'F1'").Any();
            var notaUnitaCollabenti = datiTabella.Select("codice_tipologia = 'F2'").Any();
            var notaUnitaInCostruzione = datiTabella.Select("codice_tipologia = 'F3'").Any();
            var notaUnitaInDefinizione = datiTabella.Select("codice_tipologia = 'F4'").Any();
            var notaFabbricatoInAttesaDichiarazione = datiTabella.Select("codice_tipologia = 'F6'").Any();

            #endregion

            var tabella = new TablePDF(EnvironmentFacade.RendererFacade.XLeftLimit + 40, datiTabella)
            {
                Style = Style.Immobiliare,
                RowsPadding = 4
            };

            tabella.Columns.Add(new ColumnPDF("comune_tipologia", 150, HorizontalAlignmentType.Sinistra, false, false, 8, ColumnType.Testo, "comune_tipologia", "Comune / Tipologia"));
            tabella.Columns.Add(new ColumnPDF("immobili", 45, HorizontalAlignmentType.Centrato, false, false, 8, ColumnType.Intero, "numeroimmobili", "Numero<BR>immobili"));

            tabella.FooterColumns.Add(new ColumnPDF("comune_tipologia", 150, HorizontalAlignmentType.Sinistra, false, true, 8, ColumnType.Testo));
            tabella.FooterColumns.Add(new ColumnPDF("immobili", 45, HorizontalAlignmentType.Centrato, false, true, 8, ColumnType.Intero));

            tabella.FooterCells[0, 0].Value = "Totale";
            tabella.FooterCells[1, 0].Value = Convert.ToDecimal(datiTabella.Compute("Sum(numeroimmobili)", string.Empty)).ToString();



            //Righe separatorie.
            for (int i = 0; i < datiTabella.Rows.Count; i++)
            {
                tabella.Row[i].Border = Convert.ToBoolean(datiTabella.Rows[i]["fontbold"]) && i > 0;
                tabella.Row[i].BorderType = BorderRowType.Alto;
            }

            #endregion

            AddElement(iconaFabbricato);
            AddElement(titoloFabbricato);
            AddElement(new SpacePDF(15));
            AddElement(tabella);

            #endregion

            #region Grafico
            var listaOggettiDaRipetere = new List<ObjectPDF>();
            if (cartinaPresente)
            {


                // Ripeto la parte destra  (localizzazione geografica)
                listaOggettiDaRipetere.Add(new ResetterYPDF());
                listaOggettiDaRipetere.Add(new SpacePDF(40));
                listaOggettiDaRipetere.Add(iconaLocalizzazione);
                listaOggettiDaRipetere.Add(titoloLocalizzazione);
                listaOggettiDaRipetere.Add(new SpacePDF(20));
                listaOggettiDaRipetere.Add(cartina);


                // Ripeto la parte sinistra  (fabbricati)
                listaOggettiDaRipetere.Add(new ResetterYPDF());
                listaOggettiDaRipetere.Add(new SpacePDF(40));
                listaOggettiDaRipetere.Add(iconaFabbricato);
                listaOggettiDaRipetere.Add(titoloFabbricato);
                listaOggettiDaRipetere.Add(new SpacePDF(15));

                AddElement(new RepeaterPDF(listaOggettiDaRipetere));


            }
            else
            {
                // Ripeto la parte sinistra  (fabbricati)
                listaOggettiDaRipetere.Add(new ResetterYPDF());
                listaOggettiDaRipetere.Add(new SpacePDF(40));
                listaOggettiDaRipetere.Add(iconaFabbricato);
                listaOggettiDaRipetere.Add(titoloFabbricato);
                listaOggettiDaRipetere.Add(new SpacePDF(15));

                AddElement(new RepeaterPDF(listaOggettiDaRipetere));
            }
            #endregion
        }

        /// <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 virtual void AddChart(DataTable dati, bool cartinaPresente)
        {
            // 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;

            var graficoBarre = new StackedPDF(xGrafico, 1F)
            {
                HeightSingleBar = 25,
                Width = 250,
                ShowLegend = true,
                BorderLineTop = true,
                BorderLineX = xGrafico - 100,
                BorderLineWidth = 360,
                MarginAxisYFromTop = 0,
                MarginAxisY = 7,
                DinamicFloatXEtichettaLateraleBarra = false
            };

            serieCollezione.Add(new Serie { Name = "ProprietaCliente", Text = "Proprietà del cliente", 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(40));

            AddElement(graficoBarre);
        }

        /// <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 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 = "ChiaveClientePB",
                    Value = EnvironmentFacade.ReportEnvironment.Cliente.Chiave
                }
            };

            #endregion

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

            #region Riaggregazioni

            var dt1 = new DataTable();
            dt1.Columns.Add("Comune_Tipologia", typeof(string));
            dt1.Columns.Add("NumeroImmobili", 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));


            // 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, true, " ", false, string.Empty); // Intestazione                    
                        dt2.Rows.Add(
                            string.Format("{0} ({1})", item["comune"], item["provincia"]));

                        intestazione = false;
                    }

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

                }
            }

            #endregion

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

            return ds;
        }
    }

}
