using System;
using System.Data;
using System.Collections.Generic;
using System.Web;
using PDFGenerator.BusinessLayer.DataSection;
using PDFGenerator;
using PDFGenerator.BusinessLayer;

namespace PDFGenerator.BusinessLayer.DataSection
{
    public class DSFD169RischioMercatoRischioCredito : IDataSection
    {
        private static NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger();

        public DSFD169RischioMercatoRischioCredito()
        {
            //
            // TODO: Add constructor logic here
            //
        }

        public DataSectionResult getDataSection(List<SessionStruct> tabelleSessione, string querySql, DataThread dataThread)
        {
            //     return new DataSectionResult();
            try
            {
                DataSectionResult dsr = new DataSectionResult();
                DataSetS96 ds96 = new DataSetS96();
                FormatNum conv = new FormatNum();

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

                DataSetS96.DatiGraficoRow row;
                DataSetS96.DatiTabellaDiagnosiRow rowTableDiagnosi;
                DataSetS96.DatiTabellaMonitoraggioRow rowTableMonit;
                DataSetS96.IndicatoriRow rowIndicatori;

                bool isMonit = dataThread.TipoReport.ToUpper() == "MONITORAGGIO";
                DataView dw = new DataView(dt);
                DataTable table;
                if (dt.Rows.Count < 3)
                    dw.RowFilter = "InstituteName <> 'Patrimonio Complessivo'";

                table = dw.ToTable();

                #region Precalcolo degli Intermediari
                decimal tempPerc = 0;

                decimal controvaloreIntermediarioDiRete = 0;
                decimal percentualeIntermediarioDiRete = 0;

                decimal controvaloreAltriIntermediari = 0;
                decimal percentualeAltriIntermediari = 0;

                //Contrazioni delle stringhe di controllo con cui sono marcate le tuple ritornate nella sezione s6:
                string s6_DescrizioneIntermediarioFideuram = "BANCAFIDEURAM";
                string s6_DescrizioneIntermediarioSanPaolo = "SANPAOLOINVEST";
                string s6_DescrizioneIntermediarioIWPrivateInvestments = "IWPRIVATEINVESTMENTS"; //cecco
                string s6_DescrizioneDiControllo = string.Empty;

                //Contrazioni delle stringhe di controllo con cui sono marcate le tuple ritornate nella sezione s96:
                string s96_DescrizioneIntermediarioFideuram = "PATRIMONIOBANCAFIDEURAM";
                string s96_DescrizioneIntermediarioSanPaolo = "PATRIMONIOSANPAOLOINVEST";
                string s96_DescrizioneIntemediarioIWPrivateInvestments = "PATRIMONIOIWPRIVATEINV.";
                string s96_DescrizioneAltriIstituti = "PATRIMONIOALTRIISTITUTI";
                string s96_DescrizioneDiControllo = string.Empty;

                //Descrizioni usate nelle logiche di flusso:
                string descrizioneCorrente = string.Empty;

                //Se nel DataThread la DataTable relativa agli intermediari è diversa da NULL significa che la DSS6 è stata elaborata:
                //Nel caso abbia righe devo utilizzare i suoi controvalori e le sue percentuali per un calcolo di accorpamento in base alla rete.
                //Tale valore confluisce poi nella valorizzazione delle righe di diagnosi in questa classe.
                if (dataThread.DtDSS6Intermediari != null && dataThread.DtDSS6Intermediari.Rows.Count > 0)
                {
                    //Specifica delle stringhe di controllo degli intermediari per le tuple sia per la DSS6 che per la DSS96:
                    if (dataThread.Rete.ToUpper().Equals("F"))
                    {
                        s6_DescrizioneDiControllo = s6_DescrizioneIntermediarioFideuram;
                        s96_DescrizioneDiControllo = s96_DescrizioneIntermediarioFideuram;
                    }
                    else if (dataThread.Rete.ToUpper().Equals("S"))
                    {
                        s6_DescrizioneDiControllo = s6_DescrizioneIntermediarioSanPaolo;
                        s96_DescrizioneDiControllo = s96_DescrizioneIntermediarioSanPaolo;
                    }
                    else
                    {
                        s6_DescrizioneDiControllo = s6_DescrizioneIntermediarioIWPrivateInvestments;
                        s96_DescrizioneDiControllo = s96_DescrizioneIntemediarioIWPrivateInvestments;
                    }

                    for (int i = 0; i < dataThread.DtDSS6Intermediari.Rows.Count; i++)
                    {
                        descrizioneCorrente = dataThread.DtDSS6Intermediari.Rows[i]["Descrizione"].ToString().Replace(" ", string.Empty).ToUpper();
                        if (descrizioneCorrente.Equals(s6_DescrizioneDiControllo))
                        {
                            controvaloreIntermediarioDiRete += Convert.ToDecimal(dataThread.DtDSS6Intermediari.Rows[i]["Controvalore"]);
                            percentualeIntermediarioDiRete += Convert.ToDecimal(dataThread.DtDSS6Intermediari.Rows[i]["Percentuale"]);
                        }
                        else
                        {
                            controvaloreAltriIntermediari += Convert.ToDecimal(dataThread.DtDSS6Intermediari.Rows[i]["Controvalore"]);
                            percentualeAltriIntermediari += Convert.ToDecimal(dataThread.DtDSS6Intermediari.Rows[i]["Percentuale"]);
                        }
                    }
                }
                #endregion

                foreach (DataRow dtRow in table.Rows)
                {
                    row = ds96.DatiGrafico.NewDatiGraficoRow();
                    rowTableDiagnosi = ds96.DatiTabellaDiagnosi.NewDatiTabellaDiagnosiRow();
                    rowTableMonit = ds96.DatiTabellaMonitoraggio.NewDatiTabellaMonitoraggioRow();
                    rowIndicatori = ds96.Indicatori.NewIndicatoriRow();

                    #region popolamento dataSet del grafico e dati tabella comuni
                    row.DescrizionePatrimonio = dtRow["InstituteName"].ToString();

                    if (isMonit)
                    {
                        rowTableMonit.DescrizionePatrimonio = "    " + dtRow["InstituteName"].ToString();
                    }
                    else
                    {
                        rowTableDiagnosi.DescrizionePatrimonio = "    " + dtRow["InstituteName"].ToString();
                    }

                    if (dtRow["riskClassString"] != DBNull.Value)
                    {
                        row.ClasseRischioCreditoStr = dtRow["riskClassString"].ToString();

                        if (isMonit)
                            rowTableMonit.RischioCredito = row.ClasseRischioCreditoStr;
                        else
                            rowTableDiagnosi.RischioCredito = row.ClasseRischioCreditoStr;
                    }
                    else
                    {
                        row.ClasseRischioCredito = Convert.ToInt16(dtRow["riskClass"]);

                        if (isMonit)
                            rowTableMonit.RischioCredito = UtilityBusinessLayer.GetRiskCreditClassName(row.ClasseRischioCredito.ToString());
                        else
                            rowTableDiagnosi.RischioCredito = UtilityBusinessLayer.GetRiskCreditClassName(row.ClasseRischioCredito.ToString());
                    }
                    //V attenzione vedere come si comporta il componente grafico, altrimenti inserire il riskClassMaxString
                    if (dtRow["riskClassMax"] == DBNull.Value)
                        row.RischioCreditoMaxStr = "N.C.";
                    else
                        row.RischioCreditoMax = Convert.ToInt16(dtRow["riskClassMax"]);

                    if (dtRow["varString"] != DBNull.Value)
                    {
                        row.RischioMercatoStr = dtRow["varString"].ToString();

                        if (isMonit)
                            rowTableMonit.RischioMercato = row.RischioMercatoStr;
                        else
                            rowTableDiagnosi.RischioMercato = row.RischioMercatoStr;
                    }
                    else
                    {
                        row.RischioMercato = Math.Round(Convert.ToDecimal(dtRow["var"]), 2);
                        if (isMonit)
                            rowTableMonit.RischioMercato = row.RischioMercato.ToString();
                        else
                            rowTableDiagnosi.RischioMercato = row.RischioMercato.ToString();
                    }

                    if (dtRow["varMax"] == DBNull.Value)
                        row.RischioMercatoMaxStr = "N.C.";
                    else
                        row.RischioMercatoMax = Convert.ToDecimal(SoglieVar.ConvOld(dtRow["varMax"]));

                    if (dtRow["coverageString"] != DBNull.Value)
                    {
                        row.CoperturaStr = dtRow["coverageString"].ToString();
                        if (isMonit)
                            rowTableMonit.Copertura = row.CoperturaStr;
                        else
                            rowTableDiagnosi.Copertura = row.CoperturaStr;
                    }
                    else
                    {
                        row.Copertura = Math.Round(Convert.ToDecimal(dtRow["coverage"]), 2);
                        if (isMonit)
                            rowTableMonit.Copertura = row.Copertura.ToString();
                        else
                            rowTableDiagnosi.Copertura = row.Copertura.ToString();
                    }

                    if (dtRow["riskClassString"] != DBNull.Value)
                        row.UllyPrec = 0.01M;
                    else
                        row.UllyPrec = Convert.ToDecimal(dtRow["Ully_perc"]);

                    //V verificare
                    if (dataThread.profiloIsAct)
                        row.Profilo = "A";

                    row.ordine = Convert.ToInt32(dtRow["ordine"]);

                    ds96.DatiGrafico.AddDatiGraficoRow(row);
                    #endregion

                    #region popolamento parte diagnosi
                    if (!isMonit)
                    {
                        if (dataThread.DtDSS6Intermediari != null && dataThread.DtDSS6Intermediari.Rows.Count > 0)
                        {
                            descrizioneCorrente = dtRow["InstituteName"].ToString().Replace(" ", string.Empty).ToUpper();
                            if (descrizioneCorrente.Equals(s96_DescrizioneDiControllo))
                            {
                                //V Lo prendo sempre dalla query il patrimonio casa, la s6 esclude solo il cc negativo e in caso di ppvv avrei una rapp
                                //errata 
                                rowTableDiagnosi.Controvalore = Convert.ToDecimal(dtRow["CTV"]);//controvaloreIntermediarioDiRete;
                                tempPerc = percentualeIntermediarioDiRete;
                            }
                            else if (descrizioneCorrente.Equals(s96_DescrizioneAltriIstituti))
                            {
                                rowTableDiagnosi.Controvalore = controvaloreAltriIntermediari;
                                tempPerc = percentualeAltriIntermediari;
                            }
                            else
                            {
                                rowTableDiagnosi.Controvalore = Convert.ToDecimal(dtRow["CTV"]);
                                tempPerc = Math.Round(Convert.ToDecimal(dtRow["percentage"]), 2, MidpointRounding.AwayFromZero);
                            }
                        }
                        else
                        {
                            rowTableDiagnosi.Controvalore = Convert.ToDecimal(dtRow["CTV"]);
                            tempPerc = Math.Round(Convert.ToDecimal(dtRow["percentage"]), 2, MidpointRounding.AwayFromZero);
                        }

                        rowTableDiagnosi.Percentuale = tempPerc;
                        ds96.DatiTabellaDiagnosi.AddDatiTabellaDiagnosiRow(rowTableDiagnosi);
                    }
                    #endregion

                    #region popolamento parte monitoraggio
                    if (isMonit)
                    {
                        //MIFID2 20180504 Campi inesistenti nella riga
                        //rowIndicatori.Complessita = Convert.ToBoolean(dtRow["ComplexityIsOk"]);
                        //rowIndicatori.RischioMercato = Convert.ToBoolean(dtRow["VarIsOk"]);
                        //rowIndicatori.RischioCredito = Convert.ToBoolean(dtRow["RiskClassIsOk"]);
                        //rowIndicatori.Complessita = true;
                        //rowIndicatori.RischioMercato = true;
                        //rowIndicatori.RischioCredito = true;
                        //--MIFID2
                        ds96.DatiTabellaMonitoraggio.AddDatiTabellaMonitoraggioRow(rowTableMonit);
                        ds96.Indicatori.AddIndicatoriRow(rowIndicatori);
                    }
                    #endregion
                }

                dsr.Esito = ds96.DatiGrafico.Rows.Count;
                dsr.DatiSezione = ds96;
                return dsr;
            }
            catch (Exception ex)
            {
                try
                {
                    logger.Error(String.Concat(ex.Message, " ", dataThread.CodiceFiscale));
                }
                catch { }
            }
            return null;
        }
    }
}