using System;
using System.Collections.Generic;
using System.Text;
using ceTe.DynamicPDF;
using ceTe.DynamicPDF.Merger;
using ceTe.DynamicPDF.Text;
using System.Configuration;
using System.Reflection;
using System.IO;
using ceTe.DynamicPDF.Imaging;
using Dundas.Charting.WebControl;
using System.Threading;
using System.Globalization;
using ceTe.DynamicPDF.PageElements;

namespace Consulenza.PDFLettera
{ 
    public enum TipoContratto {
        Old=0,
        Affluent=1,
        Private=2
    }
    public enum TipoLettera {
        LetteraAccettazioneConAttivazioneSei,
        LetteraAccettazioneAttivazioneSeiPosticipata,
        RistampaLettera,
        ReportPeriodico
    }
    namespace LetteraAccompagnamento
    {
        public enum TipoReport
        {
            Diagnosi,
            Monitoraggio
        }
    }
    
    public abstract class LetteraBenvenuto {
        private byte[] data;

        public byte[] Data {
            get { return data; }
        }

        protected Image firma;

        protected Document lettera;
        protected int   fontSize,
                        idLettera;
        protected string    path,
                            nome,
                            cognome,
                            appellativo,
                            nomeLettera,
                            indirizzo,
                            rete,
                            testoSaluti,
                            testoOggetto,
                            testo;
        protected FormattedTextArea     cliente,
                                        indirizzoBanca,
                                        oggetto,
                                        luogo,
                                        saluti,
                                        corpo;

        protected DateTime dataGenerazione;
        
        
        protected LetteraBenvenuto(string rete, int idLettera, string testo,string nome, string cognome,string indirizzo,bool ristampa,string appellativo,string obj,string firma) {

            Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
            this.rete = rete;
            this.data = null;
            this.appellativo = appellativo;
            this.testoOggetto = obj;
            this.testoSaluti = firma;
            this.indirizzo = indirizzo;
            this.idLettera = idLettera;
            this.testo = testo;
            this.nome = nome;
            this.cognome = cognome;
            //this.codiceContratto = codiceContratto;
            this.dataGenerazione = DateTime.Now;
            
            PageDimensions dimensions = new PageDimensions(PageSize.A4, PageOrientation.Portrait);
            dimensions.BottomMargin = Convert.ToInt32(ConfigurationManager.AppSettings["MargineInfPX"]);
            dimensions.TopMargin = Convert.ToInt32(ConfigurationManager.AppSettings["MargineSupPX"]);
            dimensions.LeftMargin = Convert.ToInt32(ConfigurationManager.AppSettings["MargineSxPX"]);
            dimensions.RightMargin = Convert.ToInt32(ConfigurationManager.AppSettings["MargineDxPX"]);
            //Page page = new Page(dimensions);
            lettera = new Document();


            // Lettura Template

            System.Reflection.Assembly thisExe;
            thisExe = System.Reflection.Assembly.GetExecutingAssembly();
            System.IO.Stream file = null;
            if(rete.ToUpper() == "F")
                 file = thisExe.GetManifestResourceStream("Consulenza.PDFLettera.TemplateBF.pdf");
                                                                                        
            else
                file = thisExe.GetManifestResourceStream("Consulenza.PDFLettera.templateSPI.pdf");

            PdfDocument pp = new PdfDocument(file);
            Page page = new ImportedPage(pp.GetPage(1));
            page.Dimensions = dimensions;
            // pg = new ImportedPage(pp.GetPage(1));
            lettera.Pages.Add(page);
           
            

           
            fontSize = Convert.ToInt32(ConfigurationManager.AppSettings["fontSize"]);
            
            string[] valoriTextArea;
            valoriTextArea = ConfigurationManager.AppSettings["AreaClientePX"].Split(',');
            cliente = new FormattedTextArea(string.Empty,
                                            Convert.ToInt32(valoriTextArea[0]),
                                            Convert.ToInt32(valoriTextArea[1]),
                                            Convert.ToInt32(valoriTextArea[2]),
                                            Convert.ToInt32(valoriTextArea[3]),
                                            FontFamily.Times,
                                            fontSize, 
                                            true);
            valoriTextArea = ConfigurationManager.AppSettings["AreaLuogoPX"].Split(',');
            luogo = new FormattedTextArea(string.Empty,
                                            Convert.ToInt32(valoriTextArea[0]),
                                            Convert.ToInt32(valoriTextArea[1]),
                                            Convert.ToInt32(valoriTextArea[2]),
                                            Convert.ToInt32(valoriTextArea[3]),
                                            FontFamily.Times,
                                            fontSize,
                                            true);
            valoriTextArea = ConfigurationManager.AppSettings["AreaOggettoPX"].Split(',');
            oggetto = new FormattedTextArea(string.Empty,
                                            Convert.ToInt32(valoriTextArea[0]),
                                            Convert.ToInt32(valoriTextArea[1]),
                                            Convert.ToInt32(valoriTextArea[2]),
                                            Convert.ToInt32(valoriTextArea[3]),
                                            FontFamily.Times,
                                            fontSize, 
                                            true);
            valoriTextArea = ConfigurationManager.AppSettings["AreaCorpoPX"].Split(',');
            this.corpo = new FormattedTextArea(string.Empty,
                                            Convert.ToInt32(valoriTextArea[0]),
                                            Convert.ToInt32(valoriTextArea[1]),
                                            Convert.ToInt32(valoriTextArea[2]),
                                            Convert.ToInt32(valoriTextArea[3]),
                                            FontFamily.Times,
                                            fontSize, 
                                            true);
            valoriTextArea = ConfigurationManager.AppSettings["AreaSalutiPX"].Split(',');
            this.saluti = new FormattedTextArea(string.Empty,
                                            Convert.ToInt32(valoriTextArea[0]),
                                            Convert.ToInt32(valoriTextArea[1]),
                                            Convert.ToInt32(valoriTextArea[2]),
                                            Convert.ToInt32(valoriTextArea[3]),
                                            FontFamily.Times,
                                            fontSize,
                                            true);

            // Fc 03/07/2015
            // modifica "a mano"  del valore impostato xFirma a 290
            //int xFirma = (int)(saluti.X + (this.saluti.Width - 94) / 2);
            int xFirma = 290;
            
            int yFirmaF = (int)(saluti.Y - saluti.Height + 20);
            int yFirmaS = (int)(saluti.Y - saluti.Height + 10);

            if (rete.ToUpper() == "F")
                this.firma = GetImageByResourceName("Consulenza.PDFLettera.firma_Fideuram.jpg", xFirma, yFirmaF, (float)0.2);
            else
                this.firma = GetImageByResourceName("Consulenza.PDFLettera.firma_SanPaoloInvest.jpg", xFirma, yFirmaS, (float)0.2);


            oggetto.Style.Paragraph.Align = ceTe.DynamicPDF.TextAlign.Justify;
            corpo.Style.Paragraph.Align = ceTe.DynamicPDF.TextAlign.Justify;
            luogo.Style.Paragraph.Align = ceTe.DynamicPDF.TextAlign.Right;

            //this.appellativo = appellativo;
            //this.testoOggetto = obj;
            //this.testoSaluti = firma;
            //this.indirizzo = indirizzo;
            //this.idLettera = idLettera;
            //this.testo = testo;
            //this.nome = nome;
            //this.cognome = cognome;

            //cliente.Text = this.nome.ToString() + " " + this.cognome.ToString();
            //corpo.Text = this.corpo.ToString();
            //oggetto.Text = this.oggetto.ToString();

            this.corpo.Text = "";
            page.Elements.Add(this.corpo);
            page.Elements.Add(cliente);
            page.Elements.Add(oggetto);
            page.Elements.Add(luogo);
            ////page.Elements.Add(indirizzoBanca);
            
            page.Elements.Add(this.firma);
            page.Elements.Add(saluti);
            
            //** NOTA
            //FC 26/06/2015
            // MOdificato per nuovo template
            //float xNota = 0;
            //float yNota = 712;//709
            float xNota = 27;
            float yNota = 720;
            float wNota = 150;
            page.Elements.Add(new ceTe.DynamicPDF.PageElements.Line(xNota, yNota, xNota + wNota, yNota, 0.5F, RgbColor.Black));
            page.Elements.Add(new ceTe.DynamicPDF.PageElements.Label(
                "¹Il private banker è un professionista della consulenza finanziaria, previdenziale e assicurativa, iscritto all’Albo Unico dei Consulenti Finanziari."
                , xNota
                , yNota+3
                ,480
                ,30
                , new OpenTypeFont("times.ttf")
                , 9
                ));
            //** NOTA 
            path = ConfigurationManager.AppSettings["pathScritturaLettera"];
        }

        public void writePDF() {
            data = lettera.Draw();
            //DECOMMENTARE PER EFFETTUARE LE PROVE, SALVA LA LETTERA SUL PERCORSO
            //SPECIFICATO SU pathScritturaLettera
            //lettera.Draw(path + nomeLettera + ".pdf"); 

        }

        protected static Image GetImageByResourceName(string resourceName,int X,int Y,float ratio) 
        {
            Assembly a = Assembly.GetExecutingAssembly();

           
            try {
                Stream stream = a.GetManifestResourceStream(resourceName);
                Image gif = new Image(stream,X,Y,ratio);
               
                return gif;
            }
            catch{
                return null;
            }
        }

        protected abstract void settaCampi();
    }
}