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 PDFGenerator.BusinessLayer;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;

namespace PDFGenerator.BusinessLayer.DataSection
{

    class DSS180ProdottiAltaComplessita : IDataSection
    {
        private static NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger();


        //private int _experince;
        //public int Experince
        //{
        //    set
        //    {
        //        _experince = value;
        //    }
        //    get
        //    {
        //        return _experince;
        //    }
        //}

        public DSS180ProdottiAltaComplessita()
        {
            //
            // TODO: Add constructor logic here
            //
        }
        #region IDataSection Members

        /// <summary>
        /// Implement the getDataSection function of the interface IDataSection.
        /// </summary>
        /// <param name="tabelleSessione"></param>
        /// <param name="querySql"> Sql Statment to be executed to return the Profile Risk of the certain customer in a certain network</param>
        /// <param name="dataThread"></param>
        /// <returns> Data Table to be shown in the report</returns>
        public DataSectionResult getDataSectionOld(List<SessionStruct> tabelleSessione, string querySql, DataThread dataThread)
        {
            try
            {

                FormatNum num = new FormatNum();

                DataSectionResult dsr = new DataSectionResult();

                DataSetS180 ds180 = new DataSetS180();

                // La sezione va stampata se non si verificano i seguenti 3 casi:
                // Copertura = 0

                string preQuerySql = dataThread.Periodico ? "[C6MartPeriodico].[PL_D_S178CasiParticolari]" : "[C6Mart].[PL_D_S178CasiParticolari]";

                DataTable dtTestoKO = SectionManager.GetDataSection(tabelleSessione, preQuerySql, dataThread);

                //Se la verifica ha dato un KO significa che la sezione non deve essere stampata
                if (dtTestoKO.Rows.Count > 0)
                {
                    dsr.Esito = 0;
                    return dsr;
                }
                else
                {
                    DataTable dt = SectionManager.GetDataSection(tabelleSessione, querySql, dataThread);

                    DataRow drProdotto;

                    DataRow drTotaleProdotti;

                    DataRow drTotalePatrimonio;

                    decimal totaleControvaloreProdotti = 0;
                    decimal totalePesoProdotti = 0;
                    decimal totalePatrimonio = 0;

                    if (dt.Rows.Count > 0)
                    {
                        drTotaleProdotti = ds180.TotaleProdotti.NewRow();
                        drTotaleProdotti["Descrizione"] = @"TOTALE PRODOTTI CON COMPLESSITA’ ""ALTA"" e ""MOLTO ALTA""";

                        foreach (DataRow r in dt.Rows)
                        {
                            drProdotto = ds180.ProdottiAltaComplessita.NewRow();
                            drProdotto["CodiceContratto"] = r["CodiceContratto"].ToString();
                            drProdotto["NomeProdotto"] = r["NomeProdotto"].ToString();
                            //drEmittente["ObbligazioniControvalore"] = Convert.ToDecimal(r["ObbligazioniControvalore"]).ToString("#,##0.00");
                            //drEmittente["ObbligazioniConcentrazione"] = Convert.ToDecimal(r["ObbligazioniConcentrazione"]).ToString("#,##0.00");
                            //drEmittente["AzioniControvalore"] =  Convert.ToDecimal(r["AzioniControvalore"]).ToString("#,##0.00");
                            //drEmittente["AzioniConcentrazione"] = Convert.ToDecimal(r["AzioniConcentrazione"]).ToString("#,##0.00");

                            //drEmittente["ObbligazioniControvalore"] = r["ObbligazioniControvalore"] == null ? "-" : Convert.ToDecimal(r["ObbligazioniControvalore"]).ToString("C", System.Globalization.CultureInfo.CurrentCulture);
                            //drEmittente["ObbligazioniConcentrazione"] = r["ObbligazioniConcentrazione"] == null ? "-" : Convert.ToDecimal(r["ObbligazioniConcentrazione"]).ToString("P", System.Globalization.CultureInfo.CurrentCulture);
                            //drEmittente["AzioniControvalore"] = r["AzioniControvalore"] == null ? "-" : Convert.ToDecimal(r["AzioniControvalore"]).ToString("C");
                            //drEmittente["AzioniConcentrazione"] = r["AzioniConcentrazione"] == null ? "-" : Convert.ToDecimal(r["AzioniConcentrazione"]).ToString("P2");

                            //drEmittente["ObbligazioniControvalore"] = num.ConvertNum(r["ObbligazioniControvalore"]);
                            //drEmittente["ObbligazioniConcentrazione"] = num.ConvertNum(r["ObbligazioniConcentrazione"]);

                            //drEmittente["AzioniControvalore"] = num.ConvertNum(r["AzioniControvalore"]);
                            //drEmittente["AzioniConcentrazione"] = num.ConvertNum(r["AzioniConcentrazione"]);

                            //MIFID2 CR Napolitano i simboli vanno solo nell'intestazione
                            //drProdotto["Controvalore"] = string.IsNullOrEmpty(r["Controvalore"].ToString()) ? "-" : string.Concat(num.ConvertNum(r["Controvalore"]), " €");
                            drProdotto["Controvalore"] = string.IsNullOrEmpty(r["Controvalore"].ToString()) ? "-" : num.ConvertNum(r["Controvalore"]);
                            //--MIFID2
                            drProdotto["Peso"] = string.IsNullOrEmpty(r["Peso"].ToString()) ? "-" : num.ConvertNum(r["Peso"]);
                            totalePatrimonio = Convert.ToDecimal(r["TotalePatrimonio"].ToString());

                            ds180.ProdottiAltaComplessita.Rows.Add(drProdotto);

                            totaleControvaloreProdotti += Convert.ToDecimal(r["Controvalore"]);
                            totalePesoProdotti += Convert.ToDecimal(r["Peso"]);
                        }

                        //MIFID2 CR Napolitano i simboli vanno solo nell'intestazione
                        //drTotaleProdotti["TotaleControvalore"] = string.Concat(num.ConvertNum(Convert.ToDecimal(totaleControvaloreProdotti).ToString()), " €");
                        drTotaleProdotti["TotaleControvalore"] = num.ConvertNum(Convert.ToDecimal(totaleControvaloreProdotti).ToString());
                        //MIFID2
                        drTotaleProdotti["TotalePeso"] = Convert.ToDecimal(num.ConvertNum(totalePesoProdotti)).ToString();

                        ds180.TotaleProdotti.Rows.Add(drTotaleProdotti);
                    }

                    drTotalePatrimonio = ds180.TotalePatrimonio.NewRow();

                    drTotalePatrimonio["Descrizione"] = "TOTALE PATRIMONIO";
                    //drTotalePatrimonio["TotaleControvalore"] = string.Concat(Convert.ToDecimal("11.215.345,87").ToString(), " €");

                    //MIFID2 CR Napolitano i simboli vanno solo nell'intestazione
                    //drTotalePatrimonio["TotaleControvalore"] = string.Concat(num.ConvertNum(totalePatrimonio), " €");
                    //FIX Totale Patrimonio (deve contenere anche tutte le altre voci
                    //drTotalePatrimonio["TotaleControvalore"] = num.ConvertNum(totalePatrimonio);
                    drTotalePatrimonio["TotaleControvalore"] = num.ConvertNum(totalePatrimonio
                        + dataThread.ContoCorrente +
                                            dataThread.PartiteViaggiantiInvestimento +
                                            dataThread.PartiteViaggiantiDisinvestimento +
                                            dataThread.TotalSelfNegCurrentAccountValue);


                    //--MIFID2

                    drTotalePatrimonio["TotalePeso"] = "";

                    ds180.TotalePatrimonio.Rows.Add(drTotalePatrimonio);

                    dsr.DatiSezione = ds180;

                    int esito = 0;

                    //if (dtFilter.Rows.Count < 5)
                    //    esito = 0;
                    //else
                    esito = ds180.ProdottiAltaComplessita.Rows.Count;

                    dsr.Esito = esito;
                    dsr.Esito = 1;
                    return dsr;
                }

            }
            catch (Exception ex)
            {
                try
                {
                    logger.Error(String.Concat(ex.Message, " ", dataThread.CodiceFiscale));
                }
                catch { }
                throw ex;
            }
        }

        #region Nuova Sezione per la gestione dei nuovi profili di rischio
        /// <summary>
        /// Implement the getDataSection function of the interface IDataSection.
        /// </summary>
        /// <param name="tabelleSessione"></param>
        /// <param name="querySql"> Sql Statment to be executed to return the Profile Risk of the certain customer in a certain network</param>
        /// <param name="dataThread"></param>
        /// <returns> Data Table to be shown in the report</returns>
        public DataSectionResult getDataSection(List<SessionStruct> tabelleSessione, string querySql, DataThread dataThread)
        {
            try
            {

                FormatNum num = new FormatNum();

                DataSectionResult dsr = new DataSectionResult();

                DataSetS180 ds180 = new DataSetS180();

                // La sezione va stampata se non si verificano i seguenti 3 casi:
                // Copertura = 0

                string preQuerySql = dataThread.Periodico ? "[C6MartPeriodico].[PL_D_S178CasiParticolari]" : "[C6Mart].[PL_D_S178CasiParticolari]";

                DataTable dtTestoKO = SectionManager.GetDataSection(tabelleSessione, preQuerySql, dataThread);

                //Se la verifica ha dato un KO significa che la sezione non deve essere stampata
                if (dtTestoKO.Rows.Count > 0)
                {
                    dsr.Esito = 0;
                    return dsr;
                }
                else
                {
                    DataTable dt = SectionManager.GetDataSection(tabelleSessione, querySql, dataThread);

                    if (dt.Rows.Count == 0)
                    {
                        dsr.Esito = 0;
                        return dsr;
                    }

                    List<DettaglioConcentrazioneProdottiComplessi> listaDettaglio = GetDettaglioConcentrazioneProdottiComplessi(dt);
                    List<TotaleDettConcentrazioneProdComplessi> listaTotali = GetTotaliConcentrazioneProdottiComplessi(dt);

                    List<TotaleDettConcentrazioneProdComplessi> listaTotaleGenerale = GetTotaleGeneraleProdotticomplessi(dt, listaDettaglio);


                    // Converto in un Datatable la lista di dettaglio e lo aggiungo al dataset di ritorno
                    DataTable _dtDettaglioComplessita = UtilityBusinessLayer.ToDataTable<DettaglioConcentrazioneProdottiComplessi>(listaDettaglio);
                    _dtDettaglioComplessita.TableName = "DettaglioComplessita";
                    ds180.Tables.Add(_dtDettaglioComplessita);

                    // Converto in un Datatable la lista dei Totali e lo aggiungo al dataset di ritorno
                    DataTable _dtTotaliComplessita = UtilityBusinessLayer.ToDataTable<TotaleDettConcentrazioneProdComplessi>(listaTotali);
                    _dtTotaliComplessita.TableName = "TotaliComplessita";
                    ds180.Tables.Add(_dtTotaliComplessita);

                    // Converto in un Datatable la lista del Totale e lo aggiungo al dataset di ritorno
                    DataTable _dtTotaleGenerale = UtilityBusinessLayer.ToDataTable<TotaleDettConcentrazioneProdComplessi>(listaTotaleGenerale);
                    _dtTotaleGenerale.TableName = "TotaleGenerale";
                    ds180.Tables.Add(_dtTotaleGenerale);

                    dsr.DatiSezione = ds180;

                    int esito = 0;

                    esito = ds180.Tables["DettaglioComplessita"].Rows.Count;

                    dsr.Esito = esito;


                    //DataRow drProdotto;

                    //DataRow drTotaleProdotti;

                    //DataRow drTotalePatrimonio;

                    //decimal totaleControvaloreProdotti = 0;
                    //decimal totalePesoProdotti = 0;
                    //decimal totalePatrimonio = 0;

                    //if (dt.Rows.Count > 0)
                    //{
                    //    drTotaleProdotti = ds180.TotaleProdotti.NewRow();
                    //    drTotaleProdotti["Descrizione"] = @"TOTALE PRODOTTI CON COMPLESSITA’ ""ALTA"" e ""MOLTO ALTA""";

                    //    foreach (DataRow r in dt.Rows)
                    //    {
                    //        drProdotto = ds180.ProdottiAltaComplessita.NewRow();
                    //        drProdotto["CodiceContratto"] = r["CodiceContratto"].ToString();
                    //        drProdotto["NomeProdotto"] = r["NomeProdotto"].ToString();
                    //        //drEmittente["ObbligazioniControvalore"] = Convert.ToDecimal(r["ObbligazioniControvalore"]).ToString("#,##0.00");
                    //        //drEmittente["ObbligazioniConcentrazione"] = Convert.ToDecimal(r["ObbligazioniConcentrazione"]).ToString("#,##0.00");
                    //        //drEmittente["AzioniControvalore"] =  Convert.ToDecimal(r["AzioniControvalore"]).ToString("#,##0.00");
                    //        //drEmittente["AzioniConcentrazione"] = Convert.ToDecimal(r["AzioniConcentrazione"]).ToString("#,##0.00");

                    //        //drEmittente["ObbligazioniControvalore"] = r["ObbligazioniControvalore"] == null ? "-" : Convert.ToDecimal(r["ObbligazioniControvalore"]).ToString("C", System.Globalization.CultureInfo.CurrentCulture);
                    //        //drEmittente["ObbligazioniConcentrazione"] = r["ObbligazioniConcentrazione"] == null ? "-" : Convert.ToDecimal(r["ObbligazioniConcentrazione"]).ToString("P", System.Globalization.CultureInfo.CurrentCulture);
                    //        //drEmittente["AzioniControvalore"] = r["AzioniControvalore"] == null ? "-" : Convert.ToDecimal(r["AzioniControvalore"]).ToString("C");
                    //        //drEmittente["AzioniConcentrazione"] = r["AzioniConcentrazione"] == null ? "-" : Convert.ToDecimal(r["AzioniConcentrazione"]).ToString("P2");

                    //        //drEmittente["ObbligazioniControvalore"] = num.ConvertNum(r["ObbligazioniControvalore"]);
                    //        //drEmittente["ObbligazioniConcentrazione"] = num.ConvertNum(r["ObbligazioniConcentrazione"]);

                    //        //drEmittente["AzioniControvalore"] = num.ConvertNum(r["AzioniControvalore"]);
                    //        //drEmittente["AzioniConcentrazione"] = num.ConvertNum(r["AzioniConcentrazione"]);

                    //        //MIFID2 CR Napolitano i simboli vanno solo nell'intestazione
                    //        //drProdotto["Controvalore"] = string.IsNullOrEmpty(r["Controvalore"].ToString()) ? "-" : string.Concat(num.ConvertNum(r["Controvalore"]), " €");
                    //        drProdotto["Controvalore"] = string.IsNullOrEmpty(r["Controvalore"].ToString()) ? "-" : num.ConvertNum(r["Controvalore"]);
                    //        //--MIFID2
                    //        drProdotto["Peso"] = string.IsNullOrEmpty(r["Peso"].ToString()) ? "-" : num.ConvertNum(r["Peso"]);
                    //        totalePatrimonio = Convert.ToDecimal(r["TotalePatrimonio"].ToString());

                    //        ds180.ProdottiAltaComplessita.Rows.Add(drProdotto);

                    //        totaleControvaloreProdotti += Convert.ToDecimal(r["Controvalore"]);
                    //        totalePesoProdotti += Convert.ToDecimal(r["Peso"]);
                    //    }

                    //    //MIFID2 CR Napolitano i simboli vanno solo nell'intestazione
                    //    //drTotaleProdotti["TotaleControvalore"] = string.Concat(num.ConvertNum(Convert.ToDecimal(totaleControvaloreProdotti).ToString()), " €");
                    //    drTotaleProdotti["TotaleControvalore"] = num.ConvertNum(Convert.ToDecimal(totaleControvaloreProdotti).ToString());
                    //    //MIFID2
                    //    drTotaleProdotti["TotalePeso"] = Convert.ToDecimal(num.ConvertNum(totalePesoProdotti)).ToString();

                    //    ds180.TotaleProdotti.Rows.Add(drTotaleProdotti);
                    //}

                    //drTotalePatrimonio = ds180.TotalePatrimonio.NewRow();

                    //drTotalePatrimonio["Descrizione"] = "TOTALE PATRIMONIO";
                    ////drTotalePatrimonio["TotaleControvalore"] = string.Concat(Convert.ToDecimal("11.215.345,87").ToString(), " €");

                    ////MIFID2 CR Napolitano i simboli vanno solo nell'intestazione
                    ////drTotalePatrimonio["TotaleControvalore"] = string.Concat(num.ConvertNum(totalePatrimonio), " €");
                    ////FIX Totale Patrimonio (deve contenere anche tutte le altre voci
                    ////drTotalePatrimonio["TotaleControvalore"] = num.ConvertNum(totalePatrimonio);
                    //drTotalePatrimonio["TotaleControvalore"] = num.ConvertNum(totalePatrimonio
                    //    + dataThread.ContoCorrente +
                    //                        dataThread.PartiteViaggiantiInvestimento +
                    //                        dataThread.PartiteViaggiantiDisinvestimento +
                    //                        dataThread.TotalSelfNegCurrentAccountValue);


                    ////--MIFID2

                    //drTotalePatrimonio["TotalePeso"] = "";

                    //ds180.TotalePatrimonio.Rows.Add(drTotalePatrimonio);

                    //dsr.DatiSezione = ds180;

                    //int esito = 0;

                    ////if (dtFilter.Rows.Count < 5)
                    ////    esito = 0;
                    ////else
                    //esito = ds180.ProdottiAltaComplessita.Rows.Count;

                    //dsr.Esito = esito;
                    //dsr.Esito = 1;
                    return dsr;
                }

            }
            catch (Exception ex)
            {
                try
                {
                    logger.Error(String.Concat(ex.Message, " ", dataThread.CodiceFiscale));
                }
                catch { }
                throw ex;
            }
        }
        #endregion

        #endregion

        #region Recupero Dati
        protected List<DettaglioConcentrazioneProdottiComplessi> GetDettaglioConcentrazioneProdottiComplessi(DataTable dt)
        {
            List<DettaglioConcentrazioneProdottiComplessi> _lista = new List<DettaglioConcentrazioneProdottiComplessi>();


            //List<DettaglioConcentrazioneProdottiComplessi> _lista = UtilityBusinessLayer.ConvertTo<DettaglioConcentrazioneProdottiComplessi>(dt);
            

            // Separo le diverse complessità
            //List<DettaglioConcentrazioneProdottiComplessi> _listaAlta = _lista.Where(f => f.Ordine == 1).Select(s => s).ToList();
            //List<DettaglioConcentrazioneProdottiComplessi> _listaMedioAltaAlta = _lista.Where(f => f.Ordine == 2).Select(s => s).ToList();
            //List<DettaglioConcentrazioneProdottiComplessi> _listaMedioAltaMedioBassaAlta = _lista.Where(f => f.Ordine == 3).Select(s => s).ToList();

            var _listaAlta = dt.AsEnumerable().Where(f => f.Field<int>("Ordine") == 1).Select(s => s).ToList();
            var _listaMedioAltaAlta = dt.AsEnumerable().Where(f => f.Field<int>("Ordine") == 2).Select(s => s).ToList();
            var _listaMedioAltaMedioBassaAlta = dt.AsEnumerable().Where(f => f.Field<int>("Ordine") == 3).Select(s => s).ToList();

            #region lista Alta

            if (_listaAlta.Count > 0)
            {
                decimal ControvaloreDec = 0M;
                decimal PesoDecimale = 0M;

                foreach (var item in _listaAlta.AsEnumerable())
                {
                    if (item != null)
                    {
                        ControvaloreDec += item.Field<decimal>("Controvalore");
                        PesoDecimale += item.Field<decimal>("Peso");

                        _lista.Add(new DettaglioConcentrazioneProdottiComplessi()
                        {
                            Complessita = item.Field<string>("Complessita"),
                            Ordine = item.Field<int>("Ordine"),
                            NomeProdotto = item.Field<string>("NomeProdotto"),  //"Bkamerica 4,2% 14-24",
                            Controvalore = (item.Field<decimal>("Controvalore") == 0 ? "-" : item.Field<decimal>("Controvalore").ToString("#,#0.00")),  //25089.39.ToString("#,##0.000"),
                            Descrizione = item.Field<string>("Descrizione"),
                            CodiceContratto = item.Field<string>("CodiceContratto"),
                            Peso = (item.Field<decimal>("Peso") == 0 ? "-" : item.Field<decimal>("Peso").ToString("#,#0.00")),
                            ControvaloreDecimale = ControvaloreDec,
                            PesoDecimale = PesoDecimale,
                            TotalePatrimonio = item.Field<decimal>("TotalePatrimonio")
                        });
                    }
                    else
                    {
                        _lista.Add(new DettaglioConcentrazioneProdottiComplessi()
                        {
                            Complessita = "-",
                            Ordine = 1,
                            NomeProdotto = "-",  //"Bkamerica 4,2% 14-24",
                            Controvalore = "0.00",
                            Descrizione = "-",
                            CodiceContratto = "-",
                            Peso = "0.00",
                            ControvaloreDecimale = 0M,
                            PesoDecimale = 0M
                        });
                    }
                }
            }
            else
            {
                _lista.Add(new DettaglioConcentrazioneProdottiComplessi()
                {
                    Complessita = "-",
                    Ordine = 1,
                    NomeProdotto = "-",  //"Bkamerica 4,2% 14-24",
                    Controvalore = "0.00",
                    Descrizione = "-",
                    CodiceContratto = "-",
                    Peso = "0.00",
                    ControvaloreDecimale = 0M,
                    PesoDecimale = 0M
                });
            }
            #endregion

            #region lista Medioalta - Alta
            // MedioAlta - Alta
            if (_listaMedioAltaAlta.Count > 0)
            {
                decimal ControvaloreDec = 0M;
                decimal PesoDecimale = 0M;

                foreach (var item in _listaMedioAltaAlta.AsEnumerable())
                {
                    if (item != null)
                    {
                        ControvaloreDec += item.Field<decimal>("Controvalore");
                        PesoDecimale += item.Field<decimal>("Peso");

                        _lista.Add(new DettaglioConcentrazioneProdottiComplessi()
                        {
                            Complessita = item.Field<string>("Complessita"),
                            Ordine = item.Field<int>("Ordine"),
                            NomeProdotto = item.Field<string>("NomeProdotto"),  //"Bkamerica 4,2% 14-24",
                            Controvalore = (item.Field<decimal>("Controvalore") == 0 ? "-" : item.Field<decimal>("Controvalore").ToString("#,#0.00")),  //25089.39.ToString("#,##0.000"),
                            Descrizione = item.Field<string>("Descrizione"),
                            CodiceContratto = item.Field<string>("CodiceContratto"),
                            Peso = (item.Field<decimal>("Peso") == 0 ? "-" : item.Field<decimal>("Peso").ToString("#,#0.00")),
                            ControvaloreDecimale = ControvaloreDec,
                            PesoDecimale = PesoDecimale,
                            TotalePatrimonio = item.Field<decimal>("TotalePatrimonio")
                        });
                    }
                    else
                    {
                        _lista.Add(new DettaglioConcentrazioneProdottiComplessi()
                        {
                            Complessita = "-",
                            Ordine = 2,
                            NomeProdotto = "-",  //"Bkamerica 4,2% 14-24",
                            Controvalore = "0.00",
                            Descrizione = "-",
                            CodiceContratto = "-",
                            Peso = "0.00",
                            ControvaloreDecimale = 0M,
                            PesoDecimale = 0M
                        });
                    }
                }

            }
            else
            {
                _lista.Add(new DettaglioConcentrazioneProdottiComplessi()
                {
                    Complessita = "-",
                    Ordine = 2,
                    NomeProdotto = "-",  //"Bkamerica 4,2% 14-24",
                    Controvalore = "0.00",
                    Descrizione = "-",
                    CodiceContratto = "-",
                    Peso = "0.00",
                    ControvaloreDecimale = 0M,
                    PesoDecimale = 0M
                });
            }
            #endregion

            #region lista MedioAlta MedioBassa Alta
            if (_listaMedioAltaMedioBassaAlta.Count > 0)
            {
                decimal ControvaloreDec = 0M;
                decimal PesoDecimale = 0M;

                foreach (var item in _listaMedioAltaMedioBassaAlta.AsEnumerable())
                {
                    if (item != null)
                    {
                        ControvaloreDec += item.Field<decimal>("Controvalore");
                        PesoDecimale += item.Field<decimal>("Peso");

                        _lista.Add(new DettaglioConcentrazioneProdottiComplessi()
                        {
                            Complessita = item.Field<string>("Complessita"),
                            Ordine = item.Field<int>("Ordine"),
                            NomeProdotto = item.Field<string>("NomeProdotto"),  //"Bkamerica 4,2% 14-24",
                            Controvalore = (item.Field<decimal>("Controvalore") == 0 ? "-" : item.Field<decimal>("Controvalore").ToString("#,#0.00")),  //25089.39.ToString("#,##0.000"),
                            Descrizione = item.Field<string>("Descrizione"),
                            CodiceContratto = item.Field<string>("CodiceContratto"),
                            Peso = (item.Field<decimal>("Peso") == 0 ? "-" : item.Field<decimal>("Peso").ToString("#,#0.00")),
                            ControvaloreDecimale = ControvaloreDec,
                            PesoDecimale = PesoDecimale,
                            TotalePatrimonio = item.Field<decimal>("TotalePatrimonio")
                        });
                    }
                    else
                    {
                        _lista.Add(new DettaglioConcentrazioneProdottiComplessi()
                        {
                            Complessita = "-",
                            Ordine = 3,
                            NomeProdotto = "-",  //"Bkamerica 4,2% 14-24",
                            Controvalore = "0.00",
                            Descrizione = "-",
                            CodiceContratto = "-",
                            Peso = "0.00",
                            ControvaloreDecimale = 0M,
                            PesoDecimale = 0M
                        });
                    }
                }
            }
            else
            {
                _lista.Add(new DettaglioConcentrazioneProdottiComplessi()
                {
                    Complessita = "-",
                    Ordine = 3,
                    NomeProdotto = "-",  //"Bkamerica 4,2% 14-24",
                    Controvalore = "0.00",
                    Descrizione = "-",
                    CodiceContratto = "-",
                    Peso = "0.00",
                    ControvaloreDecimale = 0M,
                    PesoDecimale = 0M
                });
            }
            #endregion

            string Descrizione = _lista.Where(f => f.Descrizione != "-").Select(s => s.Descrizione).First();

            _lista.ForEach(ec => ec.Descrizione = Descrizione);

            return _lista;
        }

        protected List<TotaleDettConcentrazioneProdComplessi> GetTotaliConcentrazioneProdottiComplessi(DataTable dt)
        {
            List<TotaleDettConcentrazioneProdComplessi> _listaTotaliComplessita = new List<TotaleDettConcentrazioneProdComplessi>();
            List<TotaleDettConcentrazioneProdComplessi> _listaTotali = UtilityBusinessLayer.ConvertTo<TotaleDettConcentrazioneProdComplessi>(dt);

            // Separo i totali per le diverse complessità
            List<TotaleDettConcentrazioneProdComplessi> _listaTotAlta = _listaTotali.Where(f => f.Ordine == 1).Select(s => s).ToList();
            List<TotaleDettConcentrazioneProdComplessi> _listaTotMedioAltaAlta = _listaTotali.Where(f => f.Ordine == 2).Select(s => s).ToList();
            List<TotaleDettConcentrazioneProdComplessi> _listaTotMedioAltaMedioBassaAlta = _listaTotali.Where(f => f.Ordine == 3).Select(s => s).ToList();

            #region lista Totali Alta
            if (_listaTotAlta.Count > 0)
            {
                foreach (var item in _listaTotAlta.Take(1))
                {
                    _listaTotaliComplessita.Add(new TotaleDettConcentrazioneProdComplessi()
                    {
                        Ordine = item.Ordine,
                        Descrizione = "TOTALE PRODOTTI CON COMPLESSITA’ ALTA",
                        SommaControvalore = (item.SommaControvalore == "0" ? "-" : Convert.ToDecimal(item.SommaControvalore).ToString("#,#0.00")),
                        SommaPesi = (item.SommaPesi == "0" ? "-" : Convert.ToDecimal(item.SommaPesi).ToString("#,#0.00")),
                    });
                }
            }
            else
            {
                _listaTotaliComplessita.Add(new TotaleDettConcentrazioneProdComplessi()
                {
                    Ordine = 1,
                    Descrizione = "TOTALE PRODOTTI CON COMPLESSITA’ ALTA",
                    SommaControvalore = "0.00",
                    SommaPesi = "0.00",
                });
            }
            #endregion

            #region lista Totali MedioAlta - Alta
            if (_listaTotMedioAltaAlta.Count > 0)
            {
                foreach (var item in _listaTotMedioAltaAlta.Take(1))
                {
                    _listaTotaliComplessita.Add(new TotaleDettConcentrazioneProdComplessi()
                    {
                        Ordine = item.Ordine,
                        Descrizione = "TOTALE PRODOTTI CON COMPLESSITA’ MEDIO - ALTA e ALTA",
                        SommaControvalore = (item.SommaControvalore == "0" ? "-" : Convert.ToDecimal(item.SommaControvalore).ToString("#,#0.00")),
                        SommaPesi = (item.SommaPesi == "0" ? "-" : Convert.ToDecimal(item.SommaPesi).ToString("#,#0.00")),
                    });
                }
            }
            else
            {
                _listaTotaliComplessita.Add(new TotaleDettConcentrazioneProdComplessi()
                {
                    Ordine = 2,
                    Descrizione = "TOTALE PRODOTTI CON COMPLESSITA’ MEDIO - ALTA e ALTA",
                    SommaControvalore = "0.00",
                    SommaPesi = "0.00",
                });
            }
            #endregion

            #region lista Totali MedioBassa - MedioAlta - Alta
            if (_listaTotMedioAltaMedioBassaAlta.Count > 0)
            {
                foreach (var item in _listaTotMedioAltaMedioBassaAlta.Take(1))
                {
                    _listaTotaliComplessita.Add(new TotaleDettConcentrazioneProdComplessi()
                    {
                        Ordine = item.Ordine,
                        Descrizione = "TOTALE PRODOTTI CON COMPLESSITA’ MEDIO - BASSA,MEDIO - ALTA e ALTA",
                        SommaControvalore = (item.SommaControvalore == "0" ? "-" : Convert.ToDecimal(item.SommaControvalore).ToString("#,#0.00")),
                        SommaPesi = (item.SommaPesi == "0" ? "-" : Convert.ToDecimal(item.SommaPesi).ToString("#,#0.00")),
                    });
                }
            }
            else
            {
                _listaTotaliComplessita.Add(new TotaleDettConcentrazioneProdComplessi()
                {
                    Ordine = 3,
                    Descrizione = "TOTALE PRODOTTI CON COMPLESSITA’ MEDIO - BASSA,MEDIO - ALTA e ALTA",
                    SommaControvalore = "0.00",
                    SommaPesi = "0.00",
                });
            }
            #endregion

            return _listaTotaliComplessita;
        }

        protected List<TotaleDettConcentrazioneProdComplessi> GetTotaleGeneraleProdotticomplessi(DataTable dt, List<DettaglioConcentrazioneProdottiComplessi> _listaDettaglio)
        {
            List<TotaleDettConcentrazioneProdComplessi> listaTotGenerale = new List<TotaleDettConcentrazioneProdComplessi>();
            List<TotaleDettConcentrazioneProdComplessi> _listaTotali = UtilityBusinessLayer.ConvertTo<TotaleDettConcentrazioneProdComplessi>(dt);

            foreach (var item in _listaTotali.Take(1))
            {
                listaTotGenerale.Add(new TotaleDettConcentrazioneProdComplessi()
                {
                    Descrizione = "TOTALE PATRIMONIO",
                    //TotalePatrimonioCTV = _listaDettaglio.Sum(ss => ss.ControvaloreDecimale).ToString("#,#0.00"),
                    TotalePatrimonioCTV = _listaDettaglio.Where(aa=> aa.TotalePatrimonio > 0).FirstOrDefault()?.TotalePatrimonio.ToString("#,#0.00"),
                    TotalePatrimonioPesi = "100,00"  //_listaDettaglio.Sum(ss => ss.PesoDecimale).ToString("#,#0.00")
                }); ; 
            }

            return listaTotGenerale;
        }
        #endregion
    }

    public class DettaglioConcentrazioneProdottiComplessi
    {
        public string Descrizione { get; set; }

        [Description("Tipo Complessità")]
        public int Ordine { get; set; }

        [Description("codice Contratto")]
        public string CodiceContratto { get; set; }

        [Description("Descrizione")]
        public string NomeProdotto { get; set; }
        [Description("ctv")]
        public string Controvalore { get; set; }

        [Description("Peso Percentuale")]
        public string Peso { get; set; }

        [Description("Complessita")]
        public string Complessita { get; set; }
        public decimal ControvaloreDecimale { get; set; }
        public decimal PesoDecimale { get; set; }

        public decimal TotalePatrimonio { get; set; }

    }

    public class TotaleDettConcentrazioneProdComplessi
    {
        [Description("Tipo Complessità")]
        public int Ordine { get; set; }
        public string Descrizione { get; set; }
        public string TotalePatrimonioCTV { get; set; }
        public string TotalePatrimonioPesi { get; set; }
        public string SommaControvalore { get; set; }
        public string SommaPesi { get; set; }
    }
}