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

namespace Consulenza.ReportWriter.Manager.Section.Immobiliare.Diagnosi.Nucleo
{
    public class S6 : Entity.Section
    {
        public bool bPrintAltri = false;

        public S6(EnvironmentFacade environmentFacade, int idSection)
            : base(environmentFacade, idSection)
        {
            try
            {
                Draw();
            }
            catch (Exception ex)
            {
                SectionLogger.Write("S6", ex.Message, SectionLoggerMessageLevel.E, EnvironmentFacade.ReportEnvironment);
            }
        }

        /// <summary>
        /// Scheda6. Dettaglio terreni (elenco dei terreni e dei principali dati catastali, quote e valore stimato del cliente e dei cointestatari)
        /// </summary>
        protected override sealed void Draw()
        {
            var dati = GetDataSet();

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

            var testi = GetText();

            // Immobili con anomalie catastali       
            var immobiliConAnomalieCatastali = dati.Tables["Dati"].AsEnumerable().Where(r => r.Field<bool>("AnomaliaCatastale"));

            // Immobili non a catasto
            var immobiliNonACatasto = dati.Tables["Dati"].AsEnumerable().Where(r => r.Field<bool>("Catasto") == false);

            #region Recupero il numero massimo di colonne di tipo immagine da aggiungere

            var numeroColonneImmagine = 0;

            var listaCompletaIndici = new List<Int32>();
            listaCompletaIndici.AddRange(immobiliConAnomalieCatastali.Select(o => o.Field<Int32>("Indice")));
            listaCompletaIndici.AddRange(immobiliNonACatasto.Select(o => o.Field<Int32>("Indice")));

            if (listaCompletaIndici.Any())
            {
                numeroColonneImmagine = (from indice in listaCompletaIndici
                                         group indice by indice into grouping
                                         select new
                                         {
                                             Key = grouping.Key,
                                             Count = grouping.Count()
                                         }).Max(x => x.Count);
            }

            #endregion

            var icona = new ImagePDF(EnvironmentFacade.RendererFacade.XLeftLimit, 0.20F, "Terreni.png") { AutoIncrementYWritable = false };
            var titolo = new FormattedTextAreaPDF(testi.Rows[0]["testo1"].ToString(), 82, 600) { FontSize = 10, FontColor = ColorPDF.Immobiliare_Grigio_TestoStandard, DeltaY = 5 };

            #region Tabella

            var tabella = new TablePDF(EnvironmentFacade.RendererFacade.XLeftLimit, dati.Tables["Dati"])
            {
                Style = Style.Immobiliare,
                RowsPadding = 3,
                Footer = true,
                HeaderHeight = 130,
                MinimumRowHeight = 12
            };

            #region definizione larghezza colonne

            var larghezzaTabella = 755; // massima larghezza tabella
            var larghezzaImmagine = immobiliConAnomalieCatastali.Count() > 0 || immobiliNonACatasto.Count() > 0 ? 17 : 0;
            var larghezzaSingoloCliente = 65;
            var larghezzaRedditoAgrario = 50;
            var larghezzaRedditoDominicale = 50;
            var larghezzaSuperficieStimata = 30;
            //var larghezzaQuotaProprieta = 40;
            int larghezzaParziale = 0;
            if (bPrintAltri)
                larghezzaParziale = 70;
                          
            var larghezzaTotale = 70;

            //La colonna descrizione è l'unica variabile.
            var larghezzaDescrizione = larghezzaTabella - larghezzaParziale - larghezzaImmagine - larghezzaSuperficieStimata - larghezzaRedditoAgrario - larghezzaRedditoDominicale - larghezzaTotale - (larghezzaSingoloCliente * dati.Tables[1].Rows.Count);

            // Colonne di tipo Immagine
            for (int i = 1; i <= numeroColonneImmagine; i++)
            {
                larghezzaDescrizione -= larghezzaImmagine;
                tabella.Columns.Add(new ColumnPDF(string.Format("immagine{0}", i), larghezzaImmagine, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Immagine, string.Empty, string.Empty) { ScaleColumnTypeImage = 0.1F });
            }

            #endregion

            #region colonne e colonne del footer

            tabella.Columns.Add(new ColumnPDF("descrizione", larghezzaDescrizione, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Testo, "Descrizione", "Descrizione") { HeaderVerticalAlignment = VerticalAlignmentType.Basso, HeaderFontBold = true });
            tabella.Columns.Add(new ColumnPDF("superficiestimata", larghezzaSuperficieStimata, HorizontalAlignmentType.Centrato, false, false, 7, ColumnType.Testo, "SuperficieStimataStringa", "Superficie stimata (ha)") { HeaderTextVerticalDirection = true, HeaderFontBold = false });
            tabella.Columns.Add(new ColumnPDF("redditoagrario", larghezzaRedditoAgrario, HorizontalAlignmentType.Centrato, false, false, 7, ColumnType.Testo, "RedditoAgrario", "Reddito agrario") { HeaderTextVerticalDirection = true, HeaderFontBold = false });
            tabella.Columns.Add(new ColumnPDF("redditodominicale", larghezzaRedditoDominicale, HorizontalAlignmentType.Centrato, false, false, 7, ColumnType.Testo, "RedditoDominicaleStringa", "Reddito dominicale") { HeaderTextVerticalDirection = true, HeaderFontBold = false });

            tabella.FooterColumns.Add(new ColumnPDF("descrizione", tabella.Columns.Sum(p => p.Width), HorizontalAlignmentType.Sinistra, false, true, 7, ColumnType.Testo));
            tabella.FooterCells[0, 0].Value = "Totale";

            var iColonna = 1;
            foreach (DataRow cliente in dati.Tables["Clienti"].Rows)
            {
                var iCliente = Convert.ToInt32(cliente["PosizioneCliente"]);
                var campoStringa = string.Format("Cliente{0}Stringa", iCliente);

                tabella.Columns.Add(new ColumnPDF(campoStringa, larghezzaSingoloCliente, HorizontalAlignmentType.Destra, false, false, 7, ColumnType.Testo, campoStringa, cliente["Cliente"].ToString())
                {
                    HeaderVerticalAlignment = VerticalAlignmentType.Basso,
                    HeaderTextVerticalDirection = true,
                    HeaderBackgroundColor = ColorPDF.Immobiliare_Marrone,
                    HeaderFontColor = ColorPDF.Bianco,
                    HeaderFontBold = true,
                    BackgroundColor = ColorPDF.Immobiliare_Marrone,
                    FontColor = ColorPDF.Bianco,
                    FontBold = true,
                    HeaderPaddingLeft = -8
                });
                tabella.FooterColumns.Add(new ColumnPDF(campoStringa, larghezzaSingoloCliente, HorizontalAlignmentType.Destra, false, true, 7, ColumnType.Testo)
                {
                    BackgroundColor = ColorPDF.Immobiliare_Marrone,
                    FontColor = ColorPDF.Bianco,
                    FontBold = true
                });

                // verifico se il cliente ha solo terreni in usufrutto (nucleo non prende in considerazione nè quota proprietà nè usufrutto: lasciato per comodità.vedi mai che ci ripensEno)
                var clienteSoloUsufrutto = dati.Tables["Dati"]
                   .AsEnumerable()
                   .Select(r => r.Field<decimal>(string.Format("Cliente{0}", iCliente)))
                   .Distinct().Sum().Equals(-100);

                var totalePerCliente = clienteSoloUsufrutto ? 0 : Convert.ToDecimal(dati.Tables["Dati"].Compute(string.Format("{0}{1}{2}", "SUM(Cliente", iCliente, ")"), string.Format("Cliente{0} <> -100", iCliente))); // escludo i -100 dal computo del totale                
                tabella.FooterCells[iColonna, 0].Value = Helper.FormatCurrency((totalePerCliente.Equals(0) || totalePerCliente.Equals(-100) ? "-" : totalePerCliente.ToString()).ToString()); //-100 = usufrutto 

                iColonna++;
            }

            if (bPrintAltri)
            { 
                tabella.Columns.Add(new ColumnPDF("Parziale", larghezzaTotale, HorizontalAlignmentType.Destra, false, true, 7, ColumnType.Decimale, "ParzialeStringa", "Altri")
                {
                    HeaderVerticalAlignment = VerticalAlignmentType.Basso,
                    HeaderTextVerticalDirection = true,
                    FontColor = ColorPDF.Nero,
                    FontBold = true
                });
                tabella.FooterColumns.Add(new ColumnPDF("Parziale", larghezzaTotale, HorizontalAlignmentType.Destra, false, true, 7, ColumnType.Decimale));
                tabella.FooterCells[iColonna, 0].Value = Convert.ToDecimal(dati.Tables["Dati"].Compute("Sum(parziale)", string.Empty)).ToString();

                tabella.Columns.Add(new ColumnPDF("totale", larghezzaTotale, HorizontalAlignmentType.Destra, false, true, 7, ColumnType.Testo, "TotaleStringa", "Totale")
                {
                    HeaderVerticalAlignment = VerticalAlignmentType.Basso,
                    HeaderTextVerticalDirection = true,
                    FontColor = ColorPDF.Nero,
                    FontBold = true
                });
                tabella.FooterColumns.Add(new ColumnPDF("totale", larghezzaTotale, HorizontalAlignmentType.Destra, false, true, 7, ColumnType.Testo));
                tabella.FooterCells[iColonna + 1, 0].Value = Helper.FormatCurrency(Convert.ToDecimal(dati.Tables["Dati"].Compute("Sum(totale)", string.Empty)).ToString());
            }
            else
            {
                tabella.Columns.Add(new ColumnPDF("totale", larghezzaTotale, HorizontalAlignmentType.Destra, false, true, 7, ColumnType.Testo, "TotaleStringa", "Totale")
                {
                    HeaderVerticalAlignment = VerticalAlignmentType.Basso,
                    HeaderTextVerticalDirection = true,
                    FontColor = ColorPDF.Nero,
                    FontBold = true
                });
                tabella.FooterColumns.Add(new ColumnPDF("totale", larghezzaTotale, HorizontalAlignmentType.Destra, false, true, 7, ColumnType.Testo));
                tabella.FooterCells[iColonna, 0].Value = Helper.FormatCurrency(Convert.ToDecimal(dati.Tables["Dati"].Compute("Sum(totale)", string.Empty)).ToString());
            }

            #endregion

            #region immagini e border nelle colonne di tipo immagine

            // Da specifica le immagini devo essere disegnate sempre nella colonna più vicina possibile al testo (in modo da ottenere allineamento a destra)

            int indiceColonna = -1;

            #region Immobili con anomalia catastale
            // colore rosso e immagine per immobili selezionati
            foreach (var item in immobiliConAnomalieCatastali)
            {
                int indiceRiga = Convert.ToInt32(item["indice"]);

                for (int i = numeroColonneImmagine - 1; i >= 0; i--)
                {
                    if (string.IsNullOrEmpty(tabella.Cells[i, indiceRiga].Value))
                    {
                        indiceColonna = i;
                        break;
                    }
                }

                ////tabella.Row[indiceRiga].Border = true;
                tabella.Row[indiceRiga].ShowBorderInColumnImage = false;
                tabella.Row[indiceRiga].FontColor = new ColorPDF(205, 0, 6); // Rosso
                tabella.Row[indiceRiga].ForceStyleFontColor = true;
                tabella.Cells[indiceColonna, indiceRiga].Value = "warning.png";
            }
            #endregion

            #region Immobili non a catasto
            // Immagine per immobile non a catasto
            foreach (var item in immobiliNonACatasto)
            {
                int indiceRiga = Convert.ToInt32(item["indice"]);

                for (int i = numeroColonneImmagine - 1; i >= 0; i--)
                {
                    if (string.IsNullOrEmpty(tabella.Cells[i, indiceRiga].Value))
                    {
                        indiceColonna = i;
                        break;
                    }
                }

                tabella.Cells[indiceColonna, indiceRiga].Value = "info.png";
            }
            #endregion

            #endregion

            #region note della tabella
            /* nella parte nucleo immobiliare vengono scartati cointestatari non facenti parte del nucleo, diritto di proprietà, quota proprietà
           
            */
            // Nota immagine 1
            if (immobiliConAnomalieCatastali.Any())
                tabella.Notes.Add(new TableNotePDF(TableNotePDF.TableNotePositionType.PièDiTabella, testi.Rows[0]["testo3"].ToString()) { FontSize = 7, DeltaY = 3, Image = new ImagePDF(EnvironmentFacade.RendererFacade.XLeftLimit, 0.1F, "warning.png") });

            // Nota immagine 2
            if (immobiliNonACatasto.Any())
                tabella.Notes.Add(new TableNotePDF(TableNotePDF.TableNotePositionType.PièDiTabella, testi.Rows[0]["testo4"].ToString()) { FontSize = 7, DeltaY = 3, Image = new ImagePDF(EnvironmentFacade.RendererFacade.XLeftLimit, 0.1F, "info.png") });

            #endregion

            #endregion

            #region Oggetti da ripetere al salto pagina della tabella

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

            #endregion

            AddElement(new SpacePDF(40));
            AddElement(icona);
            AddElement(titolo);
            AddElement(new SpacePDF(20));
            AddElement(tabella);
        }

        /// <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()
        {
            #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 dsOriginal = EnvironmentFacade.ReportEnvironment.NucleoImmobiliare.ImmobiliareCEUnica ? DataAccess.ExecuteDataSetStoredProcedure(DBProvider.SqlServerConsulenzaUnica, "REP_Nucleo_Immobiliare_S6_DettaglioTerreni", parametri)
                : DataAccess.ExecuteDataSetStoredProcedure(DBProvider.SqlServerConsulenzaEvoluta, "REP_Nucleo_Immobiliare_S6_DettaglioTerreni", parametri);
            if (dsOriginal.Tables[0].Rows.Count == 0)
                return null;

            decimal nTotaleAltri = 0;
            for (int k = 0; k < dsOriginal.Tables[0].Rows.Count; k++)
                nTotaleAltri = nTotaleAltri + Convert.ToDecimal(dsOriginal.Tables[0].Rows[k]["parziale"]);

            if (nTotaleAltri > 0)
                bPrintAltri = true;

            var dt1 = dsOriginal.Tables[0].Copy();
            dt1.TableName = "Dati";

            // Colonne aggiuntive per formattazione in stringa
            dt1.Columns.Add("Indice", typeof(int));
            dt1.Columns.Add("RedditoAgrarioStringa", typeof(string));
            dt1.Columns.Add("RedditoDominicaleStringa", typeof(string));
            dt1.Columns.Add("SuperficieStimataStringa", typeof(string));
            // dt1.Columns.Add("QuotaProprietaStringa", typeof(string));
            dt1.Columns.Add("Cliente1Stringa", typeof(string));
            dt1.Columns.Add("Cliente2Stringa", typeof(string));
            dt1.Columns.Add("Cliente3Stringa", typeof(string));
            dt1.Columns.Add("Cliente4Stringa", typeof(string));
            dt1.Columns.Add("Cliente5Stringa", typeof(string));
            dt1.Columns.Add("ParzialeStringa", typeof(string));
            dt1.Columns.Add("TotaleStringa", typeof(string));

            var indice = 0;
            foreach (DataRow item in dt1.Rows)
            {
                item["Indice"] = indice;
                item["RedditoAgrarioStringa"] = Convert.ToInt32(item["RedditoAgrario"]) == 0 ? "n.d." : Helper.FormatInteger(item["RedditoAgrario"].ToString());
                item["RedditoDominicaleStringa"] = item["RedditoDominicale"] == DBNull.Value ? "-" : Helper.FormatCurrency(item["RedditoDominicale"].ToString());
                item["SuperficieStimataStringa"] = Convert.ToDecimal(item["SuperficieStimata"]) == 0 ? "n.d." : Helper.FormatDecimal(item["SuperficieStimata"].ToString(), 3);
                // item["QuotaProprietaStringa"] = item["QuotaProprieta"] == DBNull.Value ? "-" : Helper.FormatPercentage(item["QuotaProprieta"].ToString(), 1);

                for (int i = 1; i <= 5; i++)
                {
                    var campo = string.Format("Cliente{0}", i);
                    var campoStringa = string.Format("Cliente{0}Stringa", i);
                    item[campoStringa] = Helper.Decodifiche.DecodificaValoreStimatoProQuota(Convert.ToDecimal(item[campo]));
                }

                item["ParzialeStringa"] = Helper.Decodifiche.DecodificaValoreStimatoProQuota(Convert.ToDecimal(item["Parziale"]));
                item["TotaleStringa"] = Helper.Decodifiche.DecodificaValoreStimatoProQuota(Convert.ToDecimal(item["Totale"]));

                indice++;
            }


            // Clienti
            var dt2 = dsOriginal.Tables[1];
            dt2.TableName = "Clienti";


            // Dataset di ritorno
            var dsResult = new DataSet();
            dsResult.Tables.Add(dt1.Copy());
            dsResult.Tables.Add(dt2.Copy());

            return dsResult;
        }
    }
}
