using System;
using System.Web;
using System.Text;
using System.Data;
using System.Collections;
using System.Configuration;
using PDFGenerator.BusinessLayer.DataSection;
using PDFGenerator.BusinessLayer;
using System.Collections.Generic;
using PDFGenerator;
using DataAccessLayer;
using NLog;

namespace PDFGenerator.BusinessLayer.DataSection
{
    public class DSFD43BISProdottiAreeBisogno : IDataSection
    {
        NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger();
        private Int32? _ordinamentoProgettoPerAreeMonitorate;

        public Int32? OrdinamentoProgettoPerAreeMonitorate { set { _ordinamentoProgettoPerAreeMonitorate = value; } }


        #region IDataSection Members

        public DataSectionResult getDataSection(List<SessionStruct> tabelleSessione, string querySql, DataThread dataThread)
        {
            try
            {
                DataSectionResult dsr = new DataSectionResult();
                DataSetS43BIS ds43BIS = new DataSetS43BIS();

                DataSetS43BIS.ProdottiAreeBisognoRow drDettaglioProdotti;
                DataSetS43BIS.ProdottiTotaleRow drTotali;

                FormatNum conv = new FormatNum();
                string area = string.Empty;
                string nomeProgetto = string.Empty;


                ds43BIS.ProdottiAreeBisogno.Columns["Controvalore"].Caption = "Controvalore <br> € &nbsp; &nbsp; &nbsp; &nbsp;";

                DataTable dt = SectionManager.GetDataSection(tabelleSessione, querySql, dataThread);
                //DataRow[] drS43BIS = dt.Select("ORDINAMENTO_PROGETTO =" + _ordinamentoProgettoPerAreeMonitorate + " and needarea='" + dataThread.Area + "' And nome_progetto='" + dataThread.Progetto.Replace("'", "''") + "'");

                /************************** Modifica Nota Dinamica 11-03-2021 - Pino *************************************************************/
                DataTable dtFlagNota = SectionManager.GetDataSection(tabelleSessione, "[C6StagingPeriodico].[ClienteProdottiFAI]", dataThread);
                DataSetS43BIS.FlagNotaFAIRow drFlagFAI;
                if (dtFlagNota.Rows.Count > 0)
                {
                    drFlagFAI = ds43BIS.FlagNotaFAI.NewFlagNotaFAIRow();
                    drFlagFAI["FlagFAI"] = dtFlagNota.Rows[0][0].ToString();
                    drFlagFAI["DataFAI"] = dtFlagNota.Rows[0][1].ToString();

                    ds43BIS.FlagNotaFAI.AddFlagNotaFAIRow(drFlagFAI);
                }
                /*********************************************************************************************************************************/


                DataTable distinctTable = dt.DefaultView.ToTable(true, "needarea", "nome_progetto");
                DataRow[] drTotaleProgettiInvestimento = distinctTable.Select(" needarea = 'Inv'");
                int totaleProgettiInvestimento = drTotaleProgettiInvestimento.Length;


                //foreach (DataRow row in drS43BIS)
                foreach (DataRow row in dt.Rows)
                {
                    #region Totali

                    if (area != row["needarea"].ToString() || nomeProgetto != row["nome_progetto"].ToString())
                    {
                        drTotali = ds43BIS.ProdottiTotale.NewProdottiTotaleRow();
                        drTotali.AreaBisogno = row["needareades"].ToString();
                        if (row["needarea"].ToString().ToLower() == "na")
                            drTotali.Totale = "TOTALE RISORSE " + row["needareades"].ToString().ToUpper();
                        else
                        {
                            if (row["needarea"].ToString().ToLower() == "inv")
                            {
                                // Se c'è un solo progetto in investimento chiamato "progetto investimento" il totale deve essere TOTALE INVESTIMENTO
                                if (totaleProgettiInvestimento == 1 && row["nome_progetto"].ToString().ToLower() == "progetto investimento")
                                    drTotali.Totale = "TOTALE " + row["needareades"].ToString().ToUpper();
                                else
                                    drTotali.Totale = "TOTALE " + row["nome_progetto"].ToString().ToUpper();

                            }
                            else
                                drTotali.Totale = "TOTALE " + row["needareades"].ToString().ToUpper();
                        }

                        drTotali.Progetto = row["nome_progetto"].ToString();
                        drTotali.CodiceAreaBisogno = row["needarea"].ToString();

                        if (row["needarea"].ToString().ToLower() == "inv")
                        {
                            #region Controvalore, Var per area bisogno Investimento

                            //Controvalore, Var e copertura per area bisogno Investimento
                            drTotali.Controvalore = Convert.ToDecimal(row["somma_controval_need_prog"]);

                            if (row["var_need_progString"] != DBNull.Value)
                                drTotali.Var = row["var_need_progString"].ToString();
                            else
                                drTotali.Var = conv.ConvertNum(row["var_need_prog"]);


                            #endregion
                        }
                        else
                        {
                            #region Controvalore, Var per area bisogno diversa da Investimento

                            // Controvalore, Var e copertura per area bisogno diversa da Investimento
                            drTotali.Controvalore = Convert.ToDecimal(row["somma_controval_needarea"]);

                            if (row["var_needareaString"] != DBNull.Value)
                                drTotali.Var = row["var_needareaString"].ToString();
                            else
                                drTotali.Var = conv.ConvertNum(row["var_needarea"]);


                            #endregion
                        }

                        ds43BIS.ProdottiTotale.AddProdottiTotaleRow(drTotali);
                    }
                    #endregion

                    area = row["needarea"].ToString();
                    nomeProgetto = row["nome_progetto"].ToString();

                    #region Dettaglio

                    drDettaglioProdotti = ds43BIS.ProdottiAreeBisogno.NewProdottiAreeBisognoRow();
                    drDettaglioProdotti.AreaBisogno = row["needareades"].ToString();
                    drDettaglioProdotti.Progetto = nomeProgetto;
                    drDettaglioProdotti.CodiceAreaBisogno = row["needarea"].ToString();
                    drDettaglioProdotti.DataAssociazione = row["dataAssociazione"].ToString();
                    drDettaglioProdotti.isAPC = row["isAPC"].ToString();
                    //Hazem
                    drDettaglioProdotti.Contratto = row["contrattoDossier"].ToString();
                    drDettaglioProdotti.Descrizione = row["descrizione"].ToString();
                    drDettaglioProdotti.Tipo_Prodotto = row["Tipo_Prodotto"].ToString();

                    //if (row["PartitaViaggiante"] != DBNull.Value && Convert.ToDouble(row["PartitaViaggiante"]) > 0)
                    //    drDettaglioProdotti.__IMAGE_ = UtilityManager.getAppSetting("PartiteViaggianti");
                    //else

                    // SavingMap Precedente
                    //drDettaglioProdotti.__IMAGE_ = string.Empty;
                    //if (isSavingMap(drDettaglioProdotti.Contratto, dataThread.Periodico))
                    ////if (drDettaglioProdotti.Descrizione.Substring(0, 2) == "FV")
                    //    drDettaglioProdotti.__IMAGE_ = WebConfigParameter.getParameter("SavingMap");
                    //else
                    //    drDettaglioProdotti.__IMAGE_ = string.Empty;

                    // SavingMap New
                    drDettaglioProdotti.__IMAGE_ = string.Empty;
                    if (drDettaglioProdotti.Contratto.IndexOf("VP") > 0 && drDettaglioProdotti.Tipo_Prodotto.Trim() == "CC")
                    {
                        drDettaglioProdotti.__IMAGE_ = WebConfigParameter.getParameter("SavingMap");
                        dataThread.IsSavingMap = true;
                    }
                    else
                    {
                        if (drDettaglioProdotti.Contratto.IndexOf("FO") > 0)
                        {
                            if (DataSectionParameter.isSavingMap(dataThread, drDettaglioProdotti.Contratto.Trim()))
                            {
                                drDettaglioProdotti.__IMAGE_ = WebConfigParameter.getParameter("SavingMap");
                                dataThread.IsSavingMap = true;
                            }
                        }
                    }
                    // End SavingMap

                    // Prova per APC103 da aggiungere
                    if (drDettaglioProdotti.isAPC == "S") //mock per APC
                    {
                        drDettaglioProdotti.__IMAGE_ = WebConfigParameter.getParameter("APC103");
                        dataThread.IsAPC103 = true;
                    }

                    // end prova APC103
                    drDettaglioProdotti.Controvalore = Convert.ToDecimal(row["controvalore"]);


                    if (row["varProdottoString"] != DBNull.Value)
                        drDettaglioProdotti.Var = row["varProdottoString"].ToString();
                    else
                        drDettaglioProdotti.Var = conv.ConvertNum(row["varProdotto"]);

                    //Hazem
                    if (row["CreditRiskString"] != DBNull.Value)
                        drDettaglioProdotti.CreditRisk = row["CreditRiskString"].ToString();
                    else
                        drDettaglioProdotti.CreditRisk = UtilityBusinessLayer.GetRiskCreditEmitClassName(row["CreditRiskEmit"].ToString());

                    drDettaglioProdotti.PerformanceYTD = conv.ConvertNum(row["PerformanceYTD"]);
                    drDettaglioProdotti.PerformanceDS = conv.ConvertNum(row["performanceDS"]);

                    drDettaglioProdotti.VersatoNetto = row["VersatoNetto"] == DBNull.Value ? row["VersatoNettoString"].ToString() : conv.ConvertNum(row["VersatoNetto"]);
                    drDettaglioProdotti.UtilePerdita = row["MinusPlusValenza"] == DBNull.Value ? row["MinusPlusValenzaString"].ToString() : conv.ConvertNum(row["MinusPlusValenza"]);

                    drDettaglioProdotti.CodiceAreaBisogno = row["needarea"].ToString();


                    #region E-DEFAULT4

                    if (

                        (drDettaglioProdotti.Descrizione.IndexOf("B MARCHE-2015 SUB TV", 0, StringComparison.CurrentCultureIgnoreCase) != -1) ||
                        (drDettaglioProdotti.Descrizione.IndexOf("BCA MARCHE FRN 16", 0, StringComparison.CurrentCultureIgnoreCase) != -1) ||
                        (drDettaglioProdotti.Descrizione.IndexOf("B MARCHE 18 6% SUB", 0, StringComparison.CurrentCultureIgnoreCase) != -1) ||
                        (drDettaglioProdotti.Descrizione.IndexOf("B MARCHE 12/18 6%", 0, StringComparison.CurrentCultureIgnoreCase) != -1) ||
                        (drDettaglioProdotti.Descrizione.IndexOf("BCA MARCHE FRN 17", 0, StringComparison.CurrentCultureIgnoreCase) != -1) ||
                        (drDettaglioProdotti.Descrizione.IndexOf("BP ETRURIA-16 STUSUB", 0, StringComparison.CurrentCultureIgnoreCase) != -1) ||
                        (drDettaglioProdotti.Descrizione.IndexOf("BP ETRURIA 17 SUB TV", 0, StringComparison.CurrentCultureIgnoreCase) != -1) ||
                        (drDettaglioProdotti.Descrizione.IndexOf("B ETRURIA 18 3,5%SUB", 0, StringComparison.CurrentCultureIgnoreCase) != -1) ||
                        (drDettaglioProdotti.Descrizione.IndexOf("B ETRURIA 13-23 5%", 0, StringComparison.CurrentCultureIgnoreCase) != -1) ||
                        (drDettaglioProdotti.Descrizione.IndexOf("BP ETRUR 16 STDW SUB", 0, StringComparison.CurrentCultureIgnoreCase) != -1) ||
                        (drDettaglioProdotti.Descrizione.IndexOf("BP ETRURIA 17 SUB SU", 0, StringComparison.CurrentCultureIgnoreCase) != -1) ||
                        (drDettaglioProdotti.Descrizione.IndexOf("CRCHIETI-16 STUP SUB", 0, StringComparison.CurrentCultureIgnoreCase) != -1) ||
                        (drDettaglioProdotti.Descrizione.IndexOf("CR FERRARA-16 TV SUB", 0, StringComparison.CurrentCultureIgnoreCase) != -1) ||
                        (drDettaglioProdotti.Descrizione.IndexOf("CR FERRARA-17 TV SUB", 0, StringComparison.CurrentCultureIgnoreCase) != -1)
                        )
                    {

                        drDettaglioProdotti.Controvalore = 999999999999;


                    }
                    #endregion E-DEFAULT4


                    // Nota sul grado di copertura
                    if (area.ToLower() == "inv")
                    {
                        if (!string.IsNullOrEmpty(row["copertura_need_progString"].ToString()))
                            drDettaglioProdotti.Copertura = row["copertura_need_progString"].ToString();
                    }
                    else
                    {
                        if (!string.IsNullOrEmpty(row["copertura_needareaString"].ToString()))
                            drDettaglioProdotti.Copertura = row["copertura_needareaString"].ToString();
                    }

                    //Bido Jan. Relaease
                    //if (area.ToLower() == "liq" && dataThread.ReportType().TipoReport == TipoReport.MONITORAGGIO)
                    //{
                    //    drDettaglioProdotti.VersatoNetto = "n.d.";
                    //    drDettaglioProdotti.UtilePerdita = "n.d.";
                    //    drDettaglioProdotti.Var = "0,00";
                    //    drDettaglioProdotti.CreditRisk = "n.a.";

                    //}
                    //Bido Jan. Release

                    ds43BIS.ProdottiAreeBisogno.AddProdottiAreeBisognoRow(drDettaglioProdotti);

                    #endregion
                }

                dsr.DatiSezione = ds43BIS;
                dsr.Esito = ds43BIS.ProdottiAreeBisogno.Rows.Count;
                return dsr;
            }
            catch (Exception ex)
            {
                logger.Error(ex);
                throw ex;
            }
        }

        #endregion

    }
}