using ceTe.DynamicPDF;
using ceTe.DynamicPDF.Text;
using System;


namespace Consulenza.ReportCommon
{
    /// <summary>
    /// Gestore variabili d'ambiente del Report (Template, rete etc...) e repository delle variabili di chiamata
    /// iniziale risolte dal livello Services.
    /// </summary>
    public class ReportEnvironment
    {

        private readonly ReportType _reportType;
        private FontFamily _fontfamily;
        public FontFamily FontFamily { get { return _fontfamily ?? (_fontfamily = GetFontFamily()); } }
        private ReportStruct _reportstruct = new ReportStruct();


        private Cliente _cliente = new Cliente();
        private PrivateBanker _privatebanker = new PrivateBanker();
        private Delegato _privateDelegato = new Delegato();

        private Proposta _proposta = new Proposta();

        #region consulenza unica

        private Diagnosi _diagnosi = new Diagnosi();
        private Monitoraggio _monitoraggio = new Monitoraggio();
        private NucleoUnica _nucleounica = new NucleoUnica();
        private PropostaUnica _propostaunica = new PropostaUnica();

        #endregion

        private Immobiliare _immobiliare = new Immobiliare();
        private Nucleo _nucleoimmobiliare = new Nucleo();
        private MappaturaPreliminare _mappaturapreliminare = new MappaturaPreliminare();
        private FinalitaImmobiliare _finalitaimmobiliare = new FinalitaImmobiliare();
        private MonitoraggioImmobiliare _monitoraggioimmobiliare = new MonitoraggioImmobiliare();
        private MonitoraggioImmobiliareNuclei _monitoraggioimmobiliarenuclei = new MonitoraggioImmobiliareNuclei();

        public bool Adeguata = false;
        /// <summary>
        /// Imposta o recupera il tipo di report.
        /// </summary>
        public ReportType ReportType { get { return _reportType; } }

        /// <summary>
        /// Imposta o recupera la struttura del report. E' il legame con la parte di "frontend"
        /// </summary>
        public ReportStruct ReportStruct
        {
            get { return _reportstruct; }
            set { _reportstruct = value; }
        }

        /// <summary>
        /// Imposta o recupera l'Id del modello da stampare
        /// </summary>
        public int ModelId { get; set; }

        /// <summary>
        /// Imposta o recupera l'Id del report da stampare
        /// </summary>
        public int ReportId { get; set; }

        /// <summary>
        /// Imposta o recupera il nome nella libreria RisorseEmbedded per il template di ciascuna pagina del report.
        /// </summary>
        public string ResourceNameTemplate { get; set; }

        /// <summary>
        /// Imposta o recupera il nome nella libreria RisorseEmbedded per il template per la copertina del report.
        /// </summary>
        public string ResourceNameCover { get; set; }

        /// <summary>
        /// Imposta o recupera le informazioni relative al Cliente.
        /// </summary>
        public Cliente Cliente
        {
            get { return _cliente; }
            set { _cliente = value; }
        }

        /// <summary>
        /// Imposta o recupera le informazioni relative al PrivateBanker.
        /// </summary>
        public PrivateBanker PrivateBanker
        {
            get { return _privatebanker; }
            set { _privatebanker = value; }
        }


        public Delegato PrivateDelegato
        {
            get { return _privateDelegato; }
            set { _privateDelegato = value; }
        }

        /// <summary>
        /// Imposta o recupera le informazioni relative alla Proposta.
        /// </summary>
        public Proposta Proposta
        {
            get { return _proposta; }
            set { _proposta = value; }
        }

        /// <summary>
        /// Imposta o recupera le informazioni relative a Diagnosi.
        /// </summary>
        public Diagnosi Diagnosi
        {
            get { return _diagnosi; }
            set { _diagnosi = value; }
        }
        /// <summary>
        /// Imposta o recupera le informazioni relative a Diagnosi.
        /// </summary>
        public Monitoraggio Monitoraggio
        {
            get { return _monitoraggio; }
            set { _monitoraggio = value; }
        }
        /// <summary>
        /// Imposta o recupera le informazioni relative a Diagnosi.
        /// </summary>
        public NucleoUnica NucleoUnica
        {
            get { return _nucleounica; }
            set { _nucleounica = value; }
        }
        /// <summary>
        /// Imposta o recupera le informazioni relative a Diagnosi.
        /// </summary>
        public PropostaUnica PropostaUnica
        {
            get { return _propostaunica; }
            set { _propostaunica = value; }
        }


        public MonitoraggioImmobiliare MonitoraggioImmobiliare
        {
            get { return _monitoraggioimmobiliare; }
            set { _monitoraggioimmobiliare = value; }
        }

        public MonitoraggioImmobiliareNuclei MonitoraggioImmobiliareNuclei
        {
            get { return _monitoraggioimmobiliarenuclei; }
            set { _monitoraggioimmobiliarenuclei = value; }
        }

        /// <summary>
        /// Imposta o recupera le informazioni relative all' Immobiliare.
        /// </summary>
        public Immobiliare Immobiliare
        {
            get { return _immobiliare; }
            set { _immobiliare = value; }
        }

        /// <summary>
        /// Imposta o recupera le informazioni relative al nucleo Immobiliare.
        /// </summary>
        public Nucleo NucleoImmobiliare
        {
            get { return _nucleoimmobiliare; }
            set { _nucleoimmobiliare = value; }
        }

        /// <summary>
        /// Imposta o recupera le informazioni relative alla Mappatura preliminare del patrimonio Immobiliare.
        /// </summary>
        public MappaturaPreliminare MappaturaPreliminare
        {
            get { return _mappaturapreliminare; }
            set { _mappaturapreliminare = value; }
        }

        /// <summary>
        /// Imposta o recupera le informazioni relative alla Finalità del patrimonio Immobiliare.
        /// </summary>
        public FinalitaImmobiliare FinalitaImmobiliare

        {
            get { return _finalitaimmobiliare; }
            set { _finalitaimmobiliare = value; }
        }

        /// <summary>
        /// Costruttore.
        /// </summary>
        /// <param name="chiaveCliente">Chiave del cliente</param>
        /// <param name="reportType">Tipo di report</param>
        /// <param name="proposta">Proposta</param>
        /// <param name="immobiliare">Immobiliare</param>
        public ReportEnvironment(Int64 chiaveCliente, Proposta proposta)
        {
            _cliente.Chiave = chiaveCliente;

            if (proposta != null)
            {
                _proposta.Chiave = proposta.Chiave;
                _proposta.PropostaCBUnica = proposta.PropostaCBUnica;
            }


            _reportType = ReportType.Base_Proposta;
        }


        /// <summary>
        /// Costruttore.
        /// </summary>
        /// <param name="chiaveCliente">Chiave del cliente</param>
        /// <param name="reportType">Tipo di report</param>
        /// <param name="proposta">Proposta</param>
        /// <param name="immobiliare">Immobiliare</param>
        public ReportEnvironment(Int64 chiaveCliente, MonitoraggioImmobiliare monitoraggioImmobiliare)
        {
            _cliente.Chiave = chiaveCliente;
            _reportType = ReportType.Immobiliare_Monitoraggio;
        }


        public ReportEnvironment(Int64 chiaveNucleo, Nucleo nucleoimmobiliare, MonitoraggioImmobiliareNuclei monitoraggioImmobiliareNuclei)
        {
            _cliente.Chiave = chiaveNucleo; ;
            _reportType = ReportType.Immobiliare_MonitoraggioNuclei;


            if (nucleoimmobiliare.IdImmobileCatasto != null)
            {
                _nucleoimmobiliare.IdImmobileCatasto = nucleoimmobiliare.IdImmobileCatasto;
                
            }


        }
        /// <summary>
        /// Costruttore
        /// </summary>
        /// <param name="chiaveCliente"></param>
        /// <param name="immobiliare"></param>
        public ReportEnvironment(Int64 chiaveCliente, Immobiliare immobiliare)
        {
            _cliente.Chiave = chiaveCliente;

            if (immobiliare != null)
            {
                _immobiliare.IdImmobileCatasto = immobiliare.IdImmobileCatasto;
                _immobiliare.IdSezione = immobiliare.IdSezione;
                _immobiliare.ImmobiliareCEUnica = immobiliare.ImmobiliareCEUnica;
            }

            _reportType = ReportType.Immobiliare_Diagnosi;
        }

        /// <summary>
        /// Costruttore
        /// </summary>
        /// <param name="chiaveCliente"></param>
        /// <param name="immobiliare"></param>
        public ReportEnvironment(Int64 chiaveCliente, FinalitaImmobiliare finalitaimmobiliare)
        {
            _cliente.Chiave = chiaveCliente;

            if (finalitaimmobiliare != null)
            {
                _finalitaimmobiliare.IdImmobileCatasto = finalitaimmobiliare.IdImmobileCatasto;
                _finalitaimmobiliare.IdSezione = finalitaimmobiliare.IdSezione;
                _finalitaimmobiliare.ImmobiliareCEUnica = finalitaimmobiliare.ImmobiliareCEUnica;
            }

            _reportType = ReportType.Immobiliare_Finalita;
        }

        /// <summary>
        /// Costruttore
        /// </summary>
        /// <param name="chiaveNucleo"></param>
        /// <param name="nucleoimmobiliare"></param>
        public ReportEnvironment(Int64 chiaveNucleo, Nucleo nucleoimmobiliare)
        {
            // _cliente.Chiave = chiaveCliente;
            _nucleoimmobiliare.ChiaveNucleo = chiaveNucleo;
            _nucleoimmobiliare.NomeNucleo = nucleoimmobiliare.NomeNucleo;
            if (nucleoimmobiliare.IdImmobileCatasto != null)
            {
                _nucleoimmobiliare.IdImmobileCatasto = nucleoimmobiliare.IdImmobileCatasto;
                _nucleoimmobiliare.ImmobiliareCEUnica = nucleoimmobiliare.ImmobiliareCEUnica;
            }
            //if (nucleoimmobiliare.ChiaviClientiPBImmobili != null)
            //    _nucleo.ChiaviClientiPBImmobili = nucleoimmobiliare.ChiaviClientiPBImmobili;

            _reportType = ReportType.Immobiliare_DiagnosiNucleo;
        }
        /// <summary>
        /// Costruttore
        /// </summary>
        /// <param name="chiaveCliente"></param>
        /// <param name="immobiliare"></param>
        public ReportEnvironment(Int64 chiaveCliente, MappaturaPreliminare mappatura)
        {
            _cliente.Chiave = chiaveCliente;

            if (mappatura != null)
            {
                _mappaturapreliminare.IdImmobileCatasto = mappatura.IdImmobileCatasto;
                _mappaturapreliminare.IdSezione = mappatura.IdSezione;
                _mappaturapreliminare.ImmobiliareCEUnica = mappatura.ImmobiliareCEUnica;
            }

            _reportType = ReportType.Immobiliare_MappaturaPreliminare;
        }

        /// <summary>
        /// Costruttore
        /// </summary>
        /// <param name="chiaveCliente"></param>
        /// <param name="struttura"></param>
        public ReportEnvironment(Int64 chiaveCliente, Diagnosi diagnosi)
        {
            _cliente.Chiave = chiaveCliente;
            _reportType = ReportType.Unica_Diagnosi;
        }
        /// <summary>
        /// Costruttore
        /// </summary>
        /// <param name="chiaveCliente"></param>
        /// <param name="struttura"></param>
        public ReportEnvironment(Int64 chiaveCliente, Monitoraggio monitoraggio)
        {
            _cliente.Chiave = chiaveCliente;
            _reportType = ReportType.Unica_Monitoraggio;
        }
        /// <summary>
        /// Costruttore
        /// </summary>
        /// <param name="chiaveCliente"></param>
        /// <param name="struttura"></param>
        public ReportEnvironment(Int64 chiaveCliente, PropostaUnica propostaunica, bool adeguata)
        {
            _cliente.Chiave = chiaveCliente;
            _reportType = ReportType.Unica_Proposta;
            Adeguata = adeguata;
        }
        /// <summary>
        /// Costruttore
        /// </summary>
        /// <param name="chiaveCliente"></param>
        /// <param name="struttura"></param>
        public ReportEnvironment(Int64 chiaveCliente, NucleoUnica nucleounica)
        {
            _cliente.Chiave = chiaveCliente;
            _reportType = ReportType.Unica_Nucleo;
        }
        /// <summary>
        /// Recupera il FontFamily.
        /// </summary>
        /// <returns></returns>
        private FontFamily GetFontFamily()
        {
            var regular = _reportType == ReportType.Base_Proposta ? new OpenTypeFont("arial.TTF") : new OpenTypeFont("verdana.TTF");
            var bold = _reportType == ReportType.Base_Proposta ? new OpenTypeFont("arialbd.TTF") : new OpenTypeFont("verdanab.TTF");
            var boldItalic = _reportType == ReportType.Base_Proposta ? new OpenTypeFont("arialbi.TTF") : new OpenTypeFont("verdanaz.TTF");
            var italic = _reportType == ReportType.Base_Proposta ? new OpenTypeFont("ariali.TTF") : new OpenTypeFont("verdanai.TTF");
            var fontFamily = new FontFamily("FontFamily", regular, bold, italic, boldItalic);
            //var regular = _reportType == ReportType.ConsulenzaEvolutaImmobiliare ? new OpenTypeFont("verdana.TTF") : new OpenTypeFont("arial.TTF");
            //var bold = _reportType == ReportType.ConsulenzaEvolutaImmobiliare ? new OpenTypeFont("verdanab.TTF") : new OpenTypeFont("arialbd.TTF");
            //var boldItalic = _reportType == ReportType.ConsulenzaEvolutaImmobiliare ? new OpenTypeFont("verdanaz.TTF") : new OpenTypeFont("arialbi.TTF");
            //var italic = _reportType == ReportType.ConsulenzaEvolutaImmobiliare ? new OpenTypeFont("verdanai.TTF") : new OpenTypeFont("ariali.TTF");
            //var fontFamily = new FontFamily("FontFamily", regular, bold, italic, boldItalic);

            return fontFamily;
        }
    }
}
