using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Collections;
using PDFGenerator.BusinessLayer.DataSection;
using System.Collections.Generic;
using PDFGenerator.BusinessLayer;
using DataAccessLayer;

/// <summary>
/// Summary description for DSS76PatrimonioNonRappresentabileAssettClass
/// </summary>
public class DSS171PatrimonioNonRappresentabileAssettClass : IDataSection
{

    private ArrayList _parametriFiltro;
    private bool _Filtra;
    private bool HasColumnCtvNonCoperto;
    private bool _flagS86;
    private bool _flagS86BIS;

    private static NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger();

    /// <summary>
    /// Indica se è stato flaggato sull'albero la sezione S86
    /// </summary>
    public bool FlagS86
    {
        get { return _flagS86; }
        set { _flagS86 = value; }
    }

    /// <summary>
    /// Indica se è stato flaggato sull'albero la sezione S86BIS
    /// </summary>
    public bool FlagS86BIS
    {
        get { return _flagS86BIS; }
        set { _flagS86BIS = value; }
    }


     /// <summary>
    /// Costruttore
    /// </summary>
    public DSS171PatrimonioNonRappresentabileAssettClass()
    {
        _parametriFiltro = new ArrayList();
        _Filtra = false;
    }

    /// <summary>
    /// Costruttore
    /// </summary>
    /// <param name="modalitavisualizzazione"></param>
    public DSS171PatrimonioNonRappresentabileAssettClass(EmodalitaRappresentazione modalitavisualizzazione)
    {
        _modalitaRappresentazione = modalitavisualizzazione;
        _parametriFiltro = new ArrayList();
        _Filtra = false;
    }



    /// <summary>
    /// Modalità di visualizzazione:
    /// La modalità normale mostra la colonna Intermediario(S76 in modalità normale),
    /// La modalità alternativa mostra la colonna AreaProgetto(S76 in modalità alternativa).
    /// Se non specificato di default viene impostata la modalità normale.
    /// </summary>
    public enum EmodalitaRappresentazione
    {
        normale,
        alternativa
    }

    private EmodalitaRappresentazione _modalitaRappresentazione = EmodalitaRappresentazione.normale;


    /// <summary>
    /// Modalità di visualizzazione:
    /// La modalità normale mostra la colonna Intermediario(S76 in modalità normale),
    /// La modalità alternativa mostra la colonna AreaProgetto(S76 in modalità alternativa).
    /// Se non specificato di default viene impostata la modalità normale.
    /// </summary>
    public EmodalitaRappresentazione modalitaRappresentazione
    {
        get { return _modalitaRappresentazione; }
        set { _modalitaRappresentazione = value; }
    }


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

        logger.Info("DSS171PatrimonioNonRappresentabileAssetClass query" + querySql);
        logger.Info("DSS171PatrimonioNonRappresentabileAssetClass " + EmodalitaRappresentazione.normale);

        /*** ATTENZIONE Forzatura - Pino ***/
        //dataThread.Periodico = false;
        //dataThread.CodiceFiscale = "GTNLCN70P01H769Y";
        //dataThread.Rete = "S";
        /***********************************/


        if (_modalitaRappresentazione==EmodalitaRappresentazione.normale)
        {
            dt = SectionManager.GetDataSection(tabelleSessione, querySql, dataThread);
        }
        else
        {
            dt = SectionManager.GetDataSection(tabelleSessione, querySql, dataThread);
             if (_Filtra)
             {
                 if (_parametriFiltro.Count > 0)
                 {
                     string parametriFiltro = "need_area in(";
                     for (int i = 0; i < _parametriFiltro.Count; i++)
                     {
                         parametriFiltro += "'" + _parametriFiltro[i].ToString() + "',";
                     }

                     parametriFiltro = parametriFiltro.Remove(parametriFiltro.Length - 1);
                     parametriFiltro += ")";

                     DataView dtFiltrata = new DataView(dt);
                     dtFiltrata.RowFilter = parametriFiltro;
                     dt = dtFiltrata.ToTable();
                 }
                 else
                 {
                     dt.Rows.Clear();
                 }
             }
        }

        /*** ATTENZIONE Forzatura - Pino ***/
        //dataThread.Periodico = true;
        //dataThread.CodiceFiscale = "BBNCLD64R20D205D";
        //dataThread.Rete = "F";
        /***********************************/

        DataRow dr;
        Decimal ctvTotale = 0;
        Decimal ctvTotaleNonCoperto = 0;
        DataSetS76 ds76 = new DataSetS76();


        #region Nuovo Codice
        List<ContoCorrente> contoCorrentes = new List<ContoCorrente>();
        ContoCorrente contoCorrente = new ContoCorrente();

        foreach (DataRow r in dt.Rows)
        {
            contoCorrente.Contratto = r["Contratto"].ToString();
            contoCorrente.Descrizione = r["Descrizione"].ToString();
            contoCorrente.Tipo_Prodotto = r["Tipo_Prodotto"].ToString();
            contoCorrente.isAPC = r["isAPC"].ToString();

            // SavingMap New
            contoCorrente.IMAGE = string.Empty;
            if (contoCorrente.Contratto.ToString().IndexOf("VP") > 0 && contoCorrente.Tipo_Prodotto.ToString().Trim() == "CC")
                contoCorrente.IMAGE = WebConfigParameter.getParameter("SavingMap");
            else
            {
                if (contoCorrente.Contratto.ToString().IndexOf("FO") > 0)
                {
                    if (isSavingMap(dataThread.Rete, dataThread.CodiceFiscale.Trim(), contoCorrente.Contratto.ToString().Trim(), dataThread.Periodico))
                        contoCorrente.IMAGE = WebConfigParameter.getParameter("SavingMap");
                }
            }
            // End SavingMap

            if (contoCorrente.isAPC.ToString() == "S")
            {
                contoCorrente.IMAGE = WebConfigParameter.getParameter("APC103");
                dataThread.IsAPC103 = true;
            }

            switch (_modalitaRappresentazione)
            {
                case EmodalitaRappresentazione.normale:
                    contoCorrente.Intermediario = r["Intermediario"].ToString();
                    break;

                case EmodalitaRappresentazione.alternativa:
                    contoCorrente.AreaProgetto = r["Area"].ToString();
                    //V se il progetto è progetto investimento non deve apparire la riga / progetto
                    string progetto = r["Progetto"].ToString();
                    if (r["Area"].ToString().ToUpper() == "INVESTIMENTO")
                        if (progetto != "Progetto investimento")
                            contoCorrente.AreaProgetto += " / " + progetto;
                    //
                    break;
            }

            contoCorrente.ControvaloreNonCoperto = r["Controvalore"].ToString();

            contoCorrente.Controvalore = r["controvalore_contratto"].ToString();
            contoCorrente.DataSottoscrizione = r["DataSottoscrizione"].ToString();

            #region Gestione controvalore non coperto
            decimal ctv = 0;
            decimal ctvContratto = 0;

            if (r["Controvalore"] != DBNull.Value)
                ctv = Convert.ToDecimal(r["Controvalore"]);

            if (r["controvalore_contratto"] != DBNull.Value)
                ctvContratto = Convert.ToDecimal(r["controvalore_contratto"]);


            if (ctv != ctvContratto)
                HasColumnCtvNonCoperto = true;
            #endregion

            contoCorrentes.Add(contoCorrente);
            ctvTotale += (Decimal)r["controvalore_contratto"];
            ctvTotaleNonCoperto += (Decimal)r["Controvalore"];
        }

        // Trasformo la lista in un Datatable
        DataTable _dt = UtilityBusinessLayer.ToDataTable<ContoCorrente>(contoCorrentes);
        // Aggiungo il nuovo DataTable al Dataset ds76
        _dt.TableName = "ContoCorrente";
        ds76.Tables["ContoCorrente"].TableName = "OLD";
        ds76.Tables.Add(_dt);

        #endregion


        //foreach (DataRow r in dt.Rows)
        //{
        //    // attraverso il metodo ClsFunzioniGeneriche recupero la data del contartto

        //    logger.Info("DSS171PatrimonioNonRappresentabileAssetClass ciclo sul datatable " + r["Contratto"]);

        //    dr = ds76.ContoCorrente.NewRow();

        //    dr["Contratto"] = r["Contratto"];

        //    dr["Descrizione"] = r["Descrizione"];

        //    logger.Info("DSS171PatrimonioNonRappresentabileAssetClass ciclo sul datatable " + r["Tipo_Prodotto"]);
        //    dr["Tipo_Prodotto"] = r["Tipo_Prodotto"];
        //    logger.Info("DSS171PatrimonioNonRappresentabileAssetClass ciclo sul datatable " + dr["Tipo_Prodotto"]);

        //    logger.Info("DSS171PatrimonioNonRappresentabileAssetClass ciclo sul datatable " + r["isAPC"]);
        //    dr["isAPC"] = r["isAPC"];
        //    logger.Info("DSS171PatrimonioNonRappresentabileAssetClass ciclo sul datatable " + dr["isAPC"]);

        //    // SavingMap New
        //    dr["<IMAGE>"] = string.Empty;
        //    if (dr["Contratto"].ToString().IndexOf("VP") > 0 && dr["Tipo_Prodotto"].ToString().Trim() == "CC")
        //        dr["<IMAGE>"] = WebConfigParameter.getParameter("SavingMap");
        //    else
        //    {
        //        if (dr["Contratto"].ToString().IndexOf("FO") > 0)
        //        {
        //            if (isSavingMap(dataThread.Rete, dataThread.CodiceFiscale.Trim(), dr["Contratto"].ToString().Trim(), dataThread.Periodico))
        //                dr["<IMAGE>"] = WebConfigParameter.getParameter("SavingMap");
        //        }
        //    }
        //    // End SavingMap
        //    if (dr["isAPC"].ToString() == "S")
        //    {
        //        dr["<IMAGE>"] = WebConfigParameter.getParameter("APC103");
        //        dataThread.IsAPC103 = true;
        //    }
        //    switch (_modalitaRappresentazione)
        //    {
        //        case EmodalitaRappresentazione.normale:
        //            dr["Intermediario"] = r["Intermediario"];
        //            break;

        //        case EmodalitaRappresentazione.alternativa:
        //            dr["AreaProgetto"] = r["Area"].ToString();
        //            //V se il progetto è progetto investimento non deve apparire la riga / progetto
        //            string progetto = r["Progetto"].ToString();
        //            if (r["Area"].ToString().ToUpper() == "INVESTIMENTO")
        //                if (progetto != "Progetto investimento")
        //                    dr["AreaProgetto"] += " / " + progetto;
        //            //
        //            break;
        //    }
        //    dr["ControvaloreNonCoperto"] = r["Controvalore"];

        //    dr["Controvalore"] = r["controvalore_contratto"];
        //    dr["DataSottoscrizione"] = r["DataSottoscrizione"];


        //    #region Gestione controvalore non coperto
        //    decimal ctv = 0;
        //    decimal ctvContratto = 0;

        //    if (r["Controvalore"] != DBNull.Value)
        //        ctv = Convert.ToDecimal(r["Controvalore"]);

        //    if (r["controvalore_contratto"] != DBNull.Value)
        //        ctvContratto = Convert.ToDecimal(r["controvalore_contratto"]);


        //    if (ctv != ctvContratto)
        //        HasColumnCtvNonCoperto = true;


        //    #endregion


        //    ds76.ContoCorrente.Rows.Add(dr);
        //    ctvTotale += (Decimal)r["controvalore_contratto"];
        //    ctvTotaleNonCoperto += (Decimal)r["Controvalore"];
        //}


        DataRow drTot = ds76.TotaleConti.NewRow();
        drTot["Descrizione"] = "Totale Patrimonio non rappresentabile".ToUpper();
        drTot["Valore"] = ctvTotale;
        drTot["ValoreNonCoperto"] = ctvTotaleNonCoperto;
        ds76.TotaleConti.Rows.Add(drTot);

        #region Nuovo Codice
        // Aggiungo l'informazione per la parte grafica
        if (ds76.Tables[2].ExtendedProperties.Contains("HasColumnCtvNonCoperto"))
            ds76.Tables[2].ExtendedProperties["HasColumnCtvNonCoperto"] = HasColumnCtvNonCoperto;
        else
            ds76.Tables[2].ExtendedProperties.Add("HasColumnCtvNonCoperto", HasColumnCtvNonCoperto);

        //Patrimonio non rappresentabile per asset class- 
        //se presente patrimonio non rappresentabile ed è stata selezionata solo la vista a livello di portafoglio complessivo, 
        //nella tabella non deve essere riportata la colonna Area/progetto
        if (_flagS86 == false && _flagS86BIS == false)
            ds76.Tables[2].Columns["AreaProgetto"].ExtendedProperties.Add("ToRemove", true);


        dsr.DatiSezione = ds76;
        dsr.Esito = ds76.Tables[2].Rows.Count;
        #endregion

        #region Old Codice
        //// Aggiungo l'informazione per la parte grafica
        //if (ds76.ContoCorrente.ExtendedProperties.Contains("HasColumnCtvNonCoperto"))
        //    ds76.ContoCorrente.ExtendedProperties["HasColumnCtvNonCoperto"] = HasColumnCtvNonCoperto;
        //else
        //    ds76.ContoCorrente.ExtendedProperties.Add("HasColumnCtvNonCoperto", HasColumnCtvNonCoperto);


        ////Patrimonio non rappresentabile per asset class- 
        ////se presente patrimonio non rappresentabile ed è stata selezionata solo la vista a livello di portafoglio complessivo, 
        ////nella tabella non deve essere riportata la colonna Area/progetto
        //if (_flagS86 == false && _flagS86BIS == false)
        //    ds76.ContoCorrente.AreaProgettoColumn.ExtendedProperties.Add("ToRemove", true);


        //dsr.DatiSezione = ds76;
        //dsr.Esito = ds76.ContoCorrente.Rows.Count;

        #endregion

        return dsr;

    }

    public ArrayList ParametriFiltro
    {
        set
        {
            _Filtra = true;
            _parametriFiltro = value;
        }
    }
    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;
        }
    }
}

public class ContoCorrente
{
    public string DataSottoscrizione { get; set; }
    public string Contratto { get; set; }
    public string Descrizione { get; set; }
    public string IMAGE { get; set; }
    public string Intermediario { get; set; }
    public string AreaProgetto { get; set; }
    public string Controvalore { get; set; }
    public string ControvaloreNonCoperto { get; set; }
    public string Tipo_Prodotto { get; set; }
    public string isAPC { get; set; }
}