using ceTe.DynamicPDF;
using Consulenza.ReportWriter.Business.Entity;

namespace Consulenza.ReportWriter.Business.OBJ_PDF
{
    /// <summary>
    /// Rappresenta una nota.
    /// E' possibile aggiungere note a piè di pagina o a piè di tabella ad una TablePDF.
    /// In questo ultimo caso le note saranno disegnate subito sotto il footer della tabella associata.
    /// Il numero di asterischi è calcolato automaticamente dal motore di renderizzazione e ogni volta che nel documento è aggiunta una ObjectTypePDF.PAGE, viene resettato.
    /// La ListIdColumnsAssociatedNote è una lista di id delle colonne della TablePDF associata nei quali verranno aggiunti i relativi *.
    /// Gli * saranno accodati al rispettivo valore nella cella.
    /// Utilizza la classe primitiva ceTe.DynamicPDF.PageElements.ObjectPDF.
    /// </summary>
    public class TableNotePDF : FormattedTextAreaPDF
    {
        #region Enum

        /// <summary>
        /// Lista della tipologia delle possibili note da aggiungere al documento.
        /// </summary>
        public enum TableNoteType
        {
            NonImpostato
        }

        /// <summary>
        /// Lista delle tipologie di posizionamento dell'oggetto nota.
        /// </summary>
        public enum TableNotePositionType
        {
            PièDiPagina,
            PièDiTabella
        }
        /// <summary>
        /// Lista delle tipologie di marker dell'oggetto nota.
        /// </summary>
        public enum TableNoteTypemarker
        {
            Asterisco,
            Numeri
        }
        /// <summary>
        /// Lista della tipologia di posizionamento della nota all'interno della tabella.
        /// IntestazioneTabella: l'asterisco viene inserito tra i campi dell'intestazione della tabella.
        /// CorpoTabella: l'asterisco viene inserito tra i campi del dettaglio della tabella.
        /// PieDiTabella: l'asterisco viene inserito tra i campi del footer della tabella.
        /// </summary>
        public enum TableNoteAsteriskPositionType
        {
            IntestazioneTabella,
            CorpoTabella,
            PieDiTabella
        }

        /// <summary>
        /// Tipo id mapping
        /// </summary>
        public enum TableNoteMappingType { Fisso, Dinamico }

        #endregion

        #region Fields

        private TableNotePositionType _position = TableNotePositionType.PièDiTabella;
        private TableNoteAsteriskPositionType _asterisksposition = TableNoteAsteriskPositionType.CorpoTabella;
        private TableNoteTypemarker _marker = TableNoteTypemarker.Asterisco;
        private int _asterisksnumber;
        private TableNoteMappingType _mappingtype = TableNoteMappingType.Fisso;

        private string _condition = string.Empty;


        /// <summary>
        /// Imposta o ottiente il posizionamento dell'oggetto Nota.
        /// </summary>
        public TableNotePositionType Position
        {
            get { return _position; }
            set { _position = value; }
        }

        /// <summary>
        /// Imposta o recupera la tipologia di posizionamento degli asterischi quando viene impostata la ListIdColumnsAssociatedNote. 
        /// IntestazioneTabella: gli asterischi vengono disegnati nei campi ListIdColumnsAssociatedNote nell'header della tabella. 
        /// CorpoTabella: gli asterischi vengono disegnati nei campi ListIdColumnsAssociatedNote nel dettaglio della tabella.
        /// PieDiTabella: gli asterischi vengono disegnati nei campi ListIdColumnsAssociatedNote nel footer della tabella.
        /// Di default=CorpoTabella.
        /// </summary>
        public TableNoteAsteriskPositionType AsterisksPosition
        {
            get { return _asterisksposition; }
            set { _asterisksposition = value; }
        }
        public TableNoteTypemarker TypeMarker
        {
            get { return _marker; }
            set { _marker = value; }
        }
        /// <summary>  
        /// Imposta o ottiente il numero di asterischi.
        /// </summary>
        public int AsterisksNumber
        {
            get { return _asterisksnumber; }
            set { _asterisksnumber = value; }
        }

        /// <summary>
        /// Imposta o ottiene la tipologia della nota.
        /// </summary>
        public TableNoteType Type { get; set; }

        /// <summary>
        /// Ottiene o imposta la lista degli id delle colonne della TablePDF cui la nota verrà associata.
        /// </summary>
        public string[] MappingFields { get; set; }

        /// <summary>
        /// Ottiene o imposta il nome del campo chiave che identifica la riga univoca per cui associare la nota.
        /// Utilizzare il campo @rownumber.
        /// Obbligatorio per MappingType= DINAMICO.
        /// </summary>
        public string MappingKey { get; set; }

        /// <summary>
        /// Ottiene o imposta il tipo di mapping in MappingFields.
        /// Con MappingType impostato su fisso gli * saranno impostati in tutte le colonne specificate in MappingFields.
        /// Con MappingType impostato su dinamico gli * saranno posizionati nella colonna il cui id (stringa) inizia con la colonna specificata in ConditionFields.
        /// Di default = FISSO.
        /// </summary>
        public TableNoteMappingType MappingType
        {
            get { return _mappingtype; }
            set { _mappingtype = value; }
        }

        /// <summary>
        /// Ottiene o imposta la where condition che definisce il criterio per cui inserire gli * nel datasource della TablePDF;
        /// Gli * verranno aggiunti eclusivamente nella ListIdColumnsAssociatedNote.
        /// </summary>
        public string Condition
        {
            get { return _condition; }
            set { _condition = value; }
        }

        /// <summary>
        /// Imposta o recupera la lista dei campi impostati nella Condition. 
        /// E' necessario che ogni campo in ConditionFields sia mappato 1:1 con MappingFields e che la parte iniziale del nome del campo di ConditionFields e MappingFields siano uguali.
        /// ConditionFields è obbligatoria se si imposta MappingType = DINAMICO.
        /// </summary>
        public string[] ConditionFields { get; set; }

        /// <summary>
        /// Imposta o recupera il valore della Condition. E' un intero che identifica il tipo di nota.
        /// Ad esempio 1="Nota nuda proprietà", 2="Nota diritto proprietà"...
        /// ConditionValue è obbligatoria se si imposta MappingType = DINAMICO.
        /// </summary>
        public int ConditionValue { get; set; }

        /// <summary>
        /// Imposta o recupera l'immagine associata alla nota.
        /// Sarà disegnata a sinistra del testo. Se impostata l'immagine non saranno disegnati gli asterischi ma solo il testo.
        /// Di default = null (nessuna nota).
        /// </summary>
        public ImagePDF Image { get; set; }

        #endregion

        #region Costruttori

        /// <summary>
        /// Costruttore.
        /// Di default il FontSize è impostato a 6 e la Height a 8.
        /// Se non impostato la TipologiaPosizionamentoAsterisco di default=Dettaglio. 
        /// </summary>
        public TableNotePDF()
        {
            Image = null;
            ObjectType = ObjectTypePdf.TABLENOTE;
        }

        /// <summary>
        /// Costruttore.
        /// Di default il FontSize è impostato a 6 e la Height a 8.
        /// Di default la X è pari alla X della tablePDF cui la nota è associata.
        /// Se non impostato la TipologiaPosizionamentoAsterisco di default=CorpoTabella. 
        /// </summary>        
        /// <param name="position">Posizionamento della nota</param>
        /// <param name="text">Testo della nota</param>
        public TableNotePDF(TableNotePositionType position, string text)
            : this()
        {
            _position = position;
            Text = text;
        }

        /// <summary>
        /// Costruttore.
        /// Di default il FontSize è impostato a 6 e la Height a 8.
        /// Di default la X è pari alla X della tablePDF cui la nota è associata.
        /// Se non impostato la TipologiaPosizionamentoAsterisco di default=CorpoTabella. 
        /// </summary>        
        /// <param name="position">Posizionamento della nota.</param>
        /// <param name="text">Testo della nota.</param>
        /// <param name="mappingfields">Lista degli id delle colonne della tabella a cui la nota verrà associata.</param>
        public TableNotePDF(TableNotePositionType position, string text, string[] mappingfields)
            : this(position, text)
        {
            MappingFields = mappingfields;
        }
         /// <summary>
        /// Costruttore.
        /// Di default il FontSize è impostato a 6 e la Height a 8.
        /// Di default la X è pari alla X della tablePDF cui la nota è associata.
        /// Se non impostato la TipologiaPosizionamentoAsterisco di default=CorpoTabella. 
        /// </summary>        
        /// <param name="position">Posizionamento della nota.</param>
        /// <param name="text">Testo della nota.</param>
        /// <param name="mappingfields">Lista degli id delle colonne della tabella a cui la nota verrà associata.</param>
        /// <param name="condition">Condition che definisce il criterio per cui inserire gli * nel datasource della tabella.</param>
        public TableNotePDF(TableNotePositionType position, string text, string[] mappingfields, string condition)
            : this(position, text, mappingfields)
        {
            _condition = condition;
        }

    /// <summary>
    /// Costruttore.
    /// Di default il FontSize è impostato a 6 e la Height a 8.
    /// Di default la X è pari alla X della tablePDF cui la nota è associata.
    /// Se non impostato la TipologiaPosizionamentoAsterisco di default=CorpoTabella. 
    /// </summary>       
    /// <param name="position">Posizionamento della nota.</param>
    /// <param name="text">Testo della nota.</param>
    /// <param name="mappingfields">Lista degli id delle colonne della tabella a cui la nota verrà associata. Se TipologiaPosizionamentoAsterisco=PieDiTabella utilizzare id della colonna in FooterColumns della TablePDF. </param>
    /// <param name="condition">Condition che definisce il criterio per cui inserire gli * nel datasource della tabella.</param>
    /// <param name="asterisksposition">Tipologia di posizionamento degli asterischi quando viene impostata la listidcolumnsassociatednote. 
    /// IntestazioneTabella: gli asterischi vengono disegnati dei campi listidcolumnsassociatednote nell'header della tabella. 
    /// CorpoTabella: gli asterischi vengono disegnati dei campi listidcolumnsassociatednote nel dettaglio della tabella.
    /// PieDiTabella: gli asterischi vengono disegnati nei campi listidcolumnsassociatednote nel footer della tabella.
    /// </param>
    public TableNotePDF(TableNotePositionType position, string text, string[] mappingfields, string condition, TableNoteAsteriskPositionType asterisksposition)
        : this(position, text, mappingfields, condition)
    {
        _asterisksposition = asterisksposition;
    }
    /// <summary>
    /// Costruttore.
    /// Di default il FontSize è impostato a 6 e la Height a 8.
    /// Di default la X è pari alla X della tablePDF cui la nota è associata.
    /// Se non impostato la TipologiaPosizionamentoAsterisco di default=CorpoTabella. 
    /// </summary>       
    /// <param name="position">Posizionamento della nota.</param>
    /// <param name="text">Testo della nota.</param>
    /// <param name="mappingfields">Lista degli id delle colonne della tabella a cui la nota verrà associata. Se TipologiaPosizionamentoAsterisco=PieDiTabella utilizzare id della colonna in FooterColumns della TablePDF. </param>
    /// <param name="condition">Condition che definisce il criterio per cui inserire gli * nel datasource della tabella.</param>
    /// <param name="asterisksposition">Tipologia di posizionamento degli asterischi quando viene impostata la listidcolumnsassociatednote. 
    /// IntestazioneTabella: gli asterischi vengono disegnati dei campi listidcolumnsassociatednote nell'header della tabella. 
    /// CorpoTabella: gli asterischi vengono disegnati dei campi listidcolumnsassociatednote nel dettaglio della tabella.
    /// PieDiTabella: gli asterischi vengono disegnati nei campi listidcolumnsassociatednote nel footer della tabella.
    /// </param>
    public TableNotePDF(TableNotePositionType position, string text, string[] mappingfields, string condition, TableNoteAsteriskPositionType asterisksposition, ImagePDF image)
            : this(position, text, mappingfields, condition)
        {
            Image = image;
            _asterisksposition = asterisksposition;
        }

        public TableNotePDF(TableNotePositionType position, string text, string[] mappingfields, string condition, TableNoteAsteriskPositionType asterisksposition, TableNoteTypemarker marker)
            : this(position, text, mappingfields, condition)
        {
            _asterisksposition = asterisksposition;
            _marker = marker;
        }
        /// <summary>
        /// Costruttore.
        /// Di default il FontSize è impostato a 6 e la Height a 8.
        /// Di default la X è pari alla X della tablePDF cui la nota è associata.
        /// Se non impostato la TipologiaPosizionamentoAsterisco di default=CorpoTabella. 
        /// </summary>       
        /// <param name="position">Posizionamento della nota.</param>
        /// <param name="text">Testo della nota.</param>
        /// <param name="mappingfields">Lista degli id delle colonne della tabella a cui la nota verrà associata. Se TipologiaPosizionamentoAsterisco=PieDiTabella utilizzare id della colonna in FooterColumns della TablePDF. </param>
        /// <param name="condition">Condition che definisce il criterio per cui inserire gli * nel datasource della tabella.</param>
        /// <param name="asterisksposition">Tipologia di posizionamento degli asterischi quando viene impostata la listidcolumnsassociatednote. 
        /// IntestazioneTabella: gli asterischi vengono disegnati dei campi listidcolumnsassociatednote nell'header della tabella. 
        /// CorpoTabella: gli asterischi vengono disegnati dei campi listidcolumnsassociatednote nel dettaglio della tabella.
        /// PieDiTabella: gli asterischi vengono disegnati nei campi listidcolumnsassociatednote nel footer della tabella.
        /// </param>
        /// <param>Tipologia della nota</param>
        /// <param name="type">Tipologia della nota</param>
        public TableNotePDF(TableNotePositionType position, string text, string[] mappingfields, string condition, TableNoteAsteriskPositionType asterisksposition, TableNoteType type)
            : this(position, text, mappingfields, condition, asterisksposition)
        {
            Type = type;
        }


        #endregion

        #region Metodi

        /// <summary>
        /// Ritorna la rappresentazione in stringa del numero asterisksnumber passato in input.
        /// </summary>
        /// <param name="asterisksnumber">Numero di * da rappresentare in formato stringa.</param>
        /// <returns></returns>
        public static string ToAsteriskString(int asterisksnumber)
        {
            string strReturn = string.Empty;

            for (int i = 0; i < asterisksnumber; i++)
                strReturn += "*";

            return strReturn;
        }

        /// <summary>
        /// Ritorna la rappresentazione in stringa del numero di asterisci impostato nella proprietà AsterisksNumber.
        /// </summary>
        public string ToAsteriskString()
        {
            string strReturn = string.Empty;

            for (int i = 0; i < _asterisksnumber; i++)
                strReturn += "*";

            return strReturn;
        }
        public string ToNumberAsteriskString()
        {
            return _asterisksnumber.ToString();
            
        }
        public static string ToNumberAsteriskString(int asterisksnumber)
        {
            return "<sup>" + asterisksnumber.ToString() + "</sup>";
           
        }
        /// <summary>
        /// Ritorna l'oggetto che sarà stampato sulla pagina del documento.
        /// </summary>
        /// <returns></returns>
        public override PageElement ToElement()
        {
            return BaseElement;
        }

        #endregion
    }
}




