using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Collections.Specialized;
using System.Globalization;
using System.Resources;
using ContrattoSei.Utilities;
using DataAccessLayer;
using System.Data.SqlClient;
using System.Data.Common;
using System.Threading.Tasks;
using System.Threading;
using System.Configuration;

namespace PDFGenerator.BusinessLayer
{
    /// <summary>
    /// Risk Credit Classes.
    /// <Owner> Marian Zaki</Owner>
    /// <Date> 04052010 </Date>
    /// </summary>
    /*public enum RiskCreditClass
    {
        /// <summary>
        /// Class 1
        /// </summary>
        Classe1,

        /// <summary>
        /// Class 2
        /// </summary>
        Classe2,

        /// <summary>
        /// Class 3
        /// </summary>
        Classe3
    }*/
    public class UtilityBusinessLayer
    {
        private static NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger();

        private static DataThread ConstructFromDataReader(IDataReader reader)
        {
            //pk  
            try { 
            logger.Debug("Starting getting data for {0} {1} {2}", reader["codiceFiscale"].ToString(), reader["rete"].ToString(), reader["Tip_Contratto"].ToString());
            }
            catch { }
            DataThread dataThread = new DataThread(DBProvider.SqlServerStampeC6);
            //RETE
            dataThread.DataLotto = ConfigurationManager.AppSettings["DataLotto"].ToString();
            dataThread.Rete = reader["Rete"].ToString();
            dataThread.NomeRete = reader["NomeRete"].ToString();
            //AGENTE
            dataThread.Agente = reader["Agente"].ToString();
            dataThread.CognomeAgente = reader["CognomeAgente"].ToString();
            dataThread.NomeAgente = reader["NomeAgente"].ToString();
            dataThread.IndirizzoAgente = reader["IndirizzoAgente"].ToString();
            dataThread.CapAgente = reader["CapAgente"].ToString();
            dataThread.CittaAgente = reader["CittaAgente"].ToString();
            dataThread.TelefonoAgente = reader["TelefonoAgente"].ToString();
            //CLIENTE
            dataThread.CodiceFiscale = reader["codiceFiscale"].ToString();
            dataThread.CognomeCliente = reader["CognomeCliente"].ToString();
            dataThread.NomeCliente = reader["NomeCliente"].ToString();
            //PATRIMONI CLIENTE
            dataThread.profiloIsAct = Convert.ToBoolean(reader["ProfiloIsAct"]);
            //PATRIMONIO NON RAPPRESENTABILE
            dataThread.PatrimonioNonRappresentabile = (decimal)reader["PatrimonioNonRappresentabile"];
            //PARTITE VIAGGIANTI
            dataThread.PartiteViaggiantiInvestimento = (decimal)reader["PartiteViaggiantiInv"];
            dataThread.PartiteViaggiantiDisinvestimento = (decimal)reader["PartiteViaggiantiDisinv"]; //d.lisena

            dataThread.ContoCorrente = (decimal)reader["ContoCorrente"];
            dataThread.Patrimonioaltroctv = (decimal)reader["Patrimonioaltroctv"];
            dataThread.Patrimonioimmobiliarectv = (decimal)reader["Patrimonioimmobiliarectv"];
            dataThread.Patrimonioterzictv = (decimal)reader["Patrimonioterzictv"];
            dataThread.PatrimonioTerziContoCorrente = (decimal)reader["PatrimonioTerziContoCorrente"];
            dataThread.PatrimonioterzictvAlNettoContoCorrente = (decimal)reader["PatrimonioterzictvAlNettoContoCorrente"];
            dataThread.Patrimoniobancafideuramctv = (decimal)reader["Patrimoniobancafideuramctv"];
            dataThread.PatrimonioBancaFideuramCtvAlNettoContoCorrente = (decimal)reader["patrimoniobancafideuramctvalnettocontocorrente"];
            dataThread.NumeroIntermediari = (int)reader["NumeroIntermediari"];
            dataThread.RisorseNonAssociate = (decimal)reader["RisorseNonAssociate"];
            dataThread.VaRRisorseNonAssociate = (decimal)reader["VaRRisorseNonAssociate"];
            dataThread.CoperturaRisorseNonAssociate = (decimal)reader["CoperturaRisorseNonAssociate"];
            dataThread.VaRTotaleRisorseFinanziarie = (decimal)reader["VaRTotaleRisorseFinanziarie"];
            dataThread.CoperturaTotaleRisorseFinanziarie = (decimal)reader["CoperturaTotaleRisorseFinanziarie"];
            dataThread.TipoContratto = reader["Tip_Contratto"].ToString().Equals("2") ? TipoContratto.Private : reader["Tip_Contratto"].ToString().Equals("1") ? TipoContratto.Affluent : TipoContratto.Old;
            dataThread.ContrattoOld = reader["Contrattoold"].ToString().Equals("1") ? true : false;
            dataThread.NoMonitoraggio = reader["NoMonitoraggio"].ToString().Equals("1") ? true : false;
            //CONTRATTO
            // dataThread.GeneraDiagnosi = Convert.ToBoolean(reader["generaDiagnosi"]);

            dataThread.IdReportPDFDiagnosi = (Int32)reader["IdReportPDFDiagnosi"];
            dataThread.IdReportPDFMonitoraggio = (Int32)reader["IdReportPDFMonitoraggio"];

            dataThread.CodiceContratto = reader["CodiceContratto"].ToString();
            int idReportDiagnosi = (Int32)reader["idReportDiagnosi"];
            if (idReportDiagnosi != -1)
            {
                ReportType reportType = new ReportType();
                reportType.IdReport = (Int32)reader["idReportDiagnosi"];
                reportType.IdModello = (Int32)reader["idModelloDiagnosi"];
                reportType.Descrizione = reader["descrizioneDiagnosi"].ToString();
                reportType.TipoReport = TipoReport.DIAGNOSI;
                dataThread.ReportsType.Add(reportType);
            }

            int idReportMonitoraggio = (Int32)reader["idReportMonitoraggio"];
            if (idReportMonitoraggio != -1)
            {
                ReportType reportType = new ReportType();
                reportType.IdReport = (Int32)reader["idReportMonitoraggio"];
                reportType.IdModello = (Int32)reader["idModelloMonitoraggio"];
                reportType.Descrizione = reader["descrizioneMonitoraggio"].ToString();
                reportType.TipoReport = TipoReport.MONITORAGGIO;
                dataThread.ReportsType.Add(reportType);

                DateTimeFormatInfo dfi = new CultureInfo("it-IT", false).DateTimeFormat;
                dataThread.DataFineTrimestreCorrente = Convert.ToDateTime(UtilityManager.getAppSetting("DataFineTrimestreCorrente"), dfi);

            }
            dataThread.AdesioneSuccessivaAvanzato = Convert.ToBoolean(reader["adesioneSuccessivaAvanzato"]);
            dataThread.Periodico = UtilityManager.getAppSetting("Periodico") == "0" ? false : true;
            try { 
            logger.Debug("Getting data for {0} {1} {2} finished", reader["codiceFiscale"].ToString(), reader["rete"].ToString(), reader["Tip_Contratto"].ToString());
            }
            catch { }
            return dataThread;
        }

        public List<DataThread> getDataThreads(int number)
        {
            List<DataThread> dataThreads = new List<DataThread>();
            try
            {
                DataThread dataThread = null;
                string queryGetContratti = UtilityManager.getAppSetting("QueryContratti");
                DbParameter[] pa = new SqlParameter[1] { new SqlParameter("volThreads", number) };
                using (DataAccessDE dataAccess = new DataAccessDE(DBProvider.SqlServerStampeC6))
                {
                    SqlCommand cmd;
                    using (IDataReader reader = dataAccess.ExecuteDataReader(CommandType.StoredProcedure, queryGetContratti, pa, out cmd))
                    {
                        while (reader.Read())
                        {
                            dataThread = ConstructFromDataReader(reader);
                            dataThreads.Add(dataThread);
                        }
                        reader.Close();
                    }
                    cmd.Dispose();
                    System.Threading.Tasks.Parallel.ForEach(dataThreads, t =>
                    {
                        RischioRelativo_PesoPercentuale r = new RischioRelativo_PesoPercentuale();
                        r.DataSource = recuperaDatiCalcoloPeso_Rischio(t.DataAccess, t.Rete, t.CodiceFiscale);
                        t.PesoPercentuale = r.calcolaPeso();
                        t.RischioRelativo = r.calcolaRischio();
                        t.ControvaloriTotali = r.calcolaControvaloriAttuali();
                        t.TotalNegativeCurrentAccountValue = getClientNegativeCurrentAccountsValue(t.DataAccess, t.Rete, t.CodiceFiscale);
                        t.TotalSelfNegCurrentAccountValue = getClientSelfNegCurrentAccountValue(t.DataAccess, t.Rete, t.CodiceFiscale);
                    });
                }
            }
            catch (Exception ex)
            {
                try { 
                logger.Error(String.Concat(ex.Message,", number: ", number.ToString()));
                }
                catch { }
            }
            if (dataThreads != null && dataThreads.Count > 0)
                return dataThreads;
            else
                return null;
        }

        public Task obtainDataThreadsAsync(List<DataThread> dataThreads, int number)
        {
            Task t = Task.Factory.StartNew(() =>
            {
                List<DataThread> result = getDataThreads(number);
                dataThreads.Clear();
                if (result != null)
                {
                    foreach (DataThread dt in result)
                    {
                        dataThreads.Add(dt);
                    }
                }                             
            });
            return t;
        }

        /// <summary>
        /// Recupero il datatable sul quale effettuare il calcolo del peso e del rischo relativo a livello di area/progetto.
        /// Dalla [C6MartPeriodico].[PL_S82DatiSintetici] prendo i dati per le aree non d'investimento.
        /// Dalla [C6MartPeriodico].[PL_S82BisDatiSintetici] prendo i dati per le aree d'investimento.
        /// Oltre a dtDatiAREA e dtDatiPROGETTO vanno considerati anche i prodotti non associati a progetti.
        /// Ottengo 3 datatable e il datatable di return sar� il merge dei 3.
        /// </summary>
        /// <returns></returns>
        private DataTable recuperaDatiCalcoloPeso_Rischio(DataAccessDE dataAccess, string rete, string codiceFiscale)
        {
            #region Settaggio parametri

            List<Parametro> parameters = new List<Parametro>()
            {
                new Parametro() {Value = rete, ParameterName ="Rete" },
                new Parametro() {Value = codiceFiscale, ParameterName ="CodiceFiscale" },
            };

            #endregion

            DataTable dtDatiAREA = dataAccess.ExecuteDataTableStoredProcedure(DBProvider.SqlServerStampeC6, "[C6MartPeriodico].[PL_S82DatiSintetici]", parameters);
            dtDatiAREA = dtDatiAREA.DefaultView.ToTable(false, "NEED_AREA", "CONTROVALOREATTUALE", "VAR_NEEDAREA", "VAR_NEEDAREASTRING", "ORDINAMENTO_PROGETTO");

            DataTable dtDatiPROGETTO = dataAccess.ExecuteDataTableStoredProcedure(DBProvider.SqlServerStampeC6, "[C6MartPeriodico].[PL_S82BisDatiSintetici]", parameters);
            dtDatiPROGETTO = dtDatiPROGETTO.DefaultView.ToTable(false, "NEED_AREA", "NOME_PROGETTO", "CONTROVALOREATTUALE", "VAR_NEEDAREA", "VAR_NEEDAREASTRING", "ORDINAMENTO_PROGETTO");

            // Oltre a dtDatiAREA e dtDatiPROGETTO vanno considerati anche i prodotti non associati a progetti.
            DataTable dtProdottiNonAssociati = dataAccess.ExecuteDataTableStoredProcedure(DBProvider.SqlServerStampeC6, "[C6MartPeriodico].[PL_Prodotti_Non_Associati_Area_Inv]", parameters);

            #region Creazione e popolamento DataTable dtProdottiNonAssociati
            DataTable dtDatiProdottiNonAssociati = new DataTable();

            if (dtProdottiNonAssociati.Rows.Count > 0)
            {
                dtDatiProdottiNonAssociati.Columns.Add("need_area", typeof(string));
                dtDatiProdottiNonAssociati.Columns.Add("NOME_PROGETTO", typeof(string));
                dtDatiProdottiNonAssociati.Columns.Add("ControvaloreAttuale", typeof(decimal));
                dtDatiProdottiNonAssociati.Columns.Add("var_needarea", typeof(decimal));
                dtDatiProdottiNonAssociati.Columns.Add("var_needareaString", typeof(string));
                dtDatiProdottiNonAssociati.Columns.Add("ORDINAMENTO_PROGETTO", typeof(int));

                DataRow drDatiProdottiNonAssociati = dtDatiProdottiNonAssociati.NewRow();
                drDatiProdottiNonAssociati["NEED_AREA"] = dtProdottiNonAssociati.Rows[0]["NEED_AREA"];
                drDatiProdottiNonAssociati["NOME_PROGETTO"] = dtProdottiNonAssociati.Rows[0]["NOME_PROGETTO"];
                drDatiProdottiNonAssociati["CONTROVALOREATTUALE"] = dtProdottiNonAssociati.Compute("Sum(CONTROVALOREATTUALE)", string.Empty);
                drDatiProdottiNonAssociati["var_needarea"] = dtProdottiNonAssociati.Rows[0]["var_needarea"];
                drDatiProdottiNonAssociati["var_needareaString"] = dtProdottiNonAssociati.Rows[0]["var_needareaString"];
                //drDatiProdottiNonAssociati["ORDINAMENTO_PROGETTO"] = Convert.ToInt32(dtDatiProdottiNonAssociati.Rows[0]["ORDINAMENTO_PROGETTO"]);
                drDatiProdottiNonAssociati["ORDINAMENTO_PROGETTO"] = Convert.ToInt32(dtProdottiNonAssociati.Rows[0]["ORDINAMENTO_PROGETTO"]);
                dtDatiProdottiNonAssociati.Rows.Add(drDatiProdottiNonAssociati);
            }

            #endregion

            DataTable dtDati = new DataTable(); // datatable di return
            dtDati = dtDatiAREA;
            dtDati.Merge(dtDatiPROGETTO);

            if (dtDatiProdottiNonAssociati.Rows.Count > 0) // se ho prodotti non associati a progetti li aggiungo nel calcolo finale del peso percentuale e rischio relativo
                dtDati.Merge(dtDatiProdottiNonAssociati);

            return dtDati;
        }
        private static decimal getClientSelfNegCurrentAccountValue(DataAccessDE dataAccess, string rete, string codiceFiscale)
        {
            #region Settaggio parametri

            List<Parametro> parameters = new List<Parametro>()
            {
                new Parametro() {Value = rete, ParameterName ="Rete" },
                new Parametro() {Value = codiceFiscale, ParameterName ="CodiceFiscale" },
            };

            #endregion

            object ClientSelfNegCurrentAccountValue;
            if (UtilityManager.getAppSetting("Periodico") == "0")
            {
                ClientSelfNegCurrentAccountValue = dataAccess.ExecuteScalarStoredProcedure(DBProvider.SqlServerStampeC6, "[C6Mart].[PL_GetClientSelfNegCurrentAccountValue]", parameters);
            }
            else
            {
                ClientSelfNegCurrentAccountValue = dataAccess.ExecuteScalarStoredProcedure(DBProvider.SqlServerStampeC6, "[C6MartPeriodico].[PL_GetClientSelfNegCurrentAccountValue]", parameters);
            }



            if (ClientSelfNegCurrentAccountValue != null)
                return decimal.Parse(ClientSelfNegCurrentAccountValue.ToString());
            else
                return 0;
        }
        private static decimal getClientNegativeCurrentAccountsValue(DataAccessDE dataAccess, string rete, string codiceFiscale)
        {
            #region Settaggio parametri

            List<Parametro> parameters = new List<Parametro>()
            {
                new Parametro() {Value = rete, ParameterName ="Rete" },
                new Parametro() {Value = codiceFiscale, ParameterName ="CodiceFiscale" },
            };

            #endregion

            object clientNegativeCurrentAccountsValue;
            if (UtilityManager.getAppSetting("Periodico") == "0")
            {
                clientNegativeCurrentAccountsValue = dataAccess.ExecuteScalarStoredProcedure(DBProvider.SqlServerStampeC6, "[C6Mart].[PL_GetClientNegativeCurrentAccountsValue]", parameters);
            }
            else
            {
                clientNegativeCurrentAccountsValue = dataAccess.ExecuteScalarStoredProcedure(DBProvider.SqlServerStampeC6, "[C6MartPeriodico].[PL_GetClientNegativeCurrentAccountsValue]", parameters);
            }
            //object clientNegativeCurrentAccountsValue = DataAccess.ExecuteScalarStoredProcedure(DBProvider.SqlServerStampeC6, "[C6MartPeriodico].[PL_GetClientNegativeCurrentAccountsValue]", parametri);



            if (clientNegativeCurrentAccountsValue != null)
                return decimal.Parse(clientNegativeCurrentAccountsValue.ToString());
            else
                return 0;
        }
        public static StringCollection getMTQueries(ReportType reportType, DataAccessDE dataAccess)
        {
            StringCollection stringCollection = new StringCollection();
            List<Parametro> parametri = new List<Parametro>();
            Parametro parametro = new Parametro();
            parametro.ParameterName = "idReport";
            parametro.DbType = DbType.Int32;
            parametro.Value = reportType.IdReport;
            parametri.Add(parametro);
            parametro = new Parametro();
            parametro.ParameterName = "idModello";
            parametro.DbType = DbType.Int32;
            parametro.Value = reportType.IdModello;
            parametri.Add(parametro);
            bool checkPeriodico = (UtilityManager.getAppSetting("Periodico") == "1") ? true : false;
            if (checkPeriodico)
            {
                parametro = new Parametro();
                parametro.ParameterName = "periodicita";
                parametro.DbType = DbType.String;
                parametro.Value = 'T';
                parametri.Add(parametro);

            }

            using (IDataReader reader = dataAccess.ExecuteDataReaderStoredProcedure(DBProvider.SqlServerStampeC6, "[C6Mart].[GESTIONE_C6_S_Generator]", parametri))
            {
                string queryLetta;
                while (reader.Read())
                {
                    queryLetta = reader["querySqlSezione"].ToString();
                    if (!string.IsNullOrEmpty(queryLetta))
                        stringCollection.Add(reader["querySqlSezione"].ToString());
                }
            }
            return stringCollection;
        }
        public static int getEndThread(DataThread dataThread, int idReport, int docPage)
        {
            if (UtilityManager.getAppSetting("SavePDFtoDISK") == "1")
                return 0;

            List<Parametro> parametri = new List<Parametro>();
            Parametro parametro = new Parametro();
            parametro.ParameterName = "Rete";
            parametro.DbType = DbType.AnsiStringFixedLength;
            parametro.Value = dataThread.Rete;
            parametri.Add(parametro);

            parametro = new Parametro();
            parametro.ParameterName = "CodiceFiscale";
            parametro.DbType = DbType.String;
            parametro.Value = dataThread.CodiceFiscale;
            parametri.Add(parametro);

            parametro = new Parametro();
            parametro.ParameterName = "TipoReport";
            parametro.DbType = DbType.String;
            parametro.Value = dataThread.TipoReport;
            parametri.Add(parametro);

            string queryInserimento = UtilityManager.getAppSetting("SP_GESTIONE_INSERT_PDF_FTP_GET_ID");
            //DataAccess.ExecuteNonQueryStoredProcedure(DBProvider.SqlServerStampeC6, queryInserimento, parametri);
            try
            {
                return Convert.ToInt32(dataThread.DataAccess.ExecuteScalarStoredProcedure(DBProvider.SqlServerStampeC6, queryInserimento, parametri));
            }
            catch (Exception)
            {

                return -1;

            }
        }
        public static int setEndThread(DataThread dataThread, int idReport, int docPage)
        {
            if (UtilityManager.getAppSetting("SavePDFtoDISK") == "1")
                return 0;

            List<Parametro> parametri = new List<Parametro>();
            Parametro parametro = new Parametro();
            parametro.ParameterName = "Rete";
            parametro.DbType = DbType.AnsiStringFixedLength;
            parametro.Value = dataThread.Rete;
            parametri.Add(parametro);

            parametro = new Parametro();
            parametro.ParameterName = "CodiceFiscale";
            parametro.DbType = DbType.String;
            parametro.Value = dataThread.CodiceFiscale;
            parametri.Add(parametro);

            //FC Gestione Parallelizzazione Processi
            // idReport � gestito dalla SP inserimento Gestione_Pdf_Ftp

            int idReportPdf = dataThread.TipoReport == TipoReport.DIAGNOSI.ToString() ? dataThread.IdReportPDFDiagnosi : dataThread.IdReportPDFMonitoraggio;
            idReportPdf = idReportPdf == 0 ? idReport : idReportPdf;
            parametro = new Parametro();
            parametro.ParameterName = "idReport";
            parametro.DbType = DbType.Int32;
            parametro.Value = idReportPdf;
            parametri.Add(parametro);

            parametro = new Parametro();
            parametro.ParameterName = "NomeFile";
            parametro.DbType = DbType.String;
            parametro.Value = dataThread.NomeFileReport;
            parametri.Add(parametro);

            parametro = new Parametro();
            parametro.ParameterName = "TipoReport";
            parametro.DbType = DbType.String;
            parametro.Value = dataThread.TipoReport;
            parametri.Add(parametro);

            parametro = new Parametro();
            parametro.ParameterName = "NumeroPagine";
            parametro.DbType = DbType.Int32;
            parametro.Value = docPage;
            parametri.Add(parametro);

            //V Se � un report periodico salvo anche l'RFA in GESTIONE_PDF_FTP
            if (dataThread.Periodico)
            {
                parametro = new Parametro();
                parametro.ParameterName = "RFA";
                parametro.DbType = DbType.Decimal;
                parametro.Value = dataThread.Patrimoniobancafideuramctv;
                parametri.Add(parametro);


                parametro = new Parametro();
                parametro.ParameterName = "CodiceContratto";
                parametro.DbType = DbType.String;
                parametro.Value = dataThread.CodiceContratto;
                parametri.Add(parametro);


            }


            string queryInserimento = UtilityManager.getAppSetting("QueryInserimentoPDF_FTP");
            //DataAccess.ExecuteNonQueryStoredProcedure(DBProvider.SqlServerStampeC6, queryInserimento, parametri);
            var r = new object() ;
            try
            {
                r = dataThread.DataAccess.ExecuteScalarStoredProcedure(DBProvider.SqlServerStampeC6, queryInserimento, parametri);
                return Convert.ToInt32(r);
            }
            catch (Exception ex)
            {
                logger.Error(ex.Message + "::" + idReportPdf.ToString() + " " + dataThread.CodiceFiscale + " " + dataThread.TipoReport + r.ToString());
                return -1;

            }

        }

        public static string ReplaceVariables(string testodarimpiazzare, DataThread _dataThread)
        {
            string testoOriginale = testodarimpiazzare;

            testoOriginale = testoOriginale.Replace("$/Area/$", _dataThread.AreaEstesa);

            if (_dataThread.Area != "Inv")
                testoOriginale = testoOriginale.Replace("$/AreaProgetto/$", _dataThread.AreaEstesa);
            else
                testoOriginale = testoOriginale.Replace("$/AreaProgetto/$", _dataThread.Progetto);

            if (_dataThread.Area != "Inv")
                testoOriginale = testoOriginale.Replace("$/AreaProgettoA/$", "all�area di " + _dataThread.AreaEstesa);
            else
                testoOriginale = testoOriginale.Replace("$/AreaProgettoA/$", "al progetto " + _dataThread.Progetto);

            if (_dataThread.Area != "Inv")
                testoOriginale = testoOriginale.Replace("$/AreaProgettoD/$", "dell�area di " + _dataThread.AreaEstesa);
            else
                testoOriginale = testoOriginale.Replace("$/AreaProgettoD/$", "del progetto " + _dataThread.Progetto);

            testoOriginale = testoOriginale.Replace("$/Progetto/$", _dataThread.Progetto);

            if (_dataThread.Intermediario == "Altro")
                testoOriginale = testoOriginale.Replace("$/Intermediario/$", "Altro intermediario");
            else
                testoOriginale = testoOriginale.Replace("$/Intermediario/$", _dataThread.Intermediario);

            if (_dataThread.Rete == "F")
                //FC 26062015 Aggionamento nuova Ragione Sociale
                //testoOriginale = testoOriginale.Replace("$/Banca/$", "Banca Fideuram");
                testoOriginale = testoOriginale.Replace("$/Banca/$", "Fideuram");
            else
                testoOriginale = testoOriginale.Replace("$/Banca/$", "Sanpaolo Invest");

            testoOriginale = testoOriginale.Replace("$/FontSize/$", "</font><font pointSize='6'>font size, </font>");

            return testoOriginale;
        }

        /// <summary>
        /// Sostituisce le variabili presenti nel testo (indicate con $/...../$ con il valore corrispondente
        /// I dati vengono presi dalle propriet� dell'oggetto sezione passato in input.
        /// </summary>
        /// <param name="testodarimpiazzare"></param>
        /// <returns></returns>
        public static string ReplaceVariables(string testodarimpiazzare, SezioneReport sezione)
        {
            string testoOriginale = testodarimpiazzare;
            char[] define = { '$', '/', ',', '.' };

            const char Space = ' ';

            char[] delimiters = new char[]
            {
                Space
            };


            // split the string and then iterate over the
            // resulting array of strings
            if (testodarimpiazzare != " ")
                foreach (string variabile in testodarimpiazzare.Split(delimiters))
                {
                    string app = variabile.TrimStart(define);
                    app = app.TrimEnd(define);
                    switch (app)
                    {
                        #region Area
                        case "Area":
                            testoOriginale = testoOriginale.Replace("$/Area/$", sezione.AreaProgettoDescrizione);
                            break;
                        #endregion

                        #region AreaProgetto
                        case "AreaProgetto":
                            if (sezione.AreaProgettoCodice.ToLower() != "inv")
                                testoOriginale = testoOriginale.Replace("$/AreaProgetto/$", sezione.AreaProgettoDescrizione);
                            else
                                testoOriginale = testoOriginale.Replace("$/AreaProgetto/$", sezione.NomeProgetto);

                            break;
                            #endregion
                    }
                }

            return testoOriginale;
        }



        /// <summary>
        /// Sostituisce le variabili presenti nel testo (indicate con $/...../$ con il valore corrispondente
        /// I dati vengono presi dalle propriet� dell'oggetto sezione passato in input.
        /// Aggiunge gli apici all'inizio e alla fine del testo da rimpiazzato (solo per i nomi dei progetti investimento).
        /// </summary>
        /// <param name="testodarimpiazzare">testo</param>
        /// <param name="sezione">oggetto sezione da cui prendere i dati</param>
        /// <param name="aggiuntaapici">Se true aggiunge le virgolette (apici) prima e dopo il testo sostituito</param>
        /// <returns></returns>
        public static string ReplaceVariables(string testodarimpiazzare, SezioneReport sezione, bool aggiuntaapici)
        {
            string testoOriginale = testodarimpiazzare;
            char[] define = { '$', '/', ',', '.' };

            const char Space = ' ';

            char[] delimiters = new char[]
            {
                Space
            };


            // split the string and then iterate over the
            // resulting array of strings
            if (testodarimpiazzare != " ")
                foreach (string variabile in testodarimpiazzare.Split(delimiters))
                {
                    string app = variabile.TrimStart(define);
                    app = app.TrimEnd(define);
                    switch (app)
                    {
                        #region Area
                        case "Area":
                            testoOriginale = testoOriginale.Replace("$/Area/$", sezione.AreaProgettoDescrizione);
                            break;
                        #endregion

                        #region AreaProgetto
                        case "AreaProgetto":
                            if (sezione.AreaProgettoCodice.ToLower() != "inv")
                                testoOriginale = testoOriginale.Replace("$/AreaProgetto/$", sezione.AreaProgettoDescrizione);
                            else
                            {
                                if (aggiuntaapici)
                                    testoOriginale = testoOriginale.Replace("$/AreaProgetto/$", "''" + sezione.NomeProgetto + "''");
                                else
                                    testoOriginale = testoOriginale.Replace("$/AreaProgetto/$", sezione.NomeProgetto);
                            }
                            break;
                            #endregion
                    }
                }

            return testoOriginale;
        }

        /// <summary>
        /// Return the Risk Class depending on the passed value 
        /// <Owner> Marian Zaki</Owner>
        /// <Date> 04052010 </Date>
        /// </summary>
        /// <param name="riskCreditClass">
        ///     case 1: Class 1
        ///     case 2: Class 2
        ///     case 3: Class 3
        /// </param>
        /// <returns> The class name </returns>
        public static string GetRiskCreditClassName(string riskCreditClass)
        {
            float riskCreditClassFloatValue;
            int riskCreditClassValue = 0;
            string className = string.Empty;
            if (float.TryParse(riskCreditClass, out riskCreditClassFloatValue))
            {
                riskCreditClassValue = Convert.ToInt32(riskCreditClassFloatValue);
            }
            else if (int.TryParse(riskCreditClass, out riskCreditClassValue)) { }

            if (riskCreditClassValue != 0)
            {

                switch (riskCreditClassValue)
                {
                    case 1:
                        className = Resource.RiskCreditClass1;
                        break;
                    case 2:
                        className = Resource.RiskCreditClass2;
                        break;
                    case 3:
                        className = Resource.RiskCreditClass3;
                        break;
                    case 4:
                        className = Resource.RiskCreditOltreClasse3;
                        break;
                    default:
                        className = string.Empty;
                        break;

                }

                return className;
            }
            else
                return string.Empty;
        }


        public static string GetRiskCreditEmitClassName(string riskCreditClass)
        {
            float riskCreditClassFloatValue;
            int riskCreditClassValue = 0;
            string className = string.Empty;
            if (float.TryParse(riskCreditClass, out riskCreditClassFloatValue))
            {
                riskCreditClassValue = Convert.ToInt32(riskCreditClassFloatValue);
            }
            else if (int.TryParse(riskCreditClass, out riskCreditClassValue)) { }

            if (riskCreditClassValue != 0)
            {

                switch (riskCreditClassValue)
                {
                    case 1:
                        className = Resource.RiskCreditClassEmit1;
                        break;
                    case 2:
                        className = Resource.RiskCreditClassEmit2;
                        break;
                    case 3:
                        className = Resource.RiskCreditClassEmit3;
                        break;
                    case 4:
                        className = Resource.RiskCreditClassEmit4;
                        break;
                    case 5:
                        className = Resource.RiskCreditClassEmit5;
                        break;
                    case 6:
                        className = Resource.RiskCreditClassEmit6;
                        break;
                    case 7:
                        className = Resource.RiskCreditClassEmit7;
                        break;
                    case 8:
                        className = Resource.RiskCreditClassEmit8;
                        break;
                    case 9:
                        className = Resource.RiskCreditClassEmit9;
                        break;
                    case 10:
                        className = Resource.RiskCreditClassEmit10;
                        break;
                    default:
                        className = string.Empty;
                        break;

                }

                return className;
            }
            else
                return string.Empty;
        }


    }
}