using System;
using System.Collections.Generic;
using System.Data;
namespace PDFGenerator.BusinessLayer
{
    /// <summary>
    /// Summary description for Paragrafo
    /// </summary>
    public class ParagrafoReport : CapitoloReport
    {
        private Int32 _id;
        private string _titolo;
        private string _sottoTitolo;
        private string _testoIntroduttivo;
        private List<SezioneReport> _children = new List<SezioneReport>();
        private string _querySql;
        private Int32 _ordine;
        private CapitoloReport _parent;
        private bool _checkstampaelemento;
        private bool _ripetistampaelemento = false;   
        private bool _indicizzato;
        private float _spazionecessariosezionesuccessiva = 0;
       
        private string _areaprogettocodice;
        private string _areaprogettodescrizione;
        private string _nomeprogetto;
        private Int32? _ordinamentoProgettoPerAreeMonitorate;
        private string _nomeprogettodaindicizzare = string.Empty;
        private bool _areaprogettosottomonitoraggio = false;
        private int _numeroprogettiinvestimento;
        //usato per identificare l'intermediario nella S102 S103
        private string _intermediario = string.Empty;
        // TUOFOGLIO 20181213 Dall'introduzione del prodotto Il Mio Foglio, serve a distinguere tra i GP e MioFoglio
        private string _codiceAreaSelf;
        //--TUOFOGLIO 20181213

        public new List<SezioneReport> Children
        {
            get
            {
                return _children;
            }
        }

        /// <summary>
        /// Costruttore
        /// </summary>
        public ParagrafoReport()
        {
            _checkstampaelemento = true;
            _indicizzato = true;
        }

        /// <summary>
        /// Costruttore
        /// </summary>
        /// <param name="idParagrafo"></param>
        public ParagrafoReport(int idParagrafo)
        {

            _id = idParagrafo;
            _checkstampaelemento = true;
            _indicizzato = true;

        }

        /// <summary>
        /// Costruttore.
        /// </summary>
        /// <param name="idParagrafo">id del Paragrafo</param>
        /// <param name="SourceDatarow">Datarow che contiene i campi:
        /// queryOracleParagrafo,
        /// titoloParagrafo,
        /// testoParagrafo,
        /// ordineParagrafo,
        /// indicizzatoParagrafo, 
        ///  che valorizzano le rispettive propriet� dell'oggetto Paragrafo.
        /// </param>
        public ParagrafoReport(int idParagrafo, DataRow SourceDatarow)
            : this(idParagrafo)
        {
            _ordine = SourceDatarow["ordineParagrafo"] == DBNull.Value ? 0 : Convert.ToInt32(SourceDatarow["ordineParagrafo"]);
            _titolo = SourceDatarow["titoloParagrafo"].ToString();
            _testoIntroduttivo = SourceDatarow["testoParagrafo"].ToString();
            _querySql = SourceDatarow["querySqlParagrafo"].ToString();
            _indicizzato = Convert.ToBoolean(SourceDatarow["indicizzatoParagrafo"]);
            _spazionecessariosezionesuccessiva = SourceDatarow["spazionecessariosezionesuccessiva"] == DBNull.Value ? 0 : Convert.ToSingle(SourceDatarow["spazionecessariosezionesuccessiva"]);
            
            _areaprogettocodice = string.Empty;
            _areaprogettodescrizione = string.Empty;
            _nomeprogetto = string.Empty;
            _nomeprogettodaindicizzare = string.Empty;

            _ordinamentoProgettoPerAreeMonitorate = null;
        }

        #region Proprieta
        /// <summary>
        /// Imposta o recupera l'Id del Paragrafo.
        /// </summary>
        public new int Id
        {
            get { return _id; }
            set { _id = value; }
        }

        /// <summary>
        /// Restituisce l'oggetto Capitolo padre dell'oggetto Paragrafo corrente.
        /// </summary>
        public CapitoloReport ParagrafoParent
        {
            get { return _parent; }
            set { _parent = value; }
        }
        /// <summary>
        /// Imposta o recupera il Titolo del Paragrafo.
        /// </summary>
        public new string Titolo
        {
            get { return _titolo; }
            set { _titolo = value; }
        }

        /// <summary>
        /// Imposta o recupera il sotto titolo del Paragrafo.
        /// </summary>
        public string SottoTitolo
        {
            get { return _sottoTitolo; }
            set { _sottoTitolo = value; }
        }

        /// <summary>
        /// Imposta o recupera il testo che introduce il Paragrafo.
        /// </summary>
        public new string TestoIntroduttivo
        {
            get { return _testoIntroduttivo; }
            set { _testoIntroduttivo = value; }
        }

        /// <summary>
        /// Imposta o recupera il nome del file .sql contenente la select oracle 
        /// da lanciare nel caso in cui il paragrafo sia sottoposto a query.  
        /// </summary>
        public new string QuerySql
        {
            get { return _querySql; }
            set { _querySql = value; }
        }

        /// <summary>
        /// Imposta o recupera l'ordine di stampa del paragrafo.
        /// </summary>
        public new int Ordine
        {
            get { return _ordine; }
            set { _ordine = value; }
        }

        /// <summary>
        /// Indica se l'elemento viene stampato o no.
        /// Di default true.
        /// </summary>
        public new bool CheckStampaElemento
        {
            get { return _checkstampaelemento; }
            set { _checkstampaelemento = value; }
        }

	    /// <summary>
	    /// Ripete la stampa dell'elemento (paragrafo corrente) e non imposta a false la propriet�  CheckStampaElemento.
	    /// Utilizzato in monitoraggio per stampare i paragrafi per ogni area monitorata, in modo da non duplicare i paragrafi.
	    /// Di default = false.
	    /// </summary>
	    public bool RipetiStampaElemento
	    {
	        get { return _ripetistampaelemento; }
	        set { _ripetistampaelemento = value; }
	    }

	    /// <summary>
        /// Indica se il paragrafo dovra essere indicizzato o no.
        /// True se non specificato.
        /// </summary>
        public bool Indicizzato
        {
            get { return _indicizzato; }
            set { _indicizzato = value; }
        }

        /// <summary>
        /// Ottiene o imposta lo spazio necessario al paragrafo per scrivere la sezione successiva senza
        /// posizionarsi su una nuova pagina del documento.
        /// Il valore viene settato a livello di database: campo "SpazioNecessarioSezioneSuccessiva" della tabella "R6Paragrafo"
        /// </summary>
        public float SpazioNecessarioSezioneSuccessiva
        {
            get { return _spazionecessariosezionesuccessiva; }
            set { _spazionecessariosezionesuccessiva = value; }
        }

        /// <summary>
        /// Imposta o recupera il codice dell'Area/Progetto. es "Inv","Ext".
        /// </summary>
        public string AreaProgettoCodice
        {
            get { return _areaprogettocodice; }
            set { _areaprogettocodice = value; }
        }

        // TUOFOGLIO 20181213
        public string CodiceAreaSelf
        {
            get { return _codiceAreaSelf; }
            set { _codiceAreaSelf = value; }
        }
        //--TUOFOGLIO 20181213

        /// <summary>
        /// Imposta o recupera la descrizione dell'Area/Progetto. es "Investimento","Extra Rendimento".
        /// </summary>
        public string AreaProgettoDescrizione
        {
            get { return _areaprogettodescrizione; }
            set { _areaprogettodescrizione = value; }
        }

        /// <summary>
        /// Imposta o recupera la descrizione del nome progetto per l'area di investimento.
        /// </summary>
        public string NomeProgetto
        {
            get { return _nomeprogetto; }
            set { _nomeprogetto = value; }
	    }

        /// <summary>
        /// Imposta o recupera il valore di Ordinamento assegnato al progetto nell'ambito delle Aree Monitorate:
        /// questo valore � poi consumato dalle sezioni appartenenti al praragrafo per impostare i relativi filtri.
        /// </summary>
        public Int32? OrdinamentoProgettoPerAreeMonitorate
        {
            get { return _ordinamentoProgettoPerAreeMonitorate; }
            set { _ordinamentoProgettoPerAreeMonitorate = value; }
        }

	    /// <summary>
	    ///  Imposta o recupera la descrizione del nome progetto che va indicizzato.
	    ///  Nel report di proposta l'indicizzazione per le areebisogno/progetto � fatta a livello di sezione e non di paragrafo.
	    ///  Le sezione S70 e S71 sono legate ad un solo paragrafo e vengono duplicate per ogni area/progetto.
	    ///  Se i progetti di investimento sono >1 l'indicizzazione e il settaggio del titolo e del testo introduttivo,
	    ///  va fatto solo sulla prima S70 di tali progetti.
	    /// </summary>
	    public string NomeProgettoDaIndicizzare
	    {
	        get { return _nomeprogettodaindicizzare; }
	        set { _nomeprogettodaindicizzare = value; }
	    }

        /// <summary>
        /// Indica se l'area/progetto � sottoposta a monitoraggio.
        /// Implica che per e aree/progetto non sottoposte a monitoraggio venga stampata la s43 al posto della s43bis
        /// </summary>
        public bool AreaProgettoSottoMonitoraggio
        {
            get { return _areaprogettosottomonitoraggio; }
            set { _areaprogettosottomonitoraggio = value; }
        }


        /// <summary>
        /// Imposta o recupera il numero totale dei progetti d'investimento.
        /// </summary>
        public int NumeroProgettiInvestimento
        {
            get { return _numeroprogettiinvestimento; }
            set { _numeroprogettiinvestimento = value; }
        }
        /// <summary>
        /// Imposta o recupera L'intermediario per il paragrafo.
        /// </summary>
        public string IntermediarioPar
        {
            get
            {
                return _intermediario;
            }
            set
            {
                _intermediario = value;
            }
        }
      

	    #endregion

        #region Metodi
        public void Add(SezioneReport child)
        {
            _children.Add(child);
        }
        public void Remove(SezioneReport child)
        {
            _children.Remove(child);
        }
        public new void Disegna()
        {
            foreach (SezioneReport child in _children)
            {
                child.SezioneParent = this;
                child.Disegna();
            }
        }




        #endregion
    }
}