using ceTe.DynamicPDF.PageElements;
using Consulenza.ReportWriter.Business.Entity;
using System.IO;
using ceTe.DynamicPDF;

namespace Consulenza.ReportWriter.Business.OBJ_PDF
{
    /// <summary>
    /// Rappresenta una immagine. 
    /// L'immagine sarà disegnata ai rispettivi valori x e y del documento assegnati alle proprietà _x e _y dell'oggetto ImagePDF.
    /// Utilizza la classe primitiva ceTe.DynamicPDF.PageElements.Image.
    /// </summary>
    public class ImagePDF : ObjectPDF
    {
        #region Fields

        /// <summary>
        /// Imposta o ottiene l'elemento base (PageElement)
        /// </summary>
        public Image BaseElement { get; set; }

        /// <summary>
        /// Imposta o recupera la X del documento su cui disegnare l'immagine.
        /// </summary>
        public float X { get; set; }

        /// <summary>
        /// Imposta o recupera un valore che indica l'incremento algebrico dell'incremento standard di X.
        /// Utilizzare questa proprietà se si vuole incrementare o decrementare la X assegnata automaticamente dal motore di renderizzazione.
        /// Di default=0;
        /// </summary>
        public float DeltaX { get; set; }

        /// <summary>
        /// Imposta o recupera la Y del documento su cui disegnare l'immagine.
        /// </summary>
        public float Y { get; set; }

        /// <summary>
        /// Imposta o recupera un valore che indica l'incremento algebrico dell'incremento standard di Y.
        /// Utilizzare questa proprietà se si vuole incrementare o decrementare la Y assegnata automaticamente dal motore di renderizzazione.
        /// Di default=0;
        /// </summary>
        public float DeltaY { get; set; }

        /// <summary>
        /// Imposta o ottiene un valore per il quale scalare l'immagine.
        /// </summary>
        public float Scale { get; set; }

        /// <summary>
        /// Imposta o ottiene l'allinemento dell'immagine quando questa è contenuta in una cella di una tabella.
        /// Di default=Left.
        /// </summary>
        public Align Align { get; set; }

        /// <summary>
        /// Imposta o recupera la larghezza
        /// </summary>
        public float Width { get; set; }

        /// <summary>
        /// Imposta o recupera l'altezza
        /// </summary>
        public float Height { get; set; }

        /// <summary>
        ///  Imposta o recupera il percorso dell'immagine da disegnare.
        /// </summary>
        public string Path { get; set; }

        /// <summary>
        /// Imposta o recupera il file contenente l'immagine da disegnare.
        /// </summary>
        public Stream File { get; set; }

        // NOTE
        public FormattedTextAreaPDF _notes { get; set; }

        public FormattedTextAreaPDF Notes
        {
            get { return _notes; }
            set { _notes = value; }
        }

        #endregion

        #region Costruttori

        /// <summary>
        /// Costruttore
        /// </summary>
        public ImagePDF()
        {
            Align = Align.Left;
            ObjectType = ObjectTypePdf.IMAGE;
            AutoIncrementYWritable = false;            
        }

        /// <summary>
        /// Costruttore
        /// </summary>
        /// <param name="x">X su cui stampare l'immagine.</param>
        /// <param name="file">file</param>
        /// <param name="height">altezza</param>
        /// <param name="width">larghezza</param>
        /// <param name="y">Y su cui stampare l'immagine.</param>
        public ImagePDF(float x, Stream file, float height, float width, float y)
            : this()
        {
            X = x;
            Y = y;
            Height = height;
            Width = width;
            File = file;
        }

        /// <summary>
        /// Costruttore
        /// </summary>
        /// <param name="x">X su cui stampare l'immagine.</param>
        /// <param name="scale"></param>
        /// <param name="file">file</param>
        public ImagePDF(float x, float scale, Stream file)
            : this()
        {
            X = x;
            Scale = scale;
            File = file;
        }


        /// <summary>
        /// Costruttore
        /// </summary>
        /// <param name="x">X su cui stampare l'immagine.</param>
        /// <param name="scale">Scala con cui stampare l'immagine.</param>
        /// <param name="fileName">Nome file dell'immagine.</param>
        public ImagePDF(float x, float scale, string fileName)
            : this()
        {
            X = x;
            Scale = scale;

            var path = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase)
                .Replace("bin", "Images")
                .Replace("file:\\", string.Empty);

            Path = string.Format("{0}\\{1}", path, fileName);
        }

        public ImagePDF(string fileName, float x, float scale)
            : this()
        {
            X = x;
            Scale = scale;
            Path = string.Format(fileName);
        }

        /// <summary>
        /// Costruttore
        /// </summary>
        /// <param name="x">X su cui stampare l'immagine.</param>
        /// <param name="scale">Scala con cui stampare l'immagine.</param>
        /// <param name="fileName">Nome file dell'immagine.</param>
        /// <param name="align">Allinemento dell'immagine quando contenuta in una cella di una tabella.</param>
        /// <param name="y">Y su cui stampare l'immagine.</param>
        public ImagePDF(float x, float scale, string fileName, Align align, float y)
            : this(x, scale, fileName)
        {
            Align = align;
            Y = y;
        }

        #endregion

        #region Metodi

        /// <summary>
        /// Ritorna l'oggetto che sarà stampato sulla pagina del documento.
        /// </summary>
        /// <returns></returns>
        public override PageElement ToElement()
        {
            return BaseElement;
        }



        #endregion
    }
}
