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


/// <summary>
/// Summary description for DSS96RischioMercatoRischioCredito
/// </summary>
public class DSS96RischioMercatoRischioCredito : IDataSection
{
    private static NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger();

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

    /// <summary>
    /// Recupera i dati per la stampa della S96
    /// </summary>
    /// <param name="dsp"></param>
    /// <returns></returns>
    public DataSectionResult getDataSection (List<SessionStruct> tabelleSessione, string querySql, DataThread dataThread)
    {
        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_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_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;
                }

                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";

                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)
                {
                    rowIndicatori.Complessita = Convert.ToBoolean(dtRow["ComplexityIsOk"]);
                    rowIndicatori.RischioMercato = Convert.ToBoolean(dtRow["VarIsOk"]);
                    rowIndicatori.RischioCredito = Convert.ToBoolean(dtRow["RiskClassIsOk"]);
                    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;
    }
}