using DataAccessLayer;
using PDFGenerator.BusinessLayer.DataSection;
using System;
using System.Collections.Generic;
using System.Data;
using System.Globalization;
using System.Linq;
using System.Text;

namespace PDFGenerator.BusinessLayer
{
    public class DataThreadModel : ICloneable
    {
        #region private members

        private string _rete;
        private string _nomeRete;
        private string _agente;
        private string _cognomeAgente;
        private string _nomeAgente;
        private string _indirizzoAgente;
        private string _capAgente;
        private string _cittaAgente;
        private string _telefonoAgente;
        private string _codiceFiscale;
        private string _cognomeCliente;
        private string _nomeCliente;
        private string _tipoReport;
        private string _dataLotto;
        private bool _profiloIsAct;
        private List<ReportType> _reportsType;
        private String _intermediario;
        private String _area;
        private String _areaestesa;
        private String _progetto;
        private int _idReportPDFDiagnosi;
        private int _idReportPDFMonitoraggio;
        private decimal _patrimoniocomplessivototalectv;
        private decimal _patrimoniofinanziarioctv;
        private decimal _patrimoniobancafideuramctv;
        private decimal _patrimoniobancafideuramctvalnettocontocorrente;
        private decimal _patrimonioterzictv;
        private decimal _patrimonioterzicontocorrente;
        private decimal _patrimonioterzictvalnettocontocorrente;
        private decimal _patrimonioimmobiliarectv;
        private decimal _patrimonioaltroctv;
        private decimal _contoCorrente;
        private decimal _partiteviaggiantiinvestimento;
        private decimal _partiteviaggiantidisinvestimento;
        private decimal _patrimonioNonRappresentabile;
        private decimal _risorseNonAssociate;
        private int _numeroIntermediari;
        private bool adesioneSuccessivaAvanzato;
        private bool generaDiagnosi;

        private decimal _totaleS6;
        private decimal _totaleS57;

        private DataTable _pesopercentuale;
        private DataTable _rischiorelativo;
        private DataTable _controvaloritotali;
        private DateTime _datafinetrimestrecorrente;
        private bool periodico;

        private DocumentPDF _documentPDF;
        private string _CodiceContratto;
        //private string _NomeFileReport;
        private DataSectionResult _data;
        private SezioneReport _sezioneReport;
        private decimal _varrisorsenonassociate;
        private decimal _coperturarisorsenonassociate;
        private decimal _vartotalerisorsefinanziarie;
        private decimal _coperturatotalerisorsefinanziarie;

        private DataTable _schema;
        private decimal _totalNegativeCurrentAccountValue;
        private decimal _totalSelfNegCurrentAccountValue;

        private string _ultimaSezioneStampata;

        private DataAccessDE dataAccess;
        
        #endregion

        #region public members
        public int NumeroIntermediari
        {
            get { return _numeroIntermediari; }
            set { _numeroIntermediari = value; }
        }

        /// <summary>
        /// Imposta o recupera il controvalore totale delle risorse non associate.
        /// </summary>
        public decimal RisorseNonAssociate
        {
            get { return _risorseNonAssociate; }
            set { _risorseNonAssociate = value; }
        }

        public decimal TotaleS57
        {
            get { return _totaleS57; }
            set { _totaleS57 = value; }
        }

        public decimal TotaleS6
        {
            get { return _totaleS6; }
            set { _totaleS6 = value; }
        }

        /// <summary>
        /// Imposta o recupera un indicatore booleano che indica se va generato anche il report di DIAGNOSI per la fase2.
        /// </summary>
        public bool GeneraDiagnosi
        {
            get { return generaDiagnosi; }
            set { generaDiagnosi = value; }
        }

        /// <summary>
        /// Imposta o recupera il nome del progetto d'investimento.
        /// </summary>
        public String Progetto
        {
            get { return _progetto; }
            set { _progetto = value; }
        }

        public bool profiloIsAct
        {
            get { return _profiloIsAct; }
            set { _profiloIsAct = value; }
        }

        /// <summary>
        /// Imposta o recupera il controvalore del PatrimonioNonRappresentabile
        /// </summary>
        public decimal PatrimonioNonRappresentabile
        {
            get { return _patrimonioNonRappresentabile; }
            set { _patrimonioNonRappresentabile = value; }
        }

        /// <summary>
        /// Imposta o recupera la somma delle Partite Viaggianti in investimento.
        /// </summary>
        public decimal PartiteViaggiantiInvestimento
        {
            get { return _partiteviaggiantiinvestimento; }
            set { _partiteviaggiantiinvestimento = value; }
        }

        /// <summary>
        /// Imposta o recupera la somma delle Partite Viaggianti in disinvestimento.
        /// </summary>
        public decimal PartiteViaggiantiDisinvestimento
        {
            get { return _partiteviaggiantidisinvestimento; }
            set { _partiteviaggiantidisinvestimento = value; }
        }

        /// <summary>
        /// Imposta o recupera il controvalore del Conto corrente.
        /// </summary>
        public decimal ContoCorrente
        {
            get { return _contoCorrente; }
            set { _contoCorrente = value; }
        }

        public decimal Patrimonioaltroctv
        {
            get { return _patrimonioaltroctv; }
            set { _patrimonioaltroctv = value; }
        }

        /// <summary>
        /// Imposta o recupera il controvalore immobiliare totale.
        /// </summary>
        public decimal Patrimonioimmobiliarectv
        {
            get { return _patrimonioimmobiliarectv; }
            set { _patrimonioimmobiliarectv = value; }
        }

        /// <summary>
        /// Patrimonio terzi al netto del CC
        /// </summary>
        public decimal PatrimonioterzictvAlNettoContoCorrente
        {
            get { return _patrimonioterzictvalnettocontocorrente; }
            set { _patrimonioterzictvalnettocontocorrente = value; }
        }

        /// <summary>
        /// Imposta o recupera il controvalore totale detenuto presso istituti terzi.
        /// </summary>
        public decimal Patrimonioterzictv
        {
            get { return _patrimonioterzictv; }
            set { _patrimonioterzictv = value; }
        }

        /// <summary>
        /// Contocorrente altri istituti.
        /// </summary>
        public decimal PatrimonioTerziContoCorrente
        {
            get { return _patrimonioterzicontocorrente; }
            set { _patrimonioterzicontocorrente = value; }
        }

        public bool AdesioneSuccessivaAvanzato
        {
            get { return adesioneSuccessivaAvanzato; }
            set { adesioneSuccessivaAvanzato = value; }
        }

        /// <summary>
        /// Imposta o recupera il controvalore totale del patrimonio detenuto presso BF o SPI
        /// </summary>
        public decimal Patrimoniobancafideuramctv
        {
            get { return _patrimoniobancafideuramctv; }
            set { _patrimoniobancafideuramctv = value; }
        }


        /// <summary>
        /// Patrimonio BF al netto del CC
        /// </summary>
        public decimal PatrimonioBancaFideuramCtvAlNettoContoCorrente
        {
            get { return _patrimoniobancafideuramctvalnettocontocorrente; }
            set { _patrimoniobancafideuramctvalnettocontocorrente = value; }
        }

        /// <summary>
        /// Imposta o recupera il controvalore del patrimonio finanziario
        /// </summary>
        public decimal Patrimoniofinanziarioctv
        {
            get { return _patrimoniofinanziarioctv; }
            set { _patrimoniofinanziarioctv = value; }
        }

        /// <summary>
        /// Imposta o recupera il controvalore del patrimonio complessivo
        /// </summary>
        public decimal Patrimoniocomplessivototalectv
        {
            get { return _patrimoniocomplessivototalectv; }
            set { _patrimoniocomplessivototalectv = value; }
        }

        /// <summary>
        /// Imposta o recupera la descrizione estesa dell'area di bisogno
        /// </summary>
        public String AreaEstesa
        {
            get { return _areaestesa; }
            set { _areaestesa = value; }
        }

        /// <summary>
        /// Imposta o recupera il codice di area di bisogno
        /// </summary>
        public String Area
        {
            get { return _area; }
            set { _area = value; }
        }

        /// <summary>
        /// Imposta o recupera il codice della rete
        /// </summary>
        public string Rete
        {
            get { return _rete; }
            set { _rete = value; }
        }

        /// <summary>
        /// Imposta o recupera la descrizione estesa della rete
        /// </summary>
        public string NomeRete
        {
            get { return _nomeRete; }
            set { _nomeRete = value; }
        }

        /// <summary>
        /// Imposta o recupera l'agente
        /// </summary>
        public string Agente
        {
            get { return _agente; }
            set { _agente = value; }
        }

        /// <summary>
        /// Imposta o recupera il cognome dell'agente
        /// </summary>
        public string CognomeAgente
        {
            get { return _cognomeAgente; }
            set { _cognomeAgente = value; }
        }

        /// <summary>
        /// Imposta o recupera il nome dell'agente
        /// </summary>
        public string NomeAgente
        {
            get { return _nomeAgente; }
            set { _nomeAgente = value; }
        }

        /// <summary>
        /// Imposta o recupera l'indirizzo dell'agente
        /// </summary>
        public string IndirizzoAgente
        {
            get { return _indirizzoAgente; }
            set { _indirizzoAgente = value; }
        }

        /// <summary>
        /// Imposta o recupera il cap dell'agente
        /// </summary>
        public string CapAgente
        {
            get { return _capAgente; }
            set { _capAgente = value; }
        }

        /// <summary>
        /// Imposta o recupera la città dell'agente
        /// </summary>
        public string CittaAgente
        {
            get { return _cittaAgente; }
            set { _cittaAgente = value; }
        }

        /// <summary>
        /// Imposta o recupera la il telefono dell'agente
        /// </summary>
        public string TelefonoAgente
        {
            get { return _telefonoAgente; }
            set { _telefonoAgente = value; }
        }

        public string CodiceFiscale
        {
            get { return _codiceFiscale; }
            set { _codiceFiscale = value; }
        }






        /// <summary>
        /// IdReport di Diagnosi del PdF generato su ReportManager
        /// </summary>
        public int IdReportPDFDiagnosi
        {
            get { return _idReportPDFDiagnosi; }
            set { _idReportPDFDiagnosi = value; }
        }

        /// <summary>
        /// IdReport di Monitoraggio del PdF generato su ReportManager
        /// </summary>
        public int IdReportPDFMonitoraggio
        {
            get { return _idReportPDFMonitoraggio; }
            set { _idReportPDFMonitoraggio = value; }
        }






        /// <summary>
        /// Imposta o recupera il cognome del cliente
        /// </summary>
        public string CognomeCliente
        {
            get { return _cognomeCliente; }
            set { _cognomeCliente = value; }
        }

        /// <summary>
        /// Imposta o recupera il nome del cliente
        /// </summary>
        public string NomeCliente
        {
            get { return _nomeCliente; }
            set { _nomeCliente = value; }
        }

        /// <summary>
        /// Imposta o recupera il tipo di report.
        /// Attualemente si produzcono solo report per DIAGNOSI e MONITORAGGIO
        /// </summary>
        public string TipoReport
        {
            get { return _tipoReport; }
            set { _tipoReport = value; }
        }

        public TipoContratto _tipoContratto;
        public TipoContratto TipoContratto
        {
            get { return _tipoContratto; }
            set { _tipoContratto = value; }
        }

        private bool _contrattoOld;
        public bool ContrattoOld
        {
            get { return _contrattoOld; }
            set { _contrattoOld = value; }
        }

        private bool _noMonitoraggio;
        public bool NoMonitoraggio
        {
            get { return _noMonitoraggio; }
            set { _noMonitoraggio = value; }
        }

        public List<ReportType> ReportsType
        {
            get { return _reportsType; }
            set { _reportsType = value; }
        }

        public string Intermediario
        {
            get { return _intermediario; }
            set { _intermediario = value; }
        }

        /// <summary>
        /// Imposta o recupera il codice contratto
        /// </summary>
        public string CodiceContratto
        {
            get { return _CodiceContratto; }
            set { _CodiceContratto = value; }
        }

        /// <summary>
        /// Imposta o recupera un booleano che indica se si sta stampando un report Periodico(o Trimestrale).
        /// Se true è un report Periodico(o Trimestrale), se false è un Giornaliero.
        /// Il valore è settato sul file di configurazione app.config.
        /// </summary>
        public bool Periodico
        {
            get { return periodico; }
            set { periodico = value; }
        }

        public string NomeFileReport
        {
            get
            {
                //if(_dataLotto == string.Empty)
                //    _dataLotto = DateTime.Now.ToString("yyyyMMdd", CultureInfo.InvariantCulture);
                // if(_dataLotto)
                DateTime data = DateTime.Now;
                return String.Concat(CodiceContratto, "_", data.ToString("yyyyMMdd", CultureInfo.InvariantCulture));
                //return String.Concat(CodiceContratto, "_", DataLotto);
            }
        }

        public string DataLotto
        {
            set { _dataLotto = value; }
            get
            {
                if (_dataLotto == string.Empty)
                    _dataLotto = DateTime.Now.ToString("yyyyMMdd", CultureInfo.InvariantCulture);
                return _dataLotto;
            }
        }

        /// <summary>
        /// Imposta o recupera il riferimento a DocumentPDF
        /// </summary>
        public DocumentPDF DocumentPDF
        {
            get { return _documentPDF; }
            set { _documentPDF = value; }
        }

        public DataSectionResult Data
        {
            get { return _data; }
            set { _data = value; }
        }

        /// <summary>
        /// Imposta o recupera il riferimento a SezioneReport
        /// </summary>
        public SezioneReport SezioneReport
        {
            get { return _sezioneReport; }
            set { _sezioneReport = value; }
        }

        public decimal VaRRisorseNonAssociate
        {
            get { return _varrisorsenonassociate; }
            set { _varrisorsenonassociate = value; }
        }

        public decimal CoperturaRisorseNonAssociate
        {
            get { return _coperturarisorsenonassociate; }
            set { _coperturarisorsenonassociate = value; }
        }

        public decimal VaRTotaleRisorseFinanziarie
        {
            get { return _vartotalerisorsefinanziarie; }
            set { _vartotalerisorsefinanziarie = value; }
        }

        public decimal CoperturaTotaleRisorseFinanziarie
        {
            get { return _coperturatotalerisorsefinanziarie; }
            set { _coperturatotalerisorsefinanziarie = value; }
        }

        /// <summary>
        /// Ottiene o imposta il datatable del peso percentuale.
        /// Contiene i dati del Peso Percentuale per ciascuna areabisogno/progetto.
        /// </summary>
        public DataTable PesoPercentuale
        {
            get { return _pesopercentuale; }
            set { _pesopercentuale = value; }
        }

        /// <summary>
        /// Ottiene o imposta il datatable del rischio relativo.
        /// Contiene i dati del Rischio Relativo per ciascuna areabisogno/progetto.
        /// </summary>
        public DataTable RischioRelativo
        {
            get { return _rischiorelativo; }
            set { _rischiorelativo = value; }
        }

        /// <summary>
        /// Imposta o recupera i controvalori totali di ciascuna area/progetto.
        /// Utilizzata per l'allineamento dei controvalori totali tra la S82/S82BIS e la S86.
        /// Gli stessi controvalori totali che scriviamo nelle sezioni S82 e S8BIS devono essere riportate nella S86.
        /// </summary>
        public DataTable ControvaloriTotali
        {
            get { return _controvaloritotali; }
            set { _controvaloritotali = value; }
        }

        /// <summary>
        /// Indica la data, utilizzata nel report trimestrale, di fine del trimestre corrente.
        /// Il valore è impostato nel file di configurazione app.config
        /// </summary>
        public DateTime DataFineTrimestreCorrente
        {
            get { return _datafinetrimestrecorrente; }
            set { _datafinetrimestrecorrente = value; }
        }


        /// <summary>
        /// Ottiene o imposta lo schema della struttura del report da stampare.
        /// </summary>
        public DataTable Schema
        {
            get { return _schema; }
            set { _schema = value; }
        }

        public decimal TotalNegativeCurrentAccountValue
        {
            get { return _totalNegativeCurrentAccountValue; }
            set { _totalNegativeCurrentAccountValue = value; }
        }

        public decimal TotalSelfNegCurrentAccountValue
        {
            get { return _totalSelfNegCurrentAccountValue; }
            set { _totalSelfNegCurrentAccountValue = value; }
        }


        public string UltimaSezioneStampata
        {
            get { return _ultimaSezioneStampata; }
            set { _ultimaSezioneStampata = value; }
        }

        /// <summary>
        /// Persiste il controvalore e la percentuale relativa degli intermediari.
        /// Campo valorizzato nella DSS6 ed utilizzato nella DSS96 per il bilanciamento della percentuale maggiore:
        /// </summary>
        public DataTable DtDSS6Intermediari { get; set; }

        public DataAccessDE DataAccess
        {
            get
            {
                return dataAccess;
            }

            set
            {
                dataAccess = value;
            }
        }

        #endregion

        #region ICloneable Members

        public object Clone()
        {
            return this.MemberwiseClone();
        }

        #endregion
    }
}