using System;
using System.Collections;
using System.Collections.Generic;
using Consulenza.ReportModeler.Manager;
using System.Linq;
using ceTe.DynamicPDF;
using ceTe.DynamicPDF.Merger;
using Consulenza.ReportCommon;
using Consulenza.WebTemplateModeler.Entity;



namespace Consulenza.Immobiliare.Business
{
    public class GeneratorService
    {

        private readonly Int64 _chiaveClientePb;
        private readonly Cliente _cliente = new Cliente();

        /// <summary>
        /// Ottiene un array binario del PDF del report di Immobiliare di Diagnosi di ConsulenzaEvoluta per un cliente identificato con chiaveClientePb.
        /// </summary>
        /// <param name="chiaveCliente">Chiave del cliente</param>
        /// <param name="idImmobileCatasto">lista di id immobile al catasto. Corrisponde al campo chiaveProdottoTerzi della tabella ConsulenzaEvoluta.PatrimonioTerzi</param>
        /// <param name="idSezione">lista delle sezioni. Campo:IdSezione, tabella:Sezioni, database:ReportModeler2</param>  
        public byte[] CreaReport_ImmobiliareDiagnosi(long chiaveCliente, List<string> idImmobileCatasto, List<Int32> idSezione, bool unica)
        {
            var cliente = DataService.ClienteManager.RecuperaCliente(chiaveCliente, unica);
            var privateBanker = DataService.PrivateBankerManager.RecuperaPrivateBanker(chiaveCliente, unica);

            var generator = new ReportStructManager(cliente, privateBanker);
            return generator.CreaReport_ImmobiliareDiagnosi(chiaveCliente, idImmobileCatasto, idSezione, unica);
        }

        public byte[] CreaReport_MonitoraggioImmobiliare(long chiaveCliente, List<string> idImmobileCatasto, List<Int32> idSezione, bool bBatch = false)
        {
            if (bBatch == true)
            { 
                var cliente = DataService.ClienteManager.RecuperaCliente(chiaveCliente, true);
                var privateBanker = DataService.PrivateBankerManager.RecuperaPrivateBanker(chiaveCliente, true);
                cliente.TipologiaContratto = privateBanker.CodiceRete;
                var generator = new ReportStructManager(cliente, privateBanker);
                return generator.CreaReport_ImmobiliareMonitoraggio(chiaveCliente, idImmobileCatasto, idSezione, bBatch);
            }
            else
            {
                var cliente = DataService.ClienteManager.RecuperaCliente(chiaveCliente, true);
                var privateBanker = DataService.PrivateBankerManager.RecuperaPrivateBanker(chiaveCliente, true);

                var generator = new ReportStructManager(cliente, privateBanker);
                generator.datiSeiUnico = _datiSeiUnico;
                return generator.CreaReport_ImmobiliareMonitoraggio(chiaveCliente, idImmobileCatasto, idSezione, bBatch);
            }
            
        }

        public byte[] CreaReport_MonitoraggioImmobiliareNucleiold(Nucleo nucleo, List<Int64> chiaviClientiPB, List<string> idImmobileCatasto, List<Int32> idSezione)
        {
           Consulenza.Immobiliare.Business.GeneratorService generatorService = null;
//            var nucleo = DataService.NucleoManager.RecuperaNucleo(chiaveNucleo,  true);
            long chiavePbPrincipale = nucleo.ChiaveClientePBPrincipale;
           var privateBanker = DataService.PrivateBankerManager.RecuperaPrivateBanker(chiavePbPrincipale, true);
           
//            #region lettura dati Unica
//            Consulenza.DataServices.DatiSeiUnico datiSeiUnico = null;
//            // lettura dati cliente 

//            try
//            {

//                datiSeiUnico = new Consulenza.DataServices.DatiSeiUnico(
//                   privateBanker.Codice,
//                   chiavePbPrincipale.ToString(),
//                   "", //todo verifica mandato 
//                   privateBanker.CodiceRete,
//                   0,
//                   chiaveNucleo,
//                   idSezione
//                );

//                datiSeiUnico.Execute();
                
//                generatorService = new Consulenza.Immobiliare.Business.GeneratorService(datiSeiUnico);

//            }
//            catch (Exception ex)
//            {
//                //mt.insertLog(modello.Id.ToString(), template.CodicePb, template.Id.ToString(), template.IsDefault, datiSeiUnico.UrlFideuramDati + " " + metodo, ex);
//                throw new Exception(datiSeiUnico.UrlFideuramDati + " " + ex.Message);
//            }

//#endregion



            var generator = new ReportStructManager(nucleo, privateBanker);
            generator.datiSeiUnico = _datiSeiUnico;
            return generator.CreaReport_ImmobiliareMonitoraggioNuclei(nucleo, chiaviClientiPB, idImmobileCatasto, idSezione);


            //var nucleo = DataService.NucleoManager.RecuperaNucleo(chiaveNucleo, unica);
            //var privateBanker = DataService.PrivateBankerManager.RecuperaPrivateBanker(nucleo.AgenteNucleo, nucleo.ReteNucleo, unica);

            //var generator = new ReportStructManager(nucleo, privateBanker);
            //return generator.CreaReport_ImmobiliareDiagnosi_Nucleo(nucleo, idImmobileCatasto, chiaviClientiPb, idSezione, unica);



        }

        public byte[] CreaReport_MonitoraggioImmobiliareCU(long chiaveCliente, List<string> idImmobileCatasto, ReportStruct reportStruttura)
        {
            var cliente = DataService.ClienteManager.RecuperaCliente(chiaveCliente, true);
            var privateBanker = DataService.PrivateBankerManager.RecuperaPrivateBanker(chiaveCliente, true);

            var generator = new ReportStructManager(cliente, privateBanker);
            generator.datiSeiUnico = _datiSeiUnico;
            return generator.CreaReport_ImmobiliareMonitoraggioCU(chiaveCliente, idImmobileCatasto, reportStruttura);
        }


        public byte[] CreaReport_MonitoraggioImmobiliareNuclei(long chiaveNucleo, List<Int64> chiaviClientiPB, List<string> idImmobileCatasto, List<Int32> idSezione)
        {
            //Consulenza.Immobiliare.Business.GeneratorService generatorService = null;
            var nucleo = DataService.NucleoManager.RecuperaNucleo(chiaveNucleo, true);
            nucleo.HasServizioAggiuntivoImmobiliare = DataService.NucleoManager.HasServizioAggiuntivoImmobiliare(chiaveNucleo, true);

            long chiavePbPrincipale = nucleo.ChiaveClientePBPrincipale;
            //var privateBanker = DataService.PrivateBankerManager.RecuperaPrivateBanker(chiavePbPrincipale, true);
            var privateBanker = DataService.PrivateBankerManager.RecuperaPrivateBanker(nucleo.AgenteNucleo, nucleo.ReteNucleo, true);

            #region lettura dati Unica
            //Consulenza.DataServices.DatiSeiUnico datiSeiUnico = null;
            //// lettura dati cliente 

            //try
            //{

            //    datiSeiUnico = new Consulenza.DataServices.DatiSeiUnico(
            //       privateBanker.Codice,
            //       chiavePbPrincipale.ToString(),
            //       "", //todo verifica mandato 
            //       privateBanker.CodiceRete,
            //       0,
            //       chiaveNucleo,
            //       idSezione
            //    );

            //    datiSeiUnico.Execute();

            //    generatorService = new Consulenza.Immobiliare.Business.GeneratorService(datiSeiUnico);

            //}
            //catch (Exception ex)
            //{
            //    //mt.insertLog(modello.Id.ToString(), template.CodicePb, template.Id.ToString(), template.IsDefault, datiSeiUnico.UrlFideuramDati + " " + metodo, ex);
            //    throw new Exception(datiSeiUnico.UrlFideuramDati + " " + ex.Message);
            //}

            #endregion



            var generator = new ReportStructManager(nucleo, privateBanker);
            generator.datiSeiUnico = _datiSeiUnico;
            return generator.CreaReport_ImmobiliareMonitoraggioNuclei(nucleo, chiaviClientiPB, idImmobileCatasto, idSezione);


            //var nucleo = DataService.NucleoManager.RecuperaNucleo(chiaveNucleo, unica);
            //var privateBanker = DataService.PrivateBankerManager.RecuperaPrivateBanker(nucleo.AgenteNucleo, nucleo.ReteNucleo, unica);

            //var generator = new ReportStructManager(nucleo, privateBanker);
            //return generator.CreaReport_ImmobiliareDiagnosi_Nucleo(nucleo, idImmobileCatasto, chiaviClientiPb, idSezione, unica);



        }

        public byte[] CreaReport_MonitoraggioImmobiliareNucleiCU(long chiaveNucleo, List<string> idImmobileCatasto, ReportStruct reportStruttura)
        {

            //Consulenza.Immobiliare.Business.GeneratorService generatorService = null;
            var nucleo = DataService.NucleoManager.RecuperaNucleo(chiaveNucleo, true);
            nucleo.HasServizioAggiuntivoImmobiliare = DataService.NucleoManager.HasServizioAggiuntivoImmobiliare(chiaveNucleo, true);

            long chiavePbPrincipale = nucleo.ChiaveClientePBPrincipale;
            //var privateBanker = DataService.PrivateBankerManager.RecuperaPrivateBanker(chiavePbPrincipale, true);
            var privateBanker = DataService.PrivateBankerManager.RecuperaPrivateBanker(nucleo.AgenteNucleo, nucleo.ReteNucleo, true);

            var generator = new ReportStructManager(nucleo, privateBanker);
            generator.datiSeiUnico = _datiSeiUnico;
            return generator.CreaReport_ImmobiliareMonitoraggioNucleiCU(nucleo, nucleo.ChiaviClientiPBImmobili, idImmobileCatasto, reportStruttura);

            //var cliente = DataService.ClienteManager.RecuperaCliente(chiaveCliente, true);
            //var privateBanker = DataService.PrivateBankerManager.RecuperaPrivateBanker(chiaveCliente, true);

            //var generator = new ReportStructManager(cliente, privateBanker);
            //generator.datiSeiUnico = _datiSeiUnico;
            //return generator.CreaReport_ImmobiliareMonitoraggioCU(chiaveCliente, idImmobileCatasto, reportStruttura);
        }


        /// <summary>
        /// Ottiene un array binario del PDF del report di Finalità Immobiliare di Diagnosi di ConsulenzaEvoluta per un cliente identificato con chiaveClientePb.
        /// </summary>
        /// <param name="chiaveCliente">Chiave del cliente</param>
        /// <param name="idImmobileCatasto">lista di id immobile al catasto. Corrisponde al campo chiaveProdottoTerzi della tabella ConsulenzaEvoluta.PatrimonioTerzi</param>
        /// <param name="idSezione">lista delle sezioni. Campo:IdSezione, tabella:Sezioni, database:ReportModeler2</param>  
        public byte[] CreaReport_FinalitaImmobiliare(long chiaveCliente, List<string> idImmobileCatasto, List<Int32> idSezione, bool unica)
        {
            var cliente = DataService.ClienteManager.RecuperaCliente(chiaveCliente, unica);
            var privateBanker = DataService.PrivateBankerManager.RecuperaPrivateBanker(chiaveCliente, unica);

            var generator = new ReportStructManager(cliente, privateBanker);
            return generator.CreaReport_FinalitaImmobiliare(chiaveCliente, idImmobileCatasto, idSezione, unica);
        }
        /// <summary>
        /// Ottiene un array binario del PDF del report di Immobiliare di Diagnosi di ConsulenzaEvoluta per un nucleo familiare.
        /// </summary>
        /// <param name="chiaveNucleo">Chiave del nucleo familiare</param>
        /// <param name="idImmobileCatasto">lista di id immobile al catasto. Corrisponde al campo chiaveProdottoTerzi della tabella ConsulenzaEvoluta.PatrimonioTerzi</param>
        /// <param name="chiaviClientiPb">lista di chiaveclientepb dei componenti del nucleo.</param>
        /// <param name="idSezione">lista delle sezioni. Campo:IdSezione, tabella:Sezioni, database:ReportModeler2</param>     
        public byte[] CreaReport_ImmobiliareDiagnosi_Nucleo(long chiaveNucleo, List<string> idImmobileCatasto, List<long> chiaviClientiPb, List<Int32> idSezione, bool unica)
        {
            var nucleo = DataService.NucleoManager.RecuperaNucleo(chiaveNucleo, unica);
            nucleo.HasServizioAggiuntivoImmobiliare = DataService.NucleoManager.HasServizioAggiuntivoImmobiliare(chiaveNucleo, true);
            var privateBanker = DataService.PrivateBankerManager.RecuperaPrivateBanker(nucleo.AgenteNucleo, nucleo.ReteNucleo, unica);
            
            var generator = new ReportStructManager(nucleo, privateBanker);
            return generator.CreaReport_ImmobiliareDiagnosi_Nucleo(nucleo, idImmobileCatasto, chiaviClientiPb, idSezione, unica);

        }

        /// <summary>
        /// Ottiene un array binario del PDF del report di Mappatura Preliminare (Immobiliare) per un cliente identificato con chiaveClientePb.
        /// </summary>
        /// <param name="chiaveCliente">Chiave del cliente</param>
        /// <param name="idImmobileCatasto">lista di id immobile al catasto. Corrisponde al campo chiaveProdottoTerzi della tabella ConsulenzaEvoluta.PatrimonioTerzi</param>
        /// <param name="idSezione">lista delle sezioni. Campo:IdSezione, tabella:Sezioni, database:ReportModeler2</param>  
        public byte[] CreaReport_MappaturaPreliminare(long chiaveCliente, List<string> idImmobileCatasto, List<Int32> idSezione, bool unica)
        {
            //tutto ciò per avere due report separati, con due paginazioni separate.
            var cliente = DataService.ClienteManager.RecuperaCliente(chiaveCliente, unica);
            var privateBanker = DataService.PrivateBankerManager.RecuperaPrivateBanker(chiaveCliente, unica);
            List<Int32> sezioniCliente = idSezione.Where(l => l != 135 && l != 136).ToList();
            List<Int32> sezioniPb = idSezione.Where(l => l == 135 || l == 136).ToList();
            var generatorcli = new ReportStructManager(cliente, privateBanker);
            var generatorpb = new ReportStructManager(cliente, privateBanker);
            byte[] mappaturareport;
            
            if(sezioniCliente.Count>0 && sezioniPb.Count>0)
               mappaturareport = creaMappatura(generatorcli,generatorpb, chiaveCliente,idImmobileCatasto,sezioniCliente,sezioniPb, unica);
            else{
                if( sezioniCliente.Count>0)
                    mappaturareport = generatorcli.CreaReport_MappaturaPreliminare(chiaveCliente, idImmobileCatasto, idSezione,unica);
                else
                    mappaturareport = generatorpb.CreaReport_MappaturaPreliminare(chiaveCliente, idImmobileCatasto, idSezione, unica);

            }
            return mappaturareport;
        }

        private byte[] creaMappatura(ReportStructManager cli, ReportStructManager pb, long chiaveCliente, List<string> idImmobileCatasto, List<Int32> sezioniCliente, List<Int32> sezioniPb, bool unica)
        {
            PdfDocument pdfCliente = new PdfDocument(cli.CreaReport_MappaturaPreliminare(chiaveCliente, idImmobileCatasto, sezioniCliente, unica));
            PdfDocument pdfPb = new PdfDocument(pb.CreaReport_MappaturaPreliminare(chiaveCliente, idImmobileCatasto, sezioniPb, unica));
            return MergeDocument.Merge(pdfCliente, pdfPb).Draw();
        }

        public Consulenza.DataServices.DatiSeiUnico _datiSeiUnico;

        public GeneratorService()
        {
        }

        public GeneratorService(Cliente _ClienteBatch, PrivateBanker _PBBatch)
        {
            _cliente = new Cliente
            {
                Chiave = _chiaveClientePb,
                CodiceFiscale = _ClienteBatch.CodiceFiscale,
                Cognome = _ClienteBatch.Cognome,
                Nome = _ClienteBatch.Nome,
                PartitaIva = _ClienteBatch.PartitaIva,
                DataSottoscrizioneContratto =_ClienteBatch.DataSottoscrizioneContratto,
                //TipologiaContratto = _ClienteBatch.TipologiaContratto,
                TipologiaContratto = _PBBatch.CodiceRete,
                DescrizioneProfilo = _ClienteBatch.DescrizioneProfilo,
                CodiceProfilo = _ClienteBatch.CodiceProfilo
            };

        }

        public GeneratorService(Consulenza.DataServices.DatiSeiUnico datiSeiUnico)
        {
            _datiSeiUnico = datiSeiUnico;
            if (datiSeiUnico.all().clientePB != null)
            {
                _chiaveClientePb = datiSeiUnico.all().clientePB.chiaveClientePB;
                _cliente = new Cliente
                {
                    Chiave = _chiaveClientePb,
                    CodiceFiscale = _datiSeiUnico.clienteUnit().anagrafica.codiceFiscale,
                    Cognome = _datiSeiUnico.clienteUnit().anagrafica.cognome,
                    Nome = _datiSeiUnico.clienteUnit().anagrafica.nome,
                    PartitaIva = _datiSeiUnico.clienteUnit().anagrafica.partitaIva,
                    DataSottoscrizioneContratto = _datiSeiUnico.clienteUnit().anagrafica.dtSottoscrizione,
                    TipologiaContratto = _datiSeiUnico.clienteUnit().anagrafica.contratto,
                    DescrizioneProfilo = _datiSeiUnico.clienteUnit().anagrafica.descProfiloReport,
                    CodiceProfilo = _datiSeiUnico.clienteUnit().anagrafica.codProfilo
                };
            }
            else
            {
                _chiaveClientePb = 0;
                _cliente = new Cliente
                {
                    Chiave = _datiSeiUnico.all().nucleiUnit.anagrafica.chiaveNucleo,
                    CodiceFiscale = "",
                    Cognome = _datiSeiUnico.nucleiUnit() == null ? "" : _datiSeiUnico.nucleiUnit().anagrafica.nomeNucleo,
                    Nome = "",
                    PartitaIva = "",
                    TipologiaContratto = "",
                    DescrizioneProfilo = "",
                    CodiceProfilo = 0
                };
            }

            //_privateBanker = new PrivateBanker
            //{
            //    Cap = _datiSeiUnico.all().promotoreBancario.zipCode,
            //    Citta = _datiSeiUnico.all().promotoreBancario.city,
            //    Codice = _datiSeiUnico.all().promotoreBancario.codAge,
            //    CodiceRete = _datiSeiUnico.all().promotoreBancario.network,
            //    Indirizzo = _datiSeiUnico.all().promotoreBancario.address,
            //    Livello = _datiSeiUnico.all().promotoreBancario.rank,
            //    Nominativo = string.Format("{0} {1}", _datiSeiUnico.all().promotoreBancario.surname, _datiSeiUnico.all().promotoreBancario.name),
            //    NumeroCivico = "",
            //    PrefissoTelefono = _datiSeiUnico.all().promotoreBancario.phonePrefix,
            //    Telefono = _datiSeiUnico.all().promotoreBancario.phoneNumber
            //};
        }
    }
}
