using System;
using System.Collections.Generic;
using System.Data;
using Consulenza.ReportModeler.Business.Base.Proposta;
using Consulenza.ReportWriter.Manager;
using Consulenza.ReportCommon;
using Consulenza.ReportWriter.Manager.Chapter.Entity;
using Consulenza.ReportWriter.Manager.Section.Entity;
using Consulenza.ReportWriter.Business.Entity;
using Consulenza.ReportWriter.Business;
using Consulenza.ReportWriter.Manager.Integration;
using System.Linq;
using Consulenza.ReportWriter.Business.Headers;


namespace Consulenza.ReportModeler.Manager
{
    /// <summary>
    /// Gestore di rendering della struttura del Report sul configuratore (BackOffice)
    /// e gestore della stampa delle sezioni da inserire nel documento PDF in stampa (Services di Produzione).
    /// </summary>
    public class ReportStructManager
    {
        public Consulenza.DataServices.DatiSeiUnico datiSeiUnico;
        public ReportStructManager() { }
        public virtual byte[] CreateReport_Unico(ReportStruct struttura, Consulenza.DataServices.DatiSeiUnico datiSeiUnico)
        {
            //#region idReport e idModello del report da stampare. Ogni tipologia di report avrà una logica di business diversa.

            //var reportStruct = new Business.Unica.Nucleo.ReportStructBusiness();

            //var idReport = reportStruct.GetIdReport();
            //var idModel = reportStruct.GetIdModel();

            //#endregion

            //#region Recupero la struttura del report (_reportStructure)

            //_reportStructure = GetStructure(idReport, idModel, struttura.Schede.Select(o => o.Id).ToList());

            //#endregion

            //#region Recupero le variabili di ambiente del report (_reportEnvironment)

            //_reportEnvironment = GetEnvironment(chiaveCliente, idReport, idModel, new NucleoUnica());
            //_reportEnvironment.ReportStruct = struttura;

            ////#endregion

            return Draw(struttura, datiSeiUnico);
        }
        private byte[] Draw(ReportStruct struttura, Consulenza.DataServices.DatiSeiUnico datiSeiUnico)
        {
            var reportEntities = new List<EntityBase>();

            string typeNameIntegration;
            Type typeIntegration;

            var environmentFacade = new EnvironmentFacade(_reportEnvironment);
            var writerEntities = new WriterEntities(environmentFacade);

            environmentFacade.datiSeiUnico = datiSeiUnico;

            #region Logica di Integrazione di layout

            var integrationLayoutRows = _reportStructure.Select("Integrazione_ChiaveLayout is not null");

            foreach (var itemIntegrationLayout in integrationLayoutRows)
            {
                typeNameIntegration = string.Format("{0}.{1}, Consulenza.ReportWriter.Manager", itemIntegrationLayout["Integrazione_NameSpace"], itemIntegrationLayout["Integrazione_CodiceClasse"]);
                typeIntegration = Type.GetType(typeNameIntegration);

                if (typeIntegration != null)
                {
                    //Creo l'istanza passando al costruttore la DataGeometry e recupero la nuova struttura del report. La struttura è definita dalle classi che ereditato IntegrationLayout
                    _reportStructure = ((IntegrationLayout)Activator.CreateInstance(typeIntegration, _reportStructure, itemIntegrationLayout, _reportEnvironment)).RecalculateStructure();
                }
            }

            #endregion

            var capitoloChiaveLayoutPrecedente = string.Empty;

            foreach (DataRow row in _reportStructure.Rows)
            {
                var idCapitolo = Convert.ToInt32(row["idCapitolo"]);
                var idSection = Convert.ToInt32(row["idSezione"]);
                var exist = true; // determina l'esistenza e quindi la stampa del capitolo e sezione.

                #region Integrazione Layout

                typeNameIntegration = string.Format("{0}.{1}, Consulenza.ReportWriter.Manager", row["Integrazione_NameSpace"], row["Integrazione_CodiceClasse"]);
                typeIntegration = Type.GetType(typeNameIntegration);

                var integrationLayout = row["Integrazione_ChiaveLayout"] == DBNull.Value || typeIntegration == null ? null : ((IntegrationLayout)Activator.CreateInstance(typeIntegration, _reportStructure, row, _reportEnvironment));
                var duplicazioneCapitolo = integrationLayout != null && integrationLayout.DuplicaCapitolo;

                #endregion

                #region Namespaces ConsulenzaUnica
                string desinenzaNamespace = "";
                switch (_reportEnvironment.ReportType)
                {
                    case ReportType.Unica_Diagnosi:
                        desinenzaNamespace = ".Diagnosi";
                        break;
                    case ReportType.Unica_Monitoraggio:
                        desinenzaNamespace = ".Monitoraggio";
                        break;
                    case ReportType.Unica_Proposta:
                        desinenzaNamespace = ".Proposta";
                        break;
                    case ReportType.Unica_Nucleo:
                        desinenzaNamespace = ".Nucleo";
                        break;
                }
                #endregion

                #region Capitoli

                if (capitoloChiaveLayoutPrecedente != row["Capitolo_ChiaveLayout"].ToString() || duplicazioneCapitolo)
                {
                    var typeNameChapter = string.Format("{0}.{1}, Consulenza.ReportWriter.Manager", row["Capitolo_NameSpace"] + desinenzaNamespace, row["Capitolo_CodiceClasse"]);
                    var typeChapter = Type.GetType(typeNameChapter);

                    if (typeChapter != null)
                    {
                        //Creo l'istanza passando al costruttore la DataGeometry:
                        Chapter chapther;

                        if (integrationLayout == null)
                            chapther = Activator.CreateInstance(typeChapter, environmentFacade, idCapitolo, Convert.ToBoolean(row["Capitolo_RipetiOgniPagina"])) as Chapter;
                        else
                            chapther = Activator.CreateInstance(typeChapter, environmentFacade, idCapitolo, Convert.ToBoolean(row["Capitolo_RipetiOgniPagina"]), integrationLayout) as Chapter;

                        //******* Determino l'esistenza del capitolo e sezione***********
                        exist = chapther.Exist;

                        if (chapther != null && exist)
                        {
                            // Imposto le propietà ChapterFacade
                            chapther.ChapterFacade.RepeatOnEachPage = chapther.RepeatOnEachPage;

                            //Accodo l'istanza alla collezione.
                            reportEntities.Add(chapther);
                        }
                    }
                }

                #endregion

                #region Paragrafi

                // Attualmente non è richiesta la gestione dei paragrafi

                #endregion

                #region Sezioni

                var typeNameSection = string.Format("{0}.{1}, Consulenza.ReportWriter.Manager", row["Sezione_NameSpace"] + desinenzaNamespace, row["Sezione_CodiceClasse"]);
                var typeSection = Type.GetType(typeNameSection);

                //Creo l'istanza passando al costruttore la DataGeometry:
                Section section;

                if (integrationLayout == null)
                    section = Activator.CreateInstance(typeSection, environmentFacade, idSection) as Section;
                else
                    section = Activator.CreateInstance(typeSection, environmentFacade, idSection, integrationLayout) as Section;

                if (section != null && exist)
                {
                    //Accodo l'istanza alla collezione.
                    reportEntities.Add(section);
                }

                #endregion

                capitoloChiaveLayoutPrecedente = row["Capitolo_ChiaveLayout"].ToString();
            }

            return writerEntities.RenderEntities(reportEntities);
        }

        /// <summary>
        /// Costruttore  
        /// </summary>
        /// <param name="cliente">cliente</param>
        /// <param name="privatebanker">privatebanker</param>
        public ReportStructManager(Cliente cliente, PrivateBanker privatebanker, bool propostabaseCU)
        {
            _cliente = cliente;
            _privatebanker = privatebanker;
            _propostaBaseCU = propostabaseCU;
        }
        
        /// <summary>
        /// Costruttore  
        /// </summary>
        /// <param name="cliente">cliente</param>
        /// <param name="privatebanker">privatebanker</param>
        public ReportStructManager(Cliente cliente, PrivateBanker privatebanker)
        {
            _cliente = cliente;
            _privatebanker = privatebanker;

        }


        public ReportStructManager(Cliente cliente, PrivateBanker privatebanker, Delegato privateDelegato)
        {
            _cliente = cliente;
            _privatebanker = privatebanker;
            _privateDelegato = privateDelegato;
        }


        /// <summary>
        /// Costruttore
        /// </summary>
        /// <param name="nucleo">nucleo</param>
        /// <param name="privatebanker">privatebanker</param>
        public ReportStructManager(Nucleo nucleo, PrivateBanker privatebanker)
        {
            _nucleo = nucleo;
            _privatebanker = privatebanker;
        }
        /// <summary>
        /// Imposta o recupera il booleano che indica se proposta base è per CU o CB
        /// </summary>
        private bool _propostaBaseCU;
        /// <summary>
        /// Imposta o recupera il booleano che indica se immobiliare è evoluta o CU
        /// </summary>
        private bool _immobiliareCU;
        /// <summary>
        /// Imposta o recupera il Cliente del report
        /// </summary>
        private readonly Cliente _cliente;

        /// <summary>
        /// Imposta o recupera il PrivateBanker del report
        /// </summary>
        private readonly PrivateBanker _privatebanker;


        private readonly Delegato _privateDelegato;

        /// <summary>
        /// La struttura del Report
        /// </summary>
        private DataTable _reportStructure;

        /// <summary>
        /// Gestore dell'ambiente generale di elaborazione (cliente, template, rete etc ...).
        /// </summary>
        private ReportEnvironment _reportEnvironment;

        /// <summary>
        /// Imposta o recupera le informazioni sul Nucleo
        /// </summary>
        private readonly Nucleo _nucleo;

        #region CONSULENZA BASE

        /// <summary>
        /// Converte la rappresentazione interna del Report in un array binario costituente il documento PDF del Report.
        /// </summary>
        /// <param name="chiaveCliente">chiave del cliente (ChiaveClientePB)</param>
        /// <param name="chiaveProposta">chiave della Proposta</param>
        /// <param name="reportType">tipo di report che si vuol produrre</param>        
        /// <returns></returns>
        public virtual byte[] CreateReport(long chiaveCliente, int chiaveProposta, ReportType reportType, bool unica)
        {
            #region Recupero l'idReport e idModello del report da stampare. Ogni tipologia di report avrà una logica di business diversa.
            _propostaBaseCU = unica;
            var idModel = 0;
            var idReport = 0;

          

            if (reportType == ReportType.Base_Proposta)
            {
                var reportStruct = new ReportStructBusiness();

                idReport = reportStruct.GetIdReport();
                idModel = reportStruct.GetIdModel(chiaveCliente, chiaveProposta, _propostaBaseCU);
            }

            if (idModel <= 0)
                throw new Exception("Non è stato trovato l'id del modello per il report da produrre");

            #endregion

            #region Recupero la struttura del report (_reportStructure)

            _reportStructure = GetStructure(idReport, idModel);

            #endregion


            #region lettura rappresentate legale/delegato

            
            

            
            #endregion

            #region Recupero le variabili di ambiente del report (_reportEnvironment)

            _reportEnvironment = GetEnvironment(chiaveCliente, idReport, idModel, new Proposta { Chiave = chiaveProposta, PropostaCBUnica = _propostaBaseCU });

            #endregion

            return Draw();
        }

        /// <summary>
        /// Recupera informazioni per la classe ReportEnvironment tra cui :Template del PDF da utilizzare.
        /// </summary>
        /// <param name="chiaveCliente">chiave del cliente (ChiaveClientePB)</param>
        /// <param name="idReport">id del report da stampare. Campo id del DataBase di configurazione : [ReportModeler2].[dbo].[Report]</param>
        /// <param name="idModel">id del modello da stampare. Campo id del DataBase di configurazione : [ReportModeler2].[dbo].[Modelli]</param>
        /// <param name="proposta">info sulla proposta oggetto del report</param>
        /// <returns>ReportEnvironment</returns>
        private ReportEnvironment GetEnvironment(long chiaveCliente, int idReport, int idModel, Proposta proposta)
        {
            var e = new ReportEnvironment(chiaveCliente, proposta)
            {
                Cliente = _cliente,
                PrivateBanker = _privatebanker,
                PrivateDelegato = _privateDelegato
            };

            #region Imposto il template
            switch (e.PrivateBanker.CodiceRete)
            {
                case "F":
                    e.ResourceNameCover = "RisorseEmbeddedRM.PDFTemplates.BF.proposta.cb.bf.copertina.pdf";
                    e.ResourceNameTemplate = "RisorseEmbeddedRM.PDFTemplates.BF.proposta.cb.bf.pagina.pdf";
                    break;

                case "S":
                    e.ResourceNameCover = "RisorseEmbeddedRM.PDFTemplates.SPI.proposta.cb.spi.copertina.pdf";
                    e.ResourceNameTemplate = "RisorseEmbeddedRM.PDFTemplates.SPI.proposta.cb.spi.pagina6.pdf";
                    break;

                default:
                    throw new Exception("Rete non valorizzata in Environment per PB:" + e.PrivateBanker.CodiceRete + e.PrivateBanker.Codice + " CLIENTE:" + e.Cliente.CodiceFiscale + " IDPROPOSTA:" + e.Proposta.Chiave + " CHIAVECLIENTEPB:" + chiaveCliente);
            }


            #endregion

            #region Informazioni aggiuntive sulla Proposta

            if (idModel.Equals(1))
                e.Proposta.EsitoAdeguatezza = TipologiaEsitoAdeguatezza.Adeguata;
            else if (idModel.Equals(2))
                e.Proposta.EsitoAdeguatezza = TipologiaEsitoAdeguatezza.NonAdeguata;
            #endregion

            e.ReportId = idReport;
            e.ModelId = idModel;

            return e;
        }

        #endregion

        #region IMMOBILIARE

        /// <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 virtual byte[] CreaReport_ImmobiliareDiagnosi(long chiaveCliente, List<string> idImmobileCatasto, List<Int32> idSezione, bool unica)
        {
            #region idReport e idModello del report da stampare. Ogni tipologia di report avrà una logica di business diversa.
            _immobiliareCU = unica;
            var reportStruct = new Business.Immobiliare.Diagnosi.ReportStructBusiness();

            var idReport = reportStruct.GetIdReport();
            var idModel = reportStruct.GetIdModel();

            #endregion

            #region Recupero la struttura del report (_reportStructure)

            _reportStructure = GetStructure(idReport, idModel, idSezione);

            #endregion

            #region Recupero le variabili di ambiente del report (_reportEnvironment)

            _reportEnvironment = GetEnvironment(chiaveCliente, idReport, idModel, new Immobiliare { IdImmobileCatasto = idImmobileCatasto, IdSezione = idSezione, ImmobiliareCEUnica = unica });

            #endregion

            return Draw();
        }

        public virtual byte[] CreaReport_ImmobiliareMonitoraggio(long chiaveCliente, List<string> idImmobileCatasto, List<Int32> idSezione, bool bBatch = false)
        {
            #region idReport e idModello del report da stampare. Ogni tipologia di report avrà una logica di business diversa.
            _immobiliareCU = true; // unica
            var reportStruct = new Business.Immobiliare.Monitoraggio.ReportStructBusiness();
            
            var idReport = reportStruct.GetIdReport();
            var idModel = reportStruct.GetIdModel();

            #endregion

            #region Recupero la struttura del report (_reportStructure)

            _reportStructure = GetStructure(idReport, idModel, idSezione);
            
            #endregion

            #region Recupero le variabili di ambiente del report (_reportEnvironment)

            _reportEnvironment = GetEnvironment(chiaveCliente, idReport, idModel, new MonitoraggioImmobiliare { IdImmobileCatasto = idImmobileCatasto, IdSezione = idSezione });
            
            #endregion

            return Draw(bBatch);
        }
        public virtual byte[] CreaReport_ImmobiliareMonitoraggioNuclei(Nucleo nucleo, List<long> chiaviClientiPb, List<string> idImmobileCatasto, List<Int32> idSezione)
        {
          #region idReport e idModello del report da stampare. Ogni tipologia di report avrà una logica di business diversa.
            _immobiliareCU = true;
            var reportStruct = new Business.Immobiliare.MonitoraggioNuclei.ReportStructBusiness();
            

            var idReport = reportStruct.GetIdReport();
            var idModel = reportStruct.GetIdModel();

            #endregion

            #region Recupero la struttura del report (_reportStructure)

            _reportStructure = GetStructure(idReport, idModel, idSezione);

            #endregion

            #region Recupero le variabili di ambiente del report (_reportEnvironment)

            if (idImmobileCatasto.Count > 0 && idImmobileCatasto[0] != "")
            {
                nucleo.IdImmobileCatasto = idImmobileCatasto;
                nucleo.ChiaviClientiPBImmobili = chiaviClientiPb;
            }

            nucleo.ImmobiliareCEUnica = true;
            nucleo.IdSezione = idSezione;
            _reportEnvironment = GetEnvironment(nucleo, idReport, idModel, new MonitoraggioImmobiliareNuclei { IdImmobileCatasto = idImmobileCatasto, IdSezione = idSezione });

            #endregion

            return Draw();
        }

        public virtual byte[] CreaReport_ImmobiliareMonitoraggioNucleiCU(Nucleo nucleo, List<long> chiaviClientiPb, List<string> idImmobileCatasto, ReportStruct strutturaReport)
        {
            #region idReport e idModello del report da stampare. Ogni tipologia di report avrà una logica di business diversa.
            _immobiliareCU = true;
            var reportStruct = new Business.Immobiliare.MonitoraggioNuclei.ReportStructBusiness();


            var idReport = reportStruct.GetIdReport();
            var idModel = reportStruct.GetIdModel();

            #endregion

            #region Recupero la struttura del report (_reportStructure)

            _reportStructure = GetStructure(idReport, idModel, strutturaReport.Schede.Select(o => o.Id).ToList());

            #endregion

            #region Recupero le variabili di ambiente del report (_reportEnvironment)

            if (idImmobileCatasto.Count > 0 && idImmobileCatasto[0] != "")
            {
                nucleo.IdImmobileCatasto = idImmobileCatasto;
                nucleo.ChiaviClientiPBImmobili = chiaviClientiPb;
            }

            nucleo.ImmobiliareCEUnica = true;
            nucleo.IdSezione = strutturaReport.Schede.Select(o => o.Id).ToList();
            _reportEnvironment = GetEnvironment(nucleo, idReport, idModel, new MonitoraggioImmobiliareNuclei { IdImmobileCatasto = idImmobileCatasto, IdSezione = strutturaReport.Schede.Select(o => o.Id).ToList() });

            #endregion

            return Draw();
        }



        public virtual byte[] CreaReport_ImmobiliareMonitoraggioCU(long chiaveCliente, List<string> idImmobileCatasto, ReportStruct strutturaReport)
        {
            #region idReport e idModello del report da stampare. Ogni tipologia di report avrà una logica di business diversa.
            _immobiliareCU = true; // unica
            var reportStruct = new Business.Immobiliare.Monitoraggio.ReportStructBusiness();
  
            var idReport = reportStruct.GetIdReport();
            var idModel = reportStruct.GetIdModel();

            #endregion

            #region Recupero la struttura del report (_reportStructure)

            _reportStructure = GetStructure(idReport, idModel, strutturaReport.Schede.Select(o => o.Id).ToList());

            #endregion

            #region Recupero le variabili di ambiente del report (_reportEnvironment)

            _reportEnvironment = GetEnvironment(chiaveCliente, idReport, idModel, new MonitoraggioImmobiliare { IdImmobileCatasto = idImmobileCatasto, IdSezione = strutturaReport.Schede.Select(o => o.Id).ToList() });

            #endregion

            return Draw();
        }
        /// <summary>
        /// Recupera informazioni per la classe ReportEnvironment tra cui :Template del PDF da utilizzare.
        /// </summary>
        /// <param name="chiaveCliente">chiave del cliente (ChiaveClientePB)</param>
        /// <param name="idReport">id del report da stampare. Campo id del DataBase di configurazione : [ReportModeler2].[dbo].[Report]</param>
        /// <param name="idModel">id del modello da stampare. Campo id del DataBase di configurazione : [ReportModeler2].[dbo].[Modelli]</param>
        /// <param name="immobiliare">info su immobiliare oggetto del report</param>
        /// <returns>ReportEnvironment</returns>
        private ReportEnvironment GetEnvironment(long chiaveCliente, int idReport, int idModel, Immobiliare immobiliare)
        {
            var e = new ReportEnvironment(chiaveCliente, immobiliare)
            {
                Cliente = _cliente,
                PrivateBanker = _privatebanker
            };

            #region Imposto il template
            switch (e.PrivateBanker.CodiceRete)
            {
                //case "F":
                //    e.ResourceNameCover = "RisorseEmbeddedRM.PDFTemplates.BF.immobiliare.bf.copertina.pdf";
                //    e.ResourceNameTemplate = "RisorseEmbeddedRM.PDFTemplates.BF.immobiliare.bf.pagina2.pdf";
                //    break;

                //case "S":
                //    e.ResourceNameCover = "RisorseEmbeddedRM.PDFTemplates.SPI.immobiliare.spi.copertina3.pdf";
                //    e.ResourceNameTemplate = "RisorseEmbeddedRM.PDFTemplates.SPI.immobiliare.spi.pagina2.pdf";
                //    break;
                case "F":
                    if (e.Cliente.FlagMonitoraggioImmobiliare)
                    {
                        e.ResourceNameCover = "RisorseEmbeddedRM.PDFTemplates.BF.immobiliare.bf.copertinaDiagnosiContrattualizzato.pdf";
                        e.ResourceNameTemplate = "RisorseEmbeddedRM.PDFTemplates.BF.immobiliare.bf.paginaDiagnosiContrattualizzato.pdf";
                    }
                    else
                    {
                        e.ResourceNameCover = "RisorseEmbeddedRM.PDFTemplates.BF.immobiliare.bf.copertinaDiagnosi.pdf";
                        e.ResourceNameTemplate = "RisorseEmbeddedRM.PDFTemplates.BF.immobiliare.bf.paginaDiagnosi.pdf";
                    }
                    break;

                case "S":
                    if (e.Cliente.FlagMonitoraggioImmobiliare)
                    {
                        e.ResourceNameCover = "RisorseEmbeddedRM.PDFTemplates.SPI.immobiliare.spi.copertinaDiagnosiContrattualizzato.pdf";
                        e.ResourceNameTemplate = "RisorseEmbeddedRM.PDFTemplates.SPI.immobiliare.spi.paginaDiagnosiContrattualizzato.pdf";
                    }
                    else
                    {
                        e.ResourceNameCover = "RisorseEmbeddedRM.PDFTemplates.SPI.immobiliare.spi.copertinaDiagnosi.pdf";
                        e.ResourceNameTemplate = "RisorseEmbeddedRM.PDFTemplates.SPI.immobiliare.spi.paginaDiagnosi.pdf";

                    }
                    break;

                default:
                    throw new Exception("Rete non valorizzata in Environment per PB:" + e.PrivateBanker.CodiceRete + e.PrivateBanker.Codice + " CLIENTE:" + e.Cliente.CodiceFiscale + " IDIMMOBILECATASTO:" + e.Immobiliare.IdImmobileCatasto + " CHIAVECLIENTEPB:" + chiaveCliente);
            }

            #endregion

            e.ReportId = idReport;
            e.ModelId = idModel;

            return e;
        }


        private ReportEnvironment GetEnvironment(long chiaveCliente, int idReport, int idModel, MonitoraggioImmobiliare immobiliare)
        {
            var e = new ReportEnvironment(chiaveCliente, immobiliare)
            {
                Cliente = _cliente,
                PrivateBanker = _privatebanker
            };

            #region Imposto il template
            switch (e.PrivateBanker.CodiceRete)
            {
                //case "F":
                //    e.ResourceNameCover = "RisorseEmbeddedRM.PDFTemplates.MonitoraggioImmobiliare.cover_page_f.pdf";
                //    e.ResourceNameTemplate = "RisorseEmbeddedRM.PDFTemplates.MonitoraggioImmobiliare.regular_page_f.pdf";
                //    break;

                //case "S":
                //    e.ResourceNameCover = "RisorseEmbeddedRM.PDFTemplates.MonitoraggioImmobiliare.cover_page_s.pdf";
                //    e.ResourceNameTemplate = "RisorseEmbeddedRM.PDFTemplates.MonitoraggioImmobiliare.regular_page_s.pdf";
                //    break;
                case "F":
                    if (e.Cliente.FlagMonitoraggioImmobiliare)
                    {
                        e.ResourceNameCover = "RisorseEmbeddedRM.PDFTemplates.BF.immobiliare.bf.copertinaMonitoraggioContrattualizzato.pdf";
                        e.ResourceNameTemplate = "RisorseEmbeddedRM.PDFTemplates.BF.immobiliare.bf.paginaMonitoraggioContrattualizzato.pdf";
                    }
                    else
                    {
                        e.ResourceNameCover = "RisorseEmbeddedRM.PDFTemplates.BF.immobiliare.bf.copertinaMonitoraggio.pdf";
                        e.ResourceNameTemplate = "RisorseEmbeddedRM.PDFTemplates.BF.immobiliare.bf.paginaMonitoraggio.pdf";
                    }

                    break;

                case "S":
                    if (e.Cliente.FlagMonitoraggioImmobiliare)
                    {
                        e.ResourceNameCover = "RisorseEmbeddedRM.PDFTemplates.SPI.immobiliare.spi.copertinaMonitoraggioContrattualizzato.pdf";
                        e.ResourceNameTemplate = "RisorseEmbeddedRM.PDFTemplates.SPI.immobiliare.spi.paginaMonitoraggioContrattualizzato.pdf";
                    }
                    else
                    {                           
                        e.ResourceNameCover = "RisorseEmbeddedRM.PDFTemplates.SPI.immobiliare.spi.copertinaMonitoraggio.pdf";
                        e.ResourceNameTemplate = "RisorseEmbeddedRM.PDFTemplates.SPI.immobiliare.spi.paginaMonitoraggio.pdf";
                    }
                    break;

                default:
                    throw new Exception("Rete non valorizzata in Environment per PB:" + e.PrivateBanker.CodiceRete + e.PrivateBanker.Codice + " CLIENTE:" + e.Cliente.CodiceFiscale + " IDIMMOBILECATASTO:" + e.Immobiliare.IdImmobileCatasto + " CHIAVECLIENTEPB:" + chiaveCliente);
            }

            #endregion

            e.ReportId = idReport;
            e.ModelId = idModel;

            return e;
        }

        private ReportEnvironment GetEnvironment(Nucleo nucleo, int idReport, int idModel, MonitoraggioImmobiliareNuclei immobiliareMonitoraggioNuclei)
        {
            var e = new ReportEnvironment(nucleo.ChiaveNucleo, nucleo, immobiliareMonitoraggioNuclei)
            {
                NucleoImmobiliare = nucleo,
                PrivateBanker = _privatebanker
            };
            #region Imposto il template

            switch (e.PrivateBanker.CodiceRete)
            {
                case "F":
                    if (e.NucleoImmobiliare.HasServizioAggiuntivoImmobiliare)
                    {
                        e.ResourceNameCover = "RisorseEmbeddedRM.PDFTemplates.BF.immobiliare.bf.copertinaMonitoraggioContrattualizzato.pdf";
                        e.ResourceNameTemplate = "RisorseEmbeddedRM.PDFTemplates.BF.immobiliare.bf.paginaMonitoraggioContrattualizzato.pdf";
                    }
                    else
                    {
                        e.ResourceNameCover = "RisorseEmbeddedRM.PDFTemplates.BF.immobiliare.bf.copertinaMonitoraggio.pdf";
                        e.ResourceNameTemplate = "RisorseEmbeddedRM.PDFTemplates.BF.immobiliare.bf.paginaMonitoraggio.pdf";
                    }

                    break;

                case "S":
                    if (e.NucleoImmobiliare.HasServizioAggiuntivoImmobiliare)
                    {
                        e.ResourceNameCover = "RisorseEmbeddedRM.PDFTemplates.SPI.immobiliare.spi.copertinaMonitoraggioContrattualizzato.pdf";
                        e.ResourceNameTemplate = "RisorseEmbeddedRM.PDFTemplates.SPI.immobiliare.spi.paginaMonitoraggioContrattualizzato.pdf";
                    }
                    else
                    {
                        e.ResourceNameCover = "RisorseEmbeddedRM.PDFTemplates.SPI.immobiliare.spi.copertinaMonitoraggio.pdf";
                        e.ResourceNameTemplate = "RisorseEmbeddedRM.PDFTemplates.SPI.immobiliare.spi.paginaMonitoraggio.pdf";
                    }
                    break;

                default:
                    throw new Exception("Rete non valorizzata in Environment per PB:" + e.PrivateBanker.CodiceRete + e.PrivateBanker.Codice + " CLIENTE:" + e.Cliente.CodiceFiscale + " IDIMMOBILECATASTO:" + e.Immobiliare.IdImmobileCatasto + " CHIAVECLIENTEPB:" + nucleo.ChiaveClientePBPrincipale);
            }

            #endregion

            e.ReportId = idReport;
            e.ModelId = idModel;

            return e;
        }



        /// <summary>
        /// Ottiene un array binario del PDF del report di Immobiliare di Diagnosi di ConsulenzaEvoluta per un nucleo familiare.
        /// </summary>
        /// <param name="nucleo">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 virtual byte[] CreaReport_ImmobiliareDiagnosi_Nucleo(Nucleo nucleo, List<string> idImmobileCatasto, List<long> chiaviClientiPb, List<Int32> idSezione, bool unica)
        {
            #region idReport e idModello del report da stampare. Ogni tipologia di report avrà una logica di business diversa.
            _immobiliareCU = unica;
            var reportStruct = new Business.Immobiliare.Diagnosi.Nucleo.ReportStructBusiness();

            var idReport = reportStruct.GetIdReport();
            var idModel = reportStruct.GetIdModel();

            #endregion

            #region Recupero la struttura del report (_reportStructure)

            _reportStructure = GetStructure(idReport, idModel, idSezione);

            #endregion

            #region Recupero le variabili di ambiente del report (_reportEnvironment)

            if (idImmobileCatasto.Count > 0 && idImmobileCatasto[0] != "")
            {
                nucleo.IdImmobileCatasto = idImmobileCatasto;
                nucleo.ChiaviClientiPBImmobili = chiaviClientiPb;
            }

            nucleo.ImmobiliareCEUnica = unica;
            nucleo.IdSezione = idSezione;
            _reportEnvironment = GetEnvironment(nucleo, idReport, idModel);

            #endregion

            return Draw();
        }

        /// <summary>
        /// Recupera informazioni per la classe ReportEnvironment tra cui :Template del PDF da utilizzare.
        /// </summary>
        /// <param name="nucleo"></param>
        /// <param name="idReport">id del report da stampare. Campo id del DataBase di configurazione : [ReportModeler2].[dbo].[Report]</param>
        /// <param name="idModel">id del modello da stampare. Campo id del DataBase di configurazione : [ReportModeler2].[dbo].[Modelli]</param>
        /// <returns></returns>
        private ReportEnvironment GetEnvironment(Nucleo nucleo, int idReport, int idModel)
        {
            var e = new ReportEnvironment(nucleo.ChiaveNucleo, nucleo)
            {
                NucleoImmobiliare = nucleo,
                PrivateBanker = _privatebanker
            };

            #region Imposto il template
            switch (e.PrivateBanker.CodiceRete)
            {
                case "F":
                    if (e.NucleoImmobiliare.HasServizioAggiuntivoImmobiliare)
                    {
                        e.ResourceNameCover = "RisorseEmbeddedRM.PDFTemplates.BF.immobiliare.bf.copertinaDiagnosiContrattualizzato.pdf";
                        e.ResourceNameTemplate = "RisorseEmbeddedRM.PDFTemplates.BF.immobiliare.bf.paginaDiagnosiContrattualizzato.pdf";
                        break;
                    }
                    else
                    {
                        e.ResourceNameCover = "RisorseEmbeddedRM.PDFTemplates.BF.immobiliare.bf.copertinaDiagnosi.pdf";
                        e.ResourceNameTemplate = "RisorseEmbeddedRM.PDFTemplates.BF.immobiliare.bf.paginaDiagnosi.pdf";
                        break;
                    }

                case "S":
                    if (e.NucleoImmobiliare.HasServizioAggiuntivoImmobiliare)
                    {
                        e.ResourceNameCover = "RisorseEmbeddedRM.PDFTemplates.SPI.immobiliare.spi.copertinaDiagnosiContrattualizzato.pdf";
                        e.ResourceNameTemplate = "RisorseEmbeddedRM.PDFTemplates.SPI.immobiliare.spi.paginaDiagnosiContrattualizzato.pdf";
                        break;
                    }
                    else
                    {
                        e.ResourceNameCover = "RisorseEmbeddedRM.PDFTemplates.SPI.immobiliare.spi.copertinaDiagnosi.pdf";
                        e.ResourceNameTemplate = "RisorseEmbeddedRM.PDFTemplates.SPI.immobiliare.spi.paginaDiagnosi.pdf";
                        break;
                    }

                default:
                    throw new Exception("Rete non valorizzata in Environment per PB:" + e.PrivateBanker.CodiceRete + e.PrivateBanker.Codice + " CHIAVENUCLEO: " + nucleo.ChiaveNucleo);
            }

            #endregion

            e.ReportId = idReport;
            e.ModelId = idModel;

            return e;
        }




        /// <summary>
        /// Ottiene un array binario del PDF del report di Immobiliare di Mappatura preliminare 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 virtual byte[] CreaReport_MappaturaPreliminare(long chiaveCliente, List<string> idImmobileCatasto, List<Int32> idSezione, bool unica)
        {


            #region idReport e idModello del report da stampare. Ogni tipologia di report avrà una logica di business diversa.
            _immobiliareCU = unica;
            var reportStruct = new Business.MappaturaPreliminare.ReportStructBusiness();

            var idReport = reportStruct.GetIdReport();
            var idModel = reportStruct.GetIdModel();

            #endregion

            #region Recupero la struttura del report (_reportStructure)

            _reportStructure = GetStructure(idReport, idModel, idSezione);

            #endregion

            #region Recupero le variabili di ambiente del report (_reportEnvironment)

            _reportEnvironment = GetEnvironment(chiaveCliente, idReport, idModel, new MappaturaPreliminare { IdImmobileCatasto = idImmobileCatasto, IdSezione = idSezione, ImmobiliareCEUnica = _immobiliareCU });

            #endregion

            return Draw();


        }

        /// <summary>
        /// Recupera informazioni per la classe ReportEnvironment tra cui :Template del PDF da utilizzare.
        /// </summary>
        /// <param name="chiaveCliente">chiave del cliente (ChiaveClientePB)</param>
        /// <param name="idReport">id del report da stampare. Campo id del DataBase di configurazione : [ReportModeler2].[dbo].[Report]</param>
        /// <param name="idModel">id del modello da stampare. Campo id del DataBase di configurazione : [ReportModeler2].[dbo].[Modelli]</param>
        /// <param name="immobiliare">info su immobiliare oggetto del report</param>
        /// <returns>ReportEnvironment</returns>
        private ReportEnvironment GetEnvironment(long chiaveCliente, int idReport, int idModel, MappaturaPreliminare mappatura)
        {
            var e = new ReportEnvironment(chiaveCliente, mappatura)
            {
                Cliente = _cliente,
                PrivateBanker = _privatebanker
            };

            #region Imposto il template
            switch (e.PrivateBanker.CodiceRete)
            {
                //case "F":
                //    e.ResourceNameCover = "RisorseEmbeddedRM.PDFTemplates.BF.immobiliare.mappaturapreliminare.bf.copertina2.pdf";
                //    e.ResourceNameTemplate = "RisorseEmbeddedRM.PDFTemplates.BF.immobiliare.mappaturapreliminare.bf.pagina2.pdf";
                //    break;

                //case "S":
                //    e.ResourceNameCover = "RisorseEmbeddedRM.PDFTemplates.SPI.immobiliare.mappaturapreliminare.spi.copertina3.pdf";
                //    e.ResourceNameTemplate = "RisorseEmbeddedRM.PDFTemplates.SPI.immobiliare.spi.pagina2.pdf";
                //    break;
                case "F":
                    if (e.Cliente.FlagMonitoraggioImmobiliare)
                    {
                        e.ResourceNameCover = "RisorseEmbeddedRM.PDFTemplates.BF.immobiliare.bf.copertinaMappaturaContrattualizzato.pdf";
                        e.ResourceNameTemplate = "RisorseEmbeddedRM.PDFTemplates.BF.immobiliare.bf.paginaMappaturaContrattualizzato.pdf";
                    }
                    else
                    {
                        e.ResourceNameCover = "RisorseEmbeddedRM.PDFTemplates.BF.immobiliare.bf.copertinaMappatura.pdf";
                        e.ResourceNameTemplate = "RisorseEmbeddedRM.PDFTemplates.BF.immobiliare.bf.paginaMappatura.pdf";
                    }

                    break;

                case "S":
                    if (e.Cliente.FlagMonitoraggioImmobiliare)
                    {
                        e.ResourceNameCover = "RisorseEmbeddedRM.PDFTemplates.SPI.immobiliare.spi.copertinaMappaturaContrattualizzato.pdf";
                        e.ResourceNameTemplate = "RisorseEmbeddedRM.PDFTemplates.SPI.immobiliare.spi.paginaMappaturaContrattualizzato.pdf";
                    }
                    else
                    {
                        e.ResourceNameCover = "RisorseEmbeddedRM.PDFTemplates.SPI.immobiliare.spi.copertinaMappatura.pdf";
                        e.ResourceNameTemplate = "RisorseEmbeddedRM.PDFTemplates.SPI.immobiliare.spi.paginaMappatura.pdf";
                    }
                    break;

                default:
                    throw new Exception("Rete non valorizzata in Environment per PB:" + e.PrivateBanker.CodiceRete + e.PrivateBanker.Codice + " CLIENTE:" + e.Cliente.CodiceFiscale + " IDIMMOBILECATASTO:" + e.Immobiliare.IdImmobileCatasto + " CHIAVECLIENTEPB:" + chiaveCliente);
            }

            #endregion

            e.ReportId = idReport;
            e.ModelId = idModel;

            return e;
        }

        #endregion

        #region CONSULENZA UNICA

        /// <summary>
        ///  Converte la rappresentazione interna del Report in un array binario costituente il documento PDF del Report.
        /// </summary>
        /// <param name="chiaveCliente">chiave del cliente (ChiaveClientePB)</param>
        /// <param name="struttura">struttura del report</param>
        /// <returns></returns>
        public virtual byte[] CreateReport_Diagnosi(Int64 chiaveCliente, ReportStruct struttura)
        {
            #region idReport e idModello del report da stampare. Ogni tipologia di report avrà una logica di business diversa.

            var reportStruct = new Business.Unica.Diagnosi.ReportStructBusiness();

            var idReport = reportStruct.GetIdReport();
            var idModel = reportStruct.GetIdModel();

            #endregion

            #region Recupero la struttura del report (_reportStructure)

            _reportStructure = GetStructure(idReport, idModel, struttura.Schede.Select(o => o.Id).ToList());

            #endregion

            #region Recupero le variabili di ambiente del report (_reportEnvironment)

            _reportEnvironment = GetEnvironment(chiaveCliente, idReport, idModel, new Diagnosi());
            _reportEnvironment.ReportStruct = struttura;

            #endregion

            return Draw();
        }

        /// <summary>
        /// Recupera informazioni per la classe ReportEnvironment tra cui :Template del PDF da utilizzare.
        /// </summary>
        /// <param name="chiaveCliente">chiave del cliente (ChiaveClientePB)</param>
        /// <param name="idReport">id del report da stampare. Campo id del DataBase di configurazione : [ReportModeler2].[dbo].[Report]</param>
        /// <param name="idModel">id del modello da stampare. Campo id del DataBase di configurazione : [ReportModeler2].[dbo].[Modelli]</param>
        /// <param name="diagnosi">info su diagnosi</param>
        /// <returns>ReportEnvironment</returns>
        private ReportEnvironment GetEnvironment(Int64 chiaveCliente, int idReport, int idModel, Diagnosi diagnosi)
        {
            var e = new ReportEnvironment(chiaveCliente, diagnosi)
            {
                Cliente = _cliente,
                PrivateBanker = _privatebanker
            };

            #region Imposto il template

            bool bSei = GetClienteSei(e.Cliente.TipologiaContratto.ToUpper(), e.Cliente.Chiave);
 
            switch (e.PrivateBanker.CodiceRete)
            {
                case "F":
                    e.ResourceNameCover = "RisorseEmbeddedRM.PDFTemplates.BF.Templ_copertinaBF.pdf";
                    if (bSei)
                        e.ResourceNameTemplate = "RisorseEmbeddedRM.PDFTemplates.BF.Templ_BFreport1.pdf";
                    else                        
                        e.ResourceNameTemplate = "RisorseEmbeddedRM.PDFTemplates.BF.Templ_BFreport2.pdf";
                    break;

                case "S":
                    e.ResourceNameCover = "RisorseEmbeddedRM.PDFTemplates.SPI.Templ_copertinaSPUnica.pdf";
                    if (bSei)
                        e.ResourceNameTemplate = "RisorseEmbeddedRM.PDFTemplates.SPI.Templ_SPreport3.pdf";                    
                    else
                        e.ResourceNameTemplate = "RisorseEmbeddedRM.PDFTemplates.SPI.Templ_SPreport4.pdf";
                    break;

                default:
                    throw new Exception("Rete non valorizzata in Environment per PB:" + e.PrivateBanker.CodiceRete + e.PrivateBanker.Codice + " CLIENTE:" + e.Cliente.CodiceFiscale + " IDIMMOBILECATASTO:" + e.Immobiliare.IdImmobileCatasto + " CHIAVECLIENTEPB:" + chiaveCliente);
            }


            #endregion

            e.ReportId = idReport;
            e.ModelId = idModel;

            return e;
        }




        /// <summary>
        ///  Converte la rappresentazione interna del Report in un array binario costituente il documento PDF del Report.
        /// </summary>
        /// <param name="chiaveCliente">chiave del cliente (ChiaveClientePB)</param>
        /// <param name="struttura">struttura del report</param>
        /// <returns></returns>
        public virtual byte[] CreateReport_Monitoraggio(Int64 chiaveCliente, ReportStruct struttura)
        {
            #region idReport e idModello del report da stampare. Ogni tipologia di report avrà una logica di business diversa.

            var reportStruct = new Business.Unica.Monitoraggio.ReportStructBusiness();

            var idReport = reportStruct.GetIdReport();
            var idModel = reportStruct.GetIdModel();

            #endregion

            #region Recupero la struttura del report (_reportStructure)

            _reportStructure = GetStructure(idReport, idModel, struttura.Schede.Select(o => o.Id).ToList());

            #endregion

            #region Recupero le variabili di ambiente del report (_reportEnvironment)

            _reportEnvironment = GetEnvironment(chiaveCliente, idReport, idModel, new Monitoraggio());
            _reportEnvironment.ReportStruct = struttura;

            #endregion

            return Draw();
        }

        /// <summary>
        /// Recupera informazioni per la classe ReportEnvironment tra cui :Template del PDF da utilizzare.
        /// </summary>
        /// <param name="chiaveCliente">chiave del cliente (ChiaveClientePB)</param>
        /// <param name="idReport">id del report da stampare. Campo id del DataBase di configurazione : [ReportModeler2].[dbo].[Report]</param>
        /// <param name="idModel">id del modello da stampare. Campo id del DataBase di configurazione : [ReportModeler2].[dbo].[Modelli]</param>
        /// <param name="monitoraggio">info su monitoraggio</param>
        /// <returns>ReportEnvironment</returns>
        private ReportEnvironment GetEnvironment(Int64 chiaveCliente, int idReport, int idModel, Monitoraggio monitoraggio)
        {
            var e = new ReportEnvironment(chiaveCliente, monitoraggio)
            {
                Cliente = _cliente,
                PrivateBanker = _privatebanker
            };

            #region Imposto il template

            bool bSei = GetClienteSei(e.Cliente.TipologiaContratto.ToUpper(), e.Cliente.Chiave);

            switch (e.PrivateBanker.CodiceRete)
            {
                case "F":
                    e.ResourceNameCover = "RisorseEmbeddedRM.PDFTemplates.BF.Templ_copertinaBF.pdf";
                    if (bSei)
                        e.ResourceNameTemplate = "RisorseEmbeddedRM.PDFTemplates.BF.Templ_BFreport1.pdf";
                    else
                        e.ResourceNameTemplate = "RisorseEmbeddedRM.PDFTemplates.BF.Templ_BFreport2.pdf";
                    break;

                case "S":
                    e.ResourceNameCover = "RisorseEmbeddedRM.PDFTemplates.SPI.Templ_copertinaSPUnica.pdf";
                    if (bSei)
                        e.ResourceNameTemplate = "RisorseEmbeddedRM.PDFTemplates.SPI.Templ_SPreport3.pdf";
                    else
                        e.ResourceNameTemplate = "RisorseEmbeddedRM.PDFTemplates.SPI.Templ_SPreport4.pdf";
                    break;

                default:
                    throw new Exception("Rete non valorizzata in Environment per PB:" + e.PrivateBanker.CodiceRete + e.PrivateBanker.Codice + " CLIENTE:" + e.Cliente.CodiceFiscale + " IDIMMOBILECATASTO:" + e.Immobiliare.IdImmobileCatasto + " CHIAVECLIENTEPB:" + chiaveCliente);
            }

            #endregion


            e.ReportId = idReport;
            e.ModelId = idModel;

            return e;
        }




        /// <summary>
        ///  Converte la rappresentazione interna del Report in un array binario costituente il documento PDF del Report.
        /// </summary>
        /// <param name="chiaveCliente">chiave del cliente (ChiaveClientePB)</param>
        /// <param name="struttura">struttura del report</param>
        /// <returns></returns>
        public virtual byte[] CreateReport_Proposta(Int64 chiaveCliente, ReportStruct struttura)
        {
            #region idReport e idModello del report da stampare. Ogni tipologia di report avrà una logica di business diversa.

            var reportStruct = new Business.Unica.Proposta.ReportStructBusiness();

            var idReport = reportStruct.GetIdReport();
            var idModel = reportStruct.GetIdModel();

            #endregion

            #region Recupero la struttura del report (_reportStructure)

            _reportStructure = GetStructure(idReport, idModel, struttura.Schede.Select(o => o.Id).ToList());

            #endregion

            #region Recupero le variabili di ambiente del report (_reportEnvironment)

            _reportEnvironment = GetEnvironment(chiaveCliente, idReport, idModel, new PropostaUnica(), datiSeiUnico.flagAdeguatezzaPro());
            _reportEnvironment.ReportStruct = struttura;

            #endregion

            return Draw();
        }

        /// <summary>
        /// Recupera informazioni per la classe ReportEnvironment tra cui :Template del PDF da utilizzare.
        /// </summary>
        /// <param name="chiaveCliente">chiave del cliente (ChiaveClientePB)</param>
        /// <param name="idReport">id del report da stampare. Campo id del DataBase di configurazione : [ReportModeler2].[dbo].[Report]</param>
        /// <param name="idModel">id del modello da stampare. Campo id del DataBase di configurazione : [ReportModeler2].[dbo].[Modelli]</param>
        /// <param name="proposta">info su proposta</param>
        /// <returns>ReportEnvironment</returns>
        private ReportEnvironment GetEnvironment(Int64 chiaveCliente, int idReport, int idModel, PropostaUnica proposta, bool adeguata)
        {
            var e = new ReportEnvironment(chiaveCliente, proposta, adeguata)
            {
                Cliente = _cliente,
                PrivateBanker = _privatebanker
            };

            #region Imposto il template

            bool bSei = GetClienteSei(e.Cliente.TipologiaContratto.ToUpper(), e.Cliente.Chiave);

            switch (e.PrivateBanker.CodiceRete)
            {
                case "F":
                    e.ResourceNameCover = "RisorseEmbeddedRM.PDFTemplates.BF.Templ_copertinaBF.pdf";
                    if (bSei)
                        e.ResourceNameTemplate = "RisorseEmbeddedRM.PDFTemplates.BF.Templ_BFreport1.pdf";
                    else
                        e.ResourceNameTemplate = "RisorseEmbeddedRM.PDFTemplates.BF.Templ_BFreport2.pdf";
                    break;

                case "S":
                    e.ResourceNameCover = "RisorseEmbeddedRM.PDFTemplates.SPI.Templ_copertinaSPUnica.pdf";
                    if (bSei)
                        e.ResourceNameTemplate = "RisorseEmbeddedRM.PDFTemplates.SPI.Templ_SPreport3.pdf";
                    else
                        e.ResourceNameTemplate = "RisorseEmbeddedRM.PDFTemplates.SPI.Templ_SPreport4.pdf";
                    break;

                default:
                    throw new Exception("Rete non valorizzata in Environment per PB:" + e.PrivateBanker.CodiceRete + e.PrivateBanker.Codice + " CLIENTE:" + e.Cliente.CodiceFiscale + " IDIMMOBILECATASTO:" + e.Immobiliare.IdImmobileCatasto + " CHIAVECLIENTEPB:" + chiaveCliente);
            }

            #endregion

            e.ReportId = idReport;
            e.ModelId = idModel;

            return e;
        }




        /// <summary>
        ///  Converte la rappresentazione interna del Report in un array binario costituente il documento PDF del Report.
        /// </summary>
        /// <param name="chiaveCliente">chiave del cliente (ChiaveClientePB)</param>
        /// <param name="struttura">struttura del report</param>
        /// <returns></returns>
        public virtual byte[] CreateReport_Nucleo(Int64 chiaveCliente, ReportStruct struttura)
        {
            #region idReport e idModello del report da stampare. Ogni tipologia di report avrà una logica di business diversa.

            var reportStruct = new Business.Unica.Nucleo.ReportStructBusiness();

            var idReport = reportStruct.GetIdReport();
            var idModel = reportStruct.GetIdModel();

            #endregion

            #region Recupero la struttura del report (_reportStructure)

            _reportStructure = GetStructure(idReport, idModel, struttura.Schede.Select(o => o.Id).ToList());

            #endregion

            #region Recupero le variabili di ambiente del report (_reportEnvironment)

            _reportEnvironment = GetEnvironment(chiaveCliente, idReport, idModel, new NucleoUnica());
            _reportEnvironment.ReportStruct = struttura;

            #endregion

            return Draw();
        }

        /// <summary>
        /// Recupera informazioni per la classe ReportEnvironment tra cui :Template del PDF da utilizzare.
        /// </summary>
        /// <param name="chiaveCliente">chiave del cliente (ChiaveClientePB)</param>
        /// <param name="idReport">id del report da stampare. Campo id del DataBase di configurazione : [ReportModeler2].[dbo].[Report]</param>
        /// <param name="idModel">id del modello da stampare. Campo id del DataBase di configurazione : [ReportModeler2].[dbo].[Modelli]</param>
        /// <param name="nucleo">info su nucleo</param>
        /// <returns>ReportEnvironment</returns>
        private ReportEnvironment GetEnvironment(Int64 chiaveCliente, int idReport, int idModel, NucleoUnica nucleo)
        {
            var e = new ReportEnvironment(chiaveCliente, nucleo)
            {
                Cliente = _cliente,
                PrivateBanker = _privatebanker
            };

            #region Imposto il template

            switch (e.PrivateBanker.CodiceRete)
            {
                case "F":
                    if (datiSeiUnico.flagNucleoContrattualizzato())
                    {
                        e.ResourceNameCover = "RisorseEmbeddedRM.PDFTemplates.BF.Templ_copertinaBF_NucleoContrattualizzato.pdf";
                        e.ResourceNameTemplate = "RisorseEmbeddedRM.PDFTemplates.BF.Templ_BFreport_NucleoContrattualizzato.pdf";
                        //e.ResourceNameTemplate = "RisorseEmbeddedRM.PDFTemplates.SPI.Templ_SPreport_NucleoContrattualizzato.pdf";
                    }
                    else
                    {
                    e.ResourceNameCover = "RisorseEmbeddedRM.PDFTemplates.BF.Templ_copertinaBF_Nucleo.pdf";
                    e.ResourceNameTemplate = "RisorseEmbeddedRM.PDFTemplates.BF.Templ_BFreport_Nucleo.pdf";
                    }
                    break;

                case "S":

                    if (datiSeiUnico.flagNucleoContrattualizzato())
                    {
                        e.ResourceNameCover = "RisorseEmbeddedRM.PDFTemplates.SPI.Templ_copertinaSP_NucleoContrattualizzato.pdf";
                        e.ResourceNameTemplate = "RisorseEmbeddedRM.PDFTemplates.SPI.Templ_SPreport_NucleoContrattualizzato.pdf";
                    }
                    else
                    {
                    e.ResourceNameCover = "RisorseEmbeddedRM.PDFTemplates.SPI.Templ_copertinaSP_Nucleo.pdf";
                    e.ResourceNameTemplate = "RisorseEmbeddedRM.PDFTemplates.SPI.Templ_SPreport_Nucleo.pdf";
                    }


                    break;

                default:
                    throw new Exception("Rete non valorizzata in Environment per PB:" + e.PrivateBanker.CodiceRete + e.PrivateBanker.Codice + " CLIENTE:" + e.Cliente.CodiceFiscale + " IDIMMOBILECATASTO:" + e.Immobiliare.IdImmobileCatasto + " CHIAVECLIENTEPB:" + chiaveCliente);
            }

            #endregion

            e.ReportId = idReport;
            e.ModelId = idModel;

            return e;
        }

        #endregion

        #region FINALITA' IMMOBILIARE
        /// <summary>
        /// Ottiene un array binario del PDF del report di Diagnosi di Finalità Immobiliare 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 virtual byte[] CreaReport_FinalitaImmobiliare(long chiaveCliente, List<string> idImmobileCatasto, List<Int32> idSezione, bool unica)
        {
            #region idReport e idModello del report da stampare. Ogni tipologia di report avrà una logica di business diversa.

            var reportStruct = new Business.Immobiliare.Finalita.ReportStructBusiness();
            _immobiliareCU = unica;
            var idReport = reportStruct.GetIdReport();
            var idModel = reportStruct.GetIdModel();

            #endregion

            #region Recupero la struttura del report (_reportStructure)

            _reportStructure = GetStructure(idReport, idModel, idSezione);

            #endregion

            #region Recupero le variabili di ambiente del report (_reportEnvironment)

            _reportEnvironment = GetEnvironment(chiaveCliente, idReport, idModel, new FinalitaImmobiliare { IdImmobileCatasto = idImmobileCatasto, IdSezione = idSezione, ImmobiliareCEUnica = _immobiliareCU });

            #endregion

            return Draw();
        }

        /// <summary>
        /// Recupera informazioni per la classe ReportEnvironment tra cui :Template del PDF da utilizzare.
        /// </summary>
        /// <param name="chiaveCliente">chiave del cliente (ChiaveClientePB)</param>
        /// <param name="idReport">id del report da stampare. Campo id del DataBase di configurazione : [ReportModeler2].[dbo].[Report]</param>
        /// <param name="idModel">id del modello da stampare. Campo id del DataBase di configurazione : [ReportModeler2].[dbo].[Modelli]</param>
        /// <param name="immobiliare">info su immobiliare oggetto del report</param>
        /// <returns>ReportEnvironment</returns>
        private ReportEnvironment GetEnvironment(long chiaveCliente, int idReport, int idModel, FinalitaImmobiliare finalitaimmobiliare)
        {
            var e = new ReportEnvironment(chiaveCliente, finalitaimmobiliare)
            {
                Cliente = _cliente,
                PrivateBanker = _privatebanker
            };

            #region Imposto il template
            switch (e.PrivateBanker.CodiceRete)
            {

                case "F":
                    if (e.Cliente.FlagMonitoraggioImmobiliare)
                    {
                        e.ResourceNameCover = "RisorseEmbeddedRM.PDFTemplates.BF.immobiliare.bf.copertinaDiagnosiContrattualizzato.pdf";
                        e.ResourceNameTemplate = "RisorseEmbeddedRM.PDFTemplates.BF.immobiliare.bf.paginaDiagnosiContrattualizzato.pdf";
                    }
                    else
                    {   
                        e.ResourceNameCover = "RisorseEmbeddedRM.PDFTemplates.BF.immobiliare.bf.copertinaDiagnosi.pdf";
                        e.ResourceNameTemplate = "RisorseEmbeddedRM.PDFTemplates.BF.immobiliare.bf.paginaDiagnosi.pdf";
                    }
                    break;

                case "S":
                    if (e.Cliente.FlagMonitoraggioImmobiliare)
                    {
                        e.ResourceNameCover = "RisorseEmbeddedRM.PDFTemplates.SPI.immobiliare.spi.copertinaDiagnosiContrattualizzato.pdf";
                        e.ResourceNameTemplate = "RisorseEmbeddedRM.PDFTemplates.SPI.immobiliare.spi.paginaDiagnosiContrattualizzato.pdf";
                    }
                    else
                    {
                        e.ResourceNameCover = "RisorseEmbeddedRM.PDFTemplates.SPI.immobiliare.spi.copertinaDiagnosi.pdf";
                        e.ResourceNameTemplate = "RisorseEmbeddedRM.PDFTemplates.SPI.immobiliare.spi.paginaDiagnosi.pdf";
                    }
                    break;

                default:
                    throw new Exception("Rete non valorizzata in Environment per PB:" + e.PrivateBanker.CodiceRete + e.PrivateBanker.Codice + " CLIENTE:" + e.Cliente.CodiceFiscale + " IDIMMOBILECATASTO:" + e.Immobiliare.IdImmobileCatasto + " CHIAVECLIENTEPB:" + chiaveCliente);
            }

            #endregion

            e.ReportId = idReport;
            e.ModelId = idModel;

            return e;
        }

        #endregion

        /// <summary>
        /// Recupero la struttura del report eseguendo la stored "CalcoloStrutturaDocumento" 
        /// del database di configurazione dei report [ReportModeler2] dati idReport e idModel passati in input.
        /// </summary>
        /// <param name="idReport">id del report. [ReportModeler2].[dbo].[Report]</param>
        /// <param name="idModel">id del modello [ReportModeler2].[dbo].[Modelli]</param>
        /// <returns></returns>
        private DataTable GetStructure(int idReport, int idModel)
        {
            var parametri = new List<Parametro>
            {
                new Parametro
                {
                    Direction = ParameterDirection.Input,
                    DbType = DbType.Int32,
                    ParameterName = "IdReport",
                    Value = idReport
                },
                new Parametro
                {
                    Direction = ParameterDirection.Input,
                    DbType = DbType.Int32,
                    ParameterName = "IdModello",
                    Value = idModel
                }
            };

            #region Definizione dei parametri

            #endregion

            return DataAccess.ExecuteDataTableStoredProcedure(DBProvider.SqlServerReportModeler, "CalcoloStrutturaDocumento", parametri);
        }

        /// <summary>
        /// Recupero la struttura del report eseguendo la stored "CalcoloStrutturaDocumento" 
        /// del database di configurazione dei report [ReportModeler2] dati idReport e idModel passati in input,
        /// filtrando e ordinando per idSectionList.
        /// </summary>
        /// <param name="idReport">id del report. [ReportModeler2].[dbo].[Report]</param>
        /// <param name="idModel">id del modello [ReportModeler2].[dbo].[Modelli]</param>
        /// <param name="idSectionList">lista delle sezioni da stampare.</param>
        private DataTable GetStructure(int idReport, int idModel, List<int> idSectionList)
        {
            //Filtro e ordino solo le Schede(idSezione) selezionate e passate in input
            var structure = GetStructure(idReport, idModel);

            // Ordinamento: l'ordine è quello si selezione delle schede.
            structure.Columns.Add("Ordine", typeof(Int32));

            /****** FIX 13-05-2020 Quote Variate, non da mostrare per tutti, per futura revisione del processo - Pino **************/
            //idSectionList.Remove(229);
            //idSectionList.Remove(230);
            //DataRow[] drr = structure.Select("Capitolo_CodiceClasse='S22'");
            //foreach (DataRow row in structure.Rows)
            //{
            //    if (row["Capitolo_CodiceClasse"].ToString() == "S22")
            //    {
            //        idSectionList.Remove((int)row["idSezione"]);
            //        structure.Rows.Remove(row);
            //        break;
            //    }
            //}
            /***********************************************************************************************************************/


            var ordine = 1;
            foreach (var sezione in idSectionList)
            {
                //recupero la riga tramite l'idSezione
                structure.AsEnumerable().SingleOrDefault(r => r.Field<Int32>("IdSezione") == sezione)["Ordine"] = ordine;
                ordine++;
            }

            // Filtro.
            var query = from st in structure.AsEnumerable()
                        where idSectionList.Contains(st.Field<Int32>("IdSezione"))
                        orderby st.Field<Int32>("Ordine")
                        select st;

            // Ritorno la struttura
            return query.AsDataView().ToTable();
        }

        /// <summary>
        /// Instanzia WriterEntities (passando Environment) e ritorna l'array binario del Report (costituito dalle sezioni).
        /// </summary>
        /// <returns></returns>
        private byte[] Draw(bool bBatch = false)
        {
            var reportEntities = new List<EntityBase>();

            string typeNameIntegration;
            Type typeIntegration;

            var environmentFacade = new EnvironmentFacade(_reportEnvironment);
            var writerEntities = new WriterEntities(environmentFacade);

            environmentFacade.datiSeiUnico = datiSeiUnico;

            #region Logica di Integrazione di layout

            var integrationLayoutRows = _reportStructure.Select("Integrazione_ChiaveLayout is not null");

            foreach (var itemIntegrationLayout in integrationLayoutRows)
            {
                typeNameIntegration = string.Format("{0}.{1}, Consulenza.ReportWriter.Manager", itemIntegrationLayout["Integrazione_NameSpace"], itemIntegrationLayout["Integrazione_CodiceClasse"]);
                typeIntegration = Type.GetType(typeNameIntegration);

                if (typeIntegration != null)
                {
                    //Creo l'istanza passando al costruttore la DataGeometry e recupero la nuova struttura del report. La struttura è definita dalle classi che ereditato IntegrationLayout
                    _reportStructure = ((IntegrationLayout)Activator.CreateInstance(typeIntegration, _reportStructure, itemIntegrationLayout, _reportEnvironment)).RecalculateStructure();
                }
            }

            #endregion

            var capitoloChiaveLayoutPrecedente = string.Empty;
            if (_reportEnvironment.ReportType == ReportType.Immobiliare_Monitoraggio || _reportEnvironment.ReportType == ReportType.Immobiliare_MonitoraggioNuclei)
            {
                List<int> allSectionsIds = _reportStructure.Rows.OfType<DataRow>().Select(x => (int)x.ItemArray[3]).ToList();
                MonitoraggioImmobiliarePageHeaderManager.AllSections = allSectionsIds;

                //TODo 
                //creare classe MonitoraggioImmobiliareNucleiPageHeaderManager
                //MonitoraggioImmobiliarePageHeaderManager.AllSections = allSectionsIds;

            }

            // News ES 20180315 per Ticket Kostaris
            DataSet dsOriginal = null;
            if (_reportEnvironment.ReportType == ReportType.Immobiliare_MappaturaPreliminare)
            {
                #region Definizione dei parametri

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

                #endregion

                dsOriginal = _reportEnvironment.MappaturaPreliminare.ImmobiliareCEUnica ? DataAccess.ExecuteDataSetStoredProcedure(DBProvider.SqlServerConsulenzaUnica, "REP_MappaturaPreliminare_S7_DettaglioAbitazioneTotale", parametri)
                    : DataAccess.ExecuteDataSetStoredProcedure(DBProvider.SqlServerConsulenzaEvoluta, "REP_MappaturaPreliminare_S7_DettaglioAbitazioneTotale", parametri);
                if (dsOriginal.Tables[0].Rows.Count == 0) return null;
            }

            //
            int iRow = 0;
            foreach (DataRow row in _reportStructure.Rows)
            {
                var idCapitolo = Convert.ToInt32(row["idCapitolo"]);
                var idSection = Convert.ToInt32(row["idSezione"]);
                var exist = true; // determina l'esistenza e quindi la stampa del capitolo e sezione.
                
                #region Integrazione Layout

                typeNameIntegration = string.Format("{0}.{1}, Consulenza.ReportWriter.Manager", row["Integrazione_NameSpace"], row["Integrazione_CodiceClasse"]);
                typeIntegration = Type.GetType(typeNameIntegration);

                var integrationLayout = row["Integrazione_ChiaveLayout"] == DBNull.Value || typeIntegration == null ? null : ((IntegrationLayout)Activator.CreateInstance(typeIntegration, _reportStructure, row, _reportEnvironment));
                var duplicazioneCapitolo = integrationLayout != null && integrationLayout.DuplicaCapitolo;

                #endregion

                #region Namespaces ConsulenzaUnica
                string desinenzaNamespace = "";
                switch (_reportEnvironment.ReportType)
                {
                    case ReportType.Unica_Diagnosi:
                        desinenzaNamespace = ".Diagnosi";
                        break;
                    case ReportType.Unica_Monitoraggio:
                        desinenzaNamespace = ".Monitoraggio";
                        break;
                    case ReportType.Unica_Proposta:
                        desinenzaNamespace = ".Proposta";
                        break;
                    case ReportType.Unica_Nucleo:
                        desinenzaNamespace = ".Nucleo";
                        break;
                }
                #endregion

                #region Capitoli

                if (capitoloChiaveLayoutPrecedente != row["Capitolo_ChiaveLayout"].ToString() || duplicazioneCapitolo)
                {
                    var typeNameChapter = string.Format("{0}.{1}, Consulenza.ReportWriter.Manager", row["Capitolo_NameSpace"] + desinenzaNamespace, row["Capitolo_CodiceClasse"]);
                    var typeChapter = Type.GetType(typeNameChapter);

                    if (typeChapter != null)
                    {
                        //Creo l'istanza passando al costruttore la DataGeometry:
                        Chapter chapther;

                        if (integrationLayout == null)
                            chapther = Activator.CreateInstance(typeChapter, environmentFacade, idCapitolo, Convert.ToBoolean(row["Capitolo_RipetiOgniPagina"])) as Chapter;
                        else
                        { 
                            integrationLayout.iRow = iRow;
                            chapther = Activator.CreateInstance(typeChapter, environmentFacade, idCapitolo, Convert.ToBoolean(row["Capitolo_RipetiOgniPagina"]), integrationLayout) as Chapter;
                            iRow = iRow + 1;
                        }
                        

                        //******* Determino l'esistenza del capitolo e sezione***********
                        exist = chapther.Exist;

                        if (chapther != null && exist)
                        {
                            // Imposto le propietà ChapterFacade
                            chapther.ChapterFacade.RepeatOnEachPage = chapther.RepeatOnEachPage;

                            //Accodo l'istanza alla collezione.
                            reportEntities.Add(chapther);
                        }
                    }
                }

                #endregion

                #region Paragrafi

                // Attualmente non è richiesta la gestione dei paragrafi

                #endregion

                #region Sezioni
                 var typeNameSection = "";
                if  (_reportEnvironment.ReportType == ReportType.Base_Proposta)
                           typeNameSection = string.Format("{0}.{1}, Consulenza.ReportWriter.Manager", row["Sezione_NameSpace"] + desinenzaNamespace, row["Sezione_CodiceClasse"]);
                else
                    typeNameSection = string.Format("{0}.{1}, Consulenza.ReportWriter.Manager", row["Sezione_NameSpace"] + desinenzaNamespace, row["Sezione_CodiceClasse"].ToString().ToUpper());                

                var typeSection = Type.GetType(typeNameSection);    
               /*
                var typeNameSection = string.Format("{0}.{1}, Consulenza.ReportWriter.Manager", row["Sezione_NameSpace"] + desinenzaNamespace, row["Sezione_CodiceClasse"].ToString().ToUpper());
                var typeSection = Type.GetType(typeNameSection);
               */
                //Creo l'istanza passando al costruttore la DataGeometry:
                Section section;

                if (integrationLayout == null)
                {
                    if (idSection == 223 && bBatch)
                        section = Activator.CreateInstance(typeSection, environmentFacade, 999) as Section;
                    else
                    {
                        if (idSection == 222 && bBatch)
                            section = Activator.CreateInstance(typeSection, environmentFacade, 999) as Section;
                        else 
                        { 
                            if (idSection == 201 && bBatch)
                                section = Activator.CreateInstance(typeSection, environmentFacade, 999) as Section;
                            else
                                section = Activator.CreateInstance(typeSection, environmentFacade, idSection) as Section;

                        }
                    }
                }
                else
                { 
                    if (_reportEnvironment.ReportType == ReportType.Immobiliare_MappaturaPreliminare)
                        integrationLayout.ReportDs = dsOriginal;

                    section = Activator.CreateInstance(typeSection, environmentFacade, idSection, integrationLayout) as Section;
                }

                if (section != null && exist)
                {
                    //Accodo l'istanza alla collezione.
                    reportEntities.Add(section);
                }
                #endregion

                capitoloChiaveLayoutPrecedente = row["Capitolo_ChiaveLayout"].ToString();
            }

            return writerEntities.RenderEntities(reportEntities);
        }

        private bool GetClienteSei(string pStatoContratto, long chiave)
        {

            DataTable dtOriginal = null;

            dtOriginal = DataAccess.ExecuteDataTableSqlStatement(DBProvider.SqlServerConsulenzaUnica, "Select chiaveTipoContratto from DStatoContratto where UPPER(statoContratto) = '" + pStatoContratto + "'", null);
            if (dtOriginal.Rows.Count > 0 && Convert.ToInt16(dtOriginal.Rows[0][0]) == 2) {
                DataTable dtSospeso = null;
                dtSospeso = DataAccess.ExecuteDataTableSqlStatement(DBProvider.SqlServerConsulenzaUnica, "Select flagRfaMinus from DettaglioClientePB where chiaveClientePB = '" + chiave + "'", null);
                if (dtSospeso.Rows.Count > 0 && !DBNull.Value.Equals(dtSospeso.Rows[0][0]) && Convert.ToBoolean(dtSospeso.Rows[0][0])){//è sospeso si comporta come base+ 
                    return false;
                }
                else { 
                    return true;
                }
            }
            else {
                return false;
            }
        }

    }
}
