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;

namespace PDFGenerator.BusinessLayer.DataSection
{
    public class DSS43BISProdottiAreeBisogno : IDataSection
    {


        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)
                {
                    try
                    {
                        #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 (isSavingMap(dataThread.Rete, dataThread.CodiceFiscale.Trim(), drDettaglioProdotti.Contratto.Trim(), dataThread.Periodico))
                                {
                                    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
                    }
                    catch (Exception ex)
                    {
                        string errore = string.Concat("Errore: ", row["nome_progetto"].ToString(), " ", area);
                    }
                }

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

        #endregion

        public bool isSavingMap(string pRete, string pCodFis, string pContratto, bool pPeriodico)
        {
            //dataThread.Rete, dataThread.CodiceFiscale, dr.Contratto, dr.Tipo_Prodotto, dataThread.Periodico
            var parametri = new List<Parametro>
            {
                new Parametro
                {
                    Direction = ParameterDirection.Input,
                    DbType = DbType.String,
                    ParameterName = "Rete",
                    Value = pRete
                },
                new Parametro
                {
                    Direction = ParameterDirection.Input,
                    DbType = DbType.String,
                    ParameterName = "CodFis",
                    Value = pCodFis
                },
                new Parametro
                {
                    Direction = ParameterDirection.Input,
                    DbType = DbType.String,
                    ParameterName = "CodConf",
                    Value = pContratto
                }
            };
            string sSql = "";

            if (pPeriodico)
                sSql = "[C6MartPeriodico].[PL_SavingMap]";
            else
                sSql = "[C6Mart].[PL_SavingMap]";

            DataAccessDE dataAccess = new DataAccessDE(DBProvider.SqlServerStampeC6);
            DataTable dt = dataAccess.ExecuteDataTableStoredProcedure(DBProvider.SqlServerStampeC6, sSql, parametri);

            if ((dt == null) || (dt.Rows.Count == 0))
                return false;
            else
            {
                if ((dt.Rows[0][0].ToString() == "0"))
                    return false;
                else
                    return true;
            }
        }
    }
}