using System;
using System.Web;
using System.Text;
using System.Data;
using System.Collections;
using System.Collections.Generic;

namespace PDFGenerator.BusinessLayer.DataSection
{

    public class DSS170RischioDiversificazione : IDataSection
    {
        private static NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger();

        private TipoReport _tiporeport;

        /// <summary>
        /// Tipologia report.
        /// </summary>
        public TipoReport TipoReport
        {
            get
            {
                return _tiporeport;
            }
            set
            {
                _tiporeport = value;
            }
        }


        public DataSectionResult getDataSection(List<SessionStruct> tabelleSessione, string querySql, DataThread dataThread)
        {

            try
            {
                DataSectionResult dsr = new DataSectionResult();

                FormatNum conv = new FormatNum();
                DataSetS170 ds170 = new DataSetS170();
                DataSetS170.RischioDiversificazioneRow dr;
                DataSetS170.RischioPatrimonioFinanziarioRow patrimonioFinanziario;
                DataSetS170.RischioDiversificazioneTableRow rischioDiversificazione;

                //MIFID2 Nei casi particolari sulla rischiosità e l'adeguatezza, il valore di Rischio Mercato, se 0, deve essere impostato a "n.c."

                string preQuerySql = dataThread.Periodico? "[C6MartPeriodico].[PL_D_S178CasiParticolari]": "[C6Mart].[PL_D_S178CasiParticolari]";
                int IdCaso = 0;

                DataTable dtTestoKO = SectionManager.GetDataSection(tabelleSessione, preQuerySql, dataThread);

                if (dtTestoKO.Rows.Count > 0)
                    IdCaso = (int) dtTestoKO.Rows[0]["ID"];
                //--MIFID2


                //MIFID2 CR Napolitano: va inserita una nota sul Limite Massimo (su Complessità), quindi il numero di asterischi viene calcolato in base alle note precedenti.
                int notaComplessita = dataThread.TipoReport.ToUpper().Equals("DIAGNOSI") ? 1 : 0;

                ds170.RischioDiversificazione.Columns["Copertura"].Caption = "Copertura <BR> (%)";

                if (dataThread.TipoReport.ToUpper().Equals("DIAGNOSI"))
                    ds170.RischioDiversificazioneTable.Columns["Controvalore"].Caption = "Controvalore* (€)";

                DataTable dt = SectionManager.GetDataSection(tabelleSessione, querySql, dataThread);

                if (dt.Rows.Count > 0)
                {
                    for (int r = 0; r < (dt.Rows.Count < 3 ? 1 : 3); r++)
                    //for (int r = 0; r < dt.Rows.Count; r++)
                    {
                        DataRow row = dt.Rows[r];
                        dr = ds170.RischioDiversificazione.NewRischioDiversificazioneRow();
                        dr.patrimonio = row["patrimonio"].ToString();

                        dr.var = Convert.ToDecimal(row["var"]);

                        if (row["coperturaString"] != DBNull.Value)
                            dr.copertura = row["coperturaString"].ToString();
                        else
                            dr.copertura = conv.ConvertNum(row["copertura"]);
                        //dr.diversificazione = Convert.ToDecimal(row["diversificazione"]);
                        if (row["diversificazione"] != DBNull.Value)
                            dr.diversificazione = Convert.ToDecimal(row["diversificazione"]);
                        else
                            dr.diversificazione = 0;

                        //MIFID2 20180521
                        dr.ordine = Convert.ToInt32(row["ordine"]);
                        //--MIFID2
                        //Adriano 20180405 da prendere dalla stored procedure
                        dr.complessita = row["complessita"].ToString();
                        //--Adriano 20180405
                        ds170.RischioDiversificazione.Rows.Add(dr);

                        patrimonioFinanziario = ds170.RischioPatrimonioFinanziario.NewRischioPatrimonioFinanziarioRow();
                        int profilo_code = Convert.ToInt32(row["profiloCode"]);
                        //patrimonioFinanziario.descrizioneProfilo = "Profilo Cliente: " + profilo_code.ToString();
                        string valoreProfilo = getProfiloName(profilo_code);
                        patrimonioFinanziario.descrizioneProfilo = "Profilo Cliente: " + valoreProfilo;
                        patrimonioFinanziario.valoreProfilo = profilo_code.ToString();
                        //20180914 AC
                        patrimonioFinanziario.var = (dataThread.IsProffesionalClient && profilo_code==5) ? 50.00M: Convert.ToDecimal(SoglieVar.ConvOld(row["var_profilo"]));
                        ds170.RischioPatrimonioFinanziario.Rows.Add(patrimonioFinanziario);


                        rischioDiversificazione = ds170.RischioDiversificazioneTable.NewRischioDiversificazioneTableRow();
                        rischioDiversificazione.patrimonio = row["patrimonio"].ToString();
                        rischioDiversificazione.ordine = Convert.ToInt32(row["ordine"]);
                        //MIFID2 20180522
                        //20180904 Su segnalazione Napolitano, per i professionali va mostrata la complessità relativa al Patrimonio

                        //// CR Napolitano, per i clienti professionali, la complessità deve essere posta a "n.a."
                        //if (dataThread.IsProffesionalClient)
                        //{
                        //    rischioDiversificazione.complessita = "n.a.";
                        //}
                        //else
                        //{

                            //Vanno sempre mostrati due asterischi per Diagnosi e uno per Monitoraggio che rimandano a una nota (ovviamente se non è un trattino)
                            if (row["complessita"].ToString().Equals("-"))
                                rischioDiversificazione.complessita = row["complessita"].ToString();
                            else
                            {
                                if (dataThread.TipoReport.ToUpper().Equals("DIAGNOSI"))
                                {
                                    rischioDiversificazione.complessita = row["complessita"].ToString() + "**";
                                    notaComplessita = 2;
                                }
                                else
                                {
                                    rischioDiversificazione.complessita = row["complessita"].ToString() + "*";
                                    notaComplessita = 1;
                                }
                            }
                        //}

                        //rischioDiversificazione.controvalore = Convert.ToDecimal(row["CTV_AGGREG"]).ToString();
                        rischioDiversificazione.controvalore = conv.ConvertNum(row["CTV_AGGREG"].ToString());
                        
                        //MIFID2 20180718 Aggiunto per includere nel CTV del patrimonio Fideuram (riga 0) anche le altre voci, cc negativo, partite viaggianti, linea self
                        if (r == 0)
                        {
                            decimal tot = Convert.ToDecimal( row["CTV_AGGREG"]) + //dataThread.PatrimonioBancaFideuramCtvAlNettoContoCorrente +
                                            dataThread.ContoCorrente + 
                                            dataThread.PartiteViaggiantiInvestimento + 
                                            dataThread.PartiteViaggiantiDisinvestimento + 
                                            dataThread.TotalSelfNegCurrentAccountValue;

                            rischioDiversificazione.controvalore = conv.ConvertNum(tot.ToString());
                        }
                        //MIFID2

                        //#region Totale Patrimonio
                        //decimal risorseFinanziarie = dataThread.PatrimonioBancaFideuramCtvAlNettoContoCorrente;
                        //decimal CC = dataThread.ContoCorrente;
                        //decimal investimentiInCorso = dataThread.PartiteViaggiantiInvestimento + dataThread.PartiteViaggiantiDisinvestimento;

                        //decimal totale = risorseFinanziarie + CC + investimentiInCorso + dataThread.TotalSelfNegCurrentAccountValue;

                        ////rowTableMonit.TotalePatrimonio = totale.ToString();
                        //rowTableMonit.TotalePatrimonio = conv.ConvertNum(totale);

                        //#endregion



                        if (row["CREDITRISK"] != DBNull.Value)
                        {
                            rischioDiversificazione.rischioCredito = UtilityBusinessLayer.GetRiskCreditClassName(row["CREDITRISK"].ToString());
                        }
                        else
                            //20180914 su segnalazione Napolitano
                            //rischioDiversificazione.rischioCredito = "n.c.";
                            rischioDiversificazione.rischioCredito = "n.a.";

                        // MZ: Show n.c. as a value for VAR if there is no coverage
                        if (row["varString"] != DBNull.Value)
                        {
                            rischioDiversificazione.varString = row["varString"].ToString();

                        }
                        else
                        {
                            rischioDiversificazione.varString = conv.ConvertNum(row["var"], 2).ToString();
                        }

                        //MIFID2 20180702 su richiesta Napolitano: se il rischio mercato è 0, portare a "n.c." nei casi Particolari 1 e 3
                        if (IdCaso == 1 || IdCaso == 3)
                        {
                            if (rischioDiversificazione.varString.Equals("0,00"))
                                rischioDiversificazione.varString = "n.c.";
                        }
                        //--MIFID2

                        if (row["coperturaString"] != DBNull.Value)
                            rischioDiversificazione.copertura = row["coperturaString"].ToString();
                        else
                            rischioDiversificazione.copertura = conv.ConvertNum(row["copertura"]);

                        //MIFID2 20180619 Gestione indicatore per patrimonio terzi e complessivo (per Diagnosi) che non viene restituito
                        //rischioDiversificazione.diversificazione = Convert.ToDecimal(conv.ConvertNum(row["diversificazione"])).ToString();

                        if (row["diversificazione"] != DBNull.Value)
                            rischioDiversificazione.diversificazione = Convert.ToDecimal(conv.ConvertNum(row["diversificazione"])).ToString();
                        else
                            rischioDiversificazione.diversificazione = "-";
                        //--MIFID2

                        ds170.RischioDiversificazioneTable.Rows.Add(rischioDiversificazione);
                    }

                    //MIFID2 20180405 Inserimento ultima riga per la tabella, come richiesto nel documento MIFID II

                    string maxLimQStr = dataThread.Periodico ? "[C6MartPeriodico].[PL_S170LimitiMassimi]" : "[C6Mart].[PL_S170LimitiMassimi]";

                    DataTable dtLimiteMassimo = SectionManager.GetDataSection(tabelleSessione, maxLimQStr, dataThread);

                    rischioDiversificazione = ds170.RischioDiversificazioneTable.NewRischioDiversificazioneTableRow();
                    rischioDiversificazione.patrimonio = "Limite massimo profilo";
                    rischioDiversificazione.controvalore = "-";
                    rischioDiversificazione.rischioCredito = dtLimiteMassimo.Rows[0]["RischioCreditoMassimo"].ToString();
                    rischioDiversificazione.varString = dataThread.IsProffesionalClient && ds170.RischioPatrimonioFinanziario[0].valoreProfilo == "5" ? ds170.RischioPatrimonioFinanziario[0].var.ToString() : dtLimiteMassimo.Rows[0]["varMassimo"].ToString();
                    rischioDiversificazione.diversificazione = "-";
                    //MIFID2 CR Napolitano
                    // Per i clienti professionali va impostato come "n.a."
                    // altrimenti, se persona giuridica con delegati profilati, va riportata una nota sul Limite Massimo Complessità

                    //rischioDiversificazione.complessita = dtLimiteMassimo.Rows[0]["Complessita"].ToString();
                    if (dataThread.Flgprof.ToUpper().Equals("S"))
                        rischioDiversificazione.complessita = "n.a.";
                    else
                    {
                        if (!dtLimiteMassimo.Rows[0]["Complessita"].ToString().Equals("-") && !dtLimiteMassimo.Rows[0]["Complessita"].ToString().Equals("n.d."))
                        {
                            if (dataThread.Flagpg.Equals(1) && dataThread.Flagnqp.Equals("S") && dataThread.Flagprlrde.Equals("S"))
                            {
                                rischioDiversificazione.complessita = string.Concat(dtLimiteMassimo.Rows[0]["Complessita"].ToString(), new String('*', notaComplessita + 1));
                            }
                            else
                                rischioDiversificazione.complessita = dtLimiteMassimo.Rows[0]["Complessita"].ToString();

                        }
                        else
                            rischioDiversificazione.complessita = dtLimiteMassimo.Rows[0]["Complessita"].ToString();
                    }
                    rischioDiversificazione.ordine = 4;

                    ds170.RischioDiversificazioneTable.Rows.Add(rischioDiversificazione);

                    //--MIFID2 20180405

                    decimal coperturaRisorseNonAllocate = dataThread.VaRRisorseNonAssociate;
                    DataRow[] filtrata = ds170.RischioDiversificazione.Select("Copertura <> '100,00'");
                    bool _mostracolonnacopertura = filtrata.Length > 0 ? true : false;

                    DataSetS170.ResultSetRow rs170;
                    rs170 = ds170.ResultSet.NewResultSetRow();
                    rs170.MostraColonnaCopertura = _mostracolonnacopertura;
                    ds170.ResultSet.AddResultSetRow(rs170);
                }

                dsr.DatiSezione = ds170;
                dsr.Esito = ds170.RischioDiversificazione.Rows.Count;

                return dsr;
            }
            catch (Exception ex)
            {
                try
                {
                    logger.Error(string.Concat(ex.Message, " ", dataThread.CodiceFiscale));
                }
                catch { }
            }
            return null;
        }

        private string getProfiloName(int profilo_code)
        {
            string valoreProfilo = string.Empty;
            #region SWITCH CODICI PROFILO
            switch (profilo_code)
            {
                case 1:
                    valoreProfilo += " Prudente";
                    break;
                case 2:
                    valoreProfilo += " Moderato";
                    break;
                case 3:
                    valoreProfilo += " Equilibrato";
                    break;
                case 4:
                    valoreProfilo += " Dinamico";
                    break;
                case 5:
                    valoreProfilo += " Aggressivo";
                    break;
                default:
                    break;
            }
            #endregion
            return valoreProfilo;
        }
    }
}