using System;
using System.Collections.Generic;
using System.Text;
using System.Data;

namespace PDFGenerator.BusinessLayer.DataSection
{

    /// <summary>
    /// Summary description for DSS57BISConfrontoPiramideAttualeModello
    /// </summary>
    public class DSS157ConfrontoPiramideAttualeModello : IDataSection
    {

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


        /// <summary>
        /// Recupera i dati per la stampa della S57BIS.
        /// </summary>
        /// <param name="tabelleSessione"></param>
        /// <param name="querySql"></param>
        /// <param name="dataThread"></param>
        /// <returns></returns>
        public DataSectionResult getDataSection(List<SessionStruct> tabelleSessione, string querySql, DataThread dataThread)
        {
            DataSetS157 dataset157 = new DataSetS157();
            FormatNum conv = new FormatNum();
            DataSectionResult dsr = new DataSectionResult();

            Random rnd = new Random();
            DataTable dt = new DataTable();

            bool _mostracolonnacopertura = false;

            if (dataThread.Patrimoniobancafideuramctv != 0)
            {

                Decimal ctvTotale = 0;
               // Decimal ctvCC = 0;
                Decimal ctvNA = 0;

                dt = SectionManager.GetDataSection(tabelleSessione, querySql, dataThread);

                decimal residuo = 100;
                decimal valorePercMaggiore = 0;
                DataSetS157.GraficoFarfallaRow tupla_maggiore = null;

                //Se il cliente ha solo CC presso BF la query ritorna solo 2 righe e non bisogna visualizzare niente
                if (dt.Rows.Count > 3)
                {

                    #region Tabella del GraficoPiramide

                    decimal totaleRisorseAllocate = 0;
                    int iOrderNeedArea = 0;

                    foreach (DataRow row in dt.Rows)
                    {
                        // escludo risorse non allocate (na), contocorrente (cc) , pro, pre1 e pre2
                        if (row["needarea"].ToString().ToLower() != "na" && row["needarea"].ToString().ToLower() != "cc" && row["needarea"].ToString().ToLower() != "pro" && row["needarea"].ToString().ToLower() != "pre1" && row["needarea"].ToString().ToLower() != "pre2")
                        {

                            //Grafico Piramide
                            DataSetS157.GraficoPiramideRow rowDSS157GraficoPiramide;
                            rowDSS157GraficoPiramide = dataset157.GraficoPiramide.NewGraficoPiramideRow();
                            rowDSS157GraficoPiramide.AreaBisogno = row["needarea"].ToString();
                            rowDSS157GraficoPiramide.Controvalore = conv.ConvertNum(row["controvaloreAttuale"].ToString());
                            totaleRisorseAllocate += Convert.ToDecimal(row["controvaloreAttuale"]);
                            rowDSS157GraficoPiramide.Rischio = row["var_needareaString"] == DBNull.Value ? conv.ConvertNum(row["var_needarea"].ToString()) : row["var_needareaString"].ToString();
                            rowDSS157GraficoPiramide.Copertura = row["copertura_needareaString"] == DBNull.Value ? conv.ConvertNum(row["copertura_needarea"].ToString()) : row["copertura_needareaString"].ToString();

                            if ((Convert.ToDecimal(rowDSS157GraficoPiramide.Controvalore) == 0) || (Convert.ToDecimal(rowDSS157GraficoPiramide.Controvalore) == 0M) || (Convert.ToDecimal(rowDSS157GraficoPiramide.Controvalore) == 0M))
                            {
                                rowDSS157GraficoPiramide.Rischio = "0,00";
                                rowDSS157GraficoPiramide.Copertura = "100,00";
                            }

                            dataset157.GraficoPiramide.AddGraficoPiramideRow(rowDSS157GraficoPiramide);


                            //Grafico Farfalla                  
                            DataSetS157.GraficoFarfallaRow rowDSS157GraficoFarfalla;
                            rowDSS157GraficoFarfalla = dataset157.GraficoFarfalla.NewGraficoFarfallaRow();
                                                      
                            
                            rowDSS157GraficoFarfalla.PercentualeAttuale = row["percentualeAttuale"] == DBNull.Value ? 0 : decimal.Round(Convert.ToDecimal(row["percentualeAttuale"]), 2);
                            if (rowDSS157GraficoFarfalla.PercentualeAttuale > valorePercMaggiore)
                            {
                                tupla_maggiore = rowDSS157GraficoFarfalla;
                                valorePercMaggiore = rowDSS157GraficoFarfalla.PercentualeAttuale;
                            }
                            residuo -= rowDSS157GraficoFarfalla.PercentualeAttuale;
                            

                            rowDSS157GraficoFarfalla.PercentualeModello = row["percentualeModello"] == DBNull.Value ? 0 : Convert.ToDecimal(row["percentualeModello"]);
                            rowDSS157GraficoFarfalla.NeedArea = row["needarea"].ToString().ToLower();
                            rowDSS157GraficoFarfalla.OrderNeedArea = iOrderNeedArea++;

                            dataset157.GraficoFarfalla.AddGraficoFarfallaRow(rowDSS157GraficoFarfalla);
                        }

                    }

                    
                        if (residuo != 0 && tupla_maggiore != null)
                        {
                            tupla_maggiore.PercentualeAttuale += residuo;
                        }
                    
                    #endregion

                    #region Risorse Allocate
                    DataSetS157.RisorseAllocateRow rowDSS157RisorseAllocate;
                    rowDSS157RisorseAllocate = dataset157.RisorseAllocate.NewRisorseAllocateRow();
                    rowDSS157RisorseAllocate.Descrizione = "TOTALE RISORSE ALLOCATE";
                    rowDSS157RisorseAllocate.Controvalore = conv.ConvertNum(totaleRisorseAllocate);
                    //V Cambiato il puntamento alla query per prendere il var della piramide invece che quello complessivo che tiene conto delle risorse non associate
                    rowDSS157RisorseAllocate.Rischio = dt.Rows[0]["var_tot_pirString"] == DBNull.Value ? conv.ConvertNum(dt.Rows[0]["var_tot_pir"].ToString()) : dt.Rows[0]["var_tot_pirString"].ToString();

                    rowDSS157RisorseAllocate.Copertura = dt.Rows[0]["copertura_tot_pirString"] == DBNull.Value ? conv.ConvertNum(dt.Rows[0]["copertura_tot_pir"].ToString()) : dt.Rows[0]["copertura_tot_pirString"].ToString();

                    if (Convert.ToDecimal(rowDSS157RisorseAllocate.Controvalore) == 0)
                    {
                        rowDSS157RisorseAllocate.Rischio = "0,00";
                        rowDSS157RisorseAllocate.Copertura = "100,00";
                    }
                    //


                    #endregion

                    #region Risorse non allocate

                    decimal rischioRisorsenonAllocate = 0;
                    decimal coperturaRisorseNonAllocate = -1;
                    decimal ctvRisorseNonAllocate = 0;
                    DataSetS157.RisorseNonAllocateRow rowDSS157RisorseNonAllocate;
                    rowDSS157RisorseNonAllocate = dataset157.RisorseNonAllocate.NewRisorseNonAllocateRow();
                    rowDSS157RisorseNonAllocate.Descrizione = "Risorse non allocate";

                    DataRow[] drRisorseNonAllocate = dt.Select(" NeedArea='Na'");
                    if (drRisorseNonAllocate.Length > 0)
                    {

                        rowDSS157RisorseNonAllocate.Controvalore = conv.ConvertNum(drRisorseNonAllocate[0]["controvaloreAttuale"]);
                        ctvRisorseNonAllocate = drRisorseNonAllocate[0]["controvaloreAttuale"] == DBNull.Value ? 0 : Convert.ToDecimal(drRisorseNonAllocate[0]["controvaloreAttuale"]);
                        if (ctvRisorseNonAllocate != 0)
                        {

                            rischioRisorsenonAllocate = drRisorseNonAllocate[0]["var_needarea"] == DBNull.Value ? 0 : Convert.ToDecimal(drRisorseNonAllocate[0]["var_needarea"]);
                            coperturaRisorseNonAllocate = drRisorseNonAllocate[0]["copertura_needarea"] == DBNull.Value ? 0 : Convert.ToDecimal(drRisorseNonAllocate[0]["copertura_needarea"]);


                        }
                    }

                    rowDSS157RisorseNonAllocate.Controvalore = conv.ConvertNum(ctvRisorseNonAllocate);
                    rowDSS157RisorseNonAllocate.Rischio = conv.ConvertNum(rischioRisorsenonAllocate);
                    rowDSS157RisorseNonAllocate.Copertura = conv.ConvertNum(coperturaRisorseNonAllocate);

                    //V lo setto per le approsimazioni
                    ctvNA = ctvRisorseNonAllocate;

                    // In caso in cui le risorse non allocate siano uguali a 0 non deve essere mostrata la riga; 
                    // non deve essere mostrata nemmeno la riga delle risorse allocate, ma direttamente delle risorse finanziarie
                    if (ctvRisorseNonAllocate != 0M)
                    {
                        dataset157.RisorseAllocate.AddRisorseAllocateRow(rowDSS157RisorseAllocate);
                        dataset157.RisorseNonAllocate.AddRisorseNonAllocateRow(rowDSS157RisorseNonAllocate);
                    }

                    #endregion

                    #region Risorse Finanziarie
                    // totale delle Risorse Finanziarie
                    DataSetS157.RisorseFinanziarieRow rowDSS157RisorseFinanziarie;
                    rowDSS157RisorseFinanziarie = dataset157.RisorseFinanziarie.NewRisorseFinanziarieRow();
                    rowDSS157RisorseFinanziarie.Descrizione = "TOTALE RISORSE FINANZIARIE";
                    rowDSS157RisorseFinanziarie.Controvalore = conv.ConvertNum(totaleRisorseAllocate + ctvRisorseNonAllocate);
                    rowDSS157RisorseFinanziarie.Rischio = dt.Rows[0]["var_risfinString"] == DBNull.Value ? conv.ConvertNum(dt.Rows[0]["var_risfin"].ToString()) : dt.Rows[0]["var_risfinString"].ToString(); //D //conv.ConvertNum(ptfTotaleBF.misureRischio.varp);
                    rowDSS157RisorseFinanziarie.Copertura = dt.Rows[0]["copertura_risfinString"] == DBNull.Value ? conv.ConvertNum(dt.Rows[0]["copertura_risfin"].ToString()) : dt.Rows[0]["copertura_risfinString"].ToString();  //D 

                    //V Setto copertura = 100 e var = 0 nel caso il ctv sia uguale a 0
                    if (totaleRisorseAllocate + ctvRisorseNonAllocate == 0)
                    {
                        rowDSS157RisorseFinanziarie.Rischio = "0,00";
                        rowDSS157RisorseFinanziarie.Copertura = "100,00";
                    }

                    dataset157.RisorseFinanziarie.AddRisorseFinanziarieRow(rowDSS157RisorseFinanziarie);

                    #endregion

                    #region Conto Corrente Negativo

                    decimal ctvContoCorrente = 0;
                    DataSetS157.ContoCorrenteRow rowDSS157ContoCorrente;
                    rowDSS157ContoCorrente = dataset157.ContoCorrente.NewContoCorrenteRow();
                    //rowDSS57BISContoCorrente.Descrizione = "Conto corrente";
                    rowDSS157ContoCorrente.Descrizione = "C/C a saldo negativo";
                    //DataRow[] drContoCorrente = dt.Select(" NeedArea='CC'");
                    //if (drContoCorrente.Length > 0)
                    //    ctvContoCorrente = drContoCorrente[0]["controvaloreAttuale"] == DBNull.Value ? 0 : Convert.ToDecimal(drContoCorrente[0]["controvaloreAttuale"]);

                    ctvContoCorrente = dataThread.ContoCorrente;
                    rowDSS157ContoCorrente.Controvalore = conv.ConvertNum(ctvContoCorrente);
                    rowDSS157ContoCorrente.Rischio = "0,00";
                    rowDSS157ContoCorrente.Copertura = "100,00";
                    //Hazem
                    //if (dt.Rows[0]["var_needareaString"] != DBNull.Value)
                    //    rowDSS57BISContoCorrente.Rischio = dt.Rows[0]["var_needareaString"].ToString();
                    //else
                    // rowDSS57BISContoCorrente.Rischio = conv.ConvertNum("0.00");          

                    dataset157.ContoCorrente.AddContoCorrenteRow(rowDSS157ContoCorrente);


                    #endregion


                    #region Linea Self Negativa                    
                    decimal ctvLineaSelfNegativa = 0;
                    DataSetS157.LineaSelfRow rowDSS157LineaSelfNegativa;
                    rowDSS157LineaSelfNegativa = dataset157.LineaSelf.NewLineaSelfRow();
                    rowDSS157LineaSelfNegativa.Descrizione = "Liquidità negativa \"Linee GP Eligo\"";
                    ctvLineaSelfNegativa = dataThread.TotalSelfNegCurrentAccountValue;
                    rowDSS157LineaSelfNegativa.Controvalore = conv.ConvertNum(ctvLineaSelfNegativa);
                    rowDSS157LineaSelfNegativa.Rischio = "n.c.";
                    rowDSS157LineaSelfNegativa.Copertura = "100,00";
                    dataset157.LineaSelf.AddLineaSelfRow(rowDSS157LineaSelfNegativa);

                    #endregion


                    #region PartiteViaggianti
                    DataSetS157.PartiteViaggiantiRow rowDSS157PartiteViaggianti;
                    rowDSS157PartiteViaggianti = dataset157.PartiteViaggianti.NewPartiteViaggiantiRow();
                    rowDSS157PartiteViaggianti.Descrizione = Resource.PartiteViaggianti;
                    decimal totalePartiteViaggianti = dataThread.PartiteViaggiantiInvestimento + dataThread.PartiteViaggiantiDisinvestimento;
                    rowDSS157PartiteViaggianti.ControValore = conv.ConvertNum(totalePartiteViaggianti);
                    if (totalePartiteViaggianti != 0)
                        dataset157.PartiteViaggianti.AddPartiteViaggiantiRow(rowDSS157PartiteViaggianti);

                    #endregion

                    #region Totale Patrimonio
                    DataSetS157.TotalePatrimonioRow rowDSS157TotalePatrimonio;
                    rowDSS157TotalePatrimonio = dataset157.TotalePatrimonio.NewTotalePatrimonioRow();
                    rowDSS157TotalePatrimonio.Descrizione = "TOTALE PATRIMONIO";

                    decimal totalePatrimonio = totaleRisorseAllocate + ctvContoCorrente + totalePartiteViaggianti + ctvRisorseNonAllocate + ctvLineaSelfNegativa;
                    rowDSS157TotalePatrimonio.ControValore = conv.ConvertNum(totalePatrimonio);

                    //V Settato per le approsimazioni
                    ctvTotale = totaleRisorseAllocate;

                    //Hazem
                    if (dt.Rows[0]["var_totString"] != DBNull.Value)
                        rowDSS157TotalePatrimonio.Rischio = dt.Rows[0]["var_totString"].ToString();
                    else
                        rowDSS157TotalePatrimonio.Rischio = conv.ConvertNum(dt.Rows[0]["var_tot"]);

                    if (dt.Rows[0]["copertura_totString"] != DBNull.Value)
                        rowDSS157TotalePatrimonio.Copertura = dt.Rows[0]["copertura_totString"].ToString();
                    else
                        rowDSS157TotalePatrimonio.Copertura = conv.ConvertNum(dt.Rows[0]["copertura_tot"]);


                    dataset157.TotalePatrimonio.AddTotalePatrimonioRow(rowDSS157TotalePatrimonio);


                    #endregion

                    #region Resulset

                    // verifico se nel datatable GraficoPiramide almeno 1 grado copertura è diverso da 100 e il grado di copertura delle risorse non allocate è diverso da 100
                    // se si verrà disegnata la colonna relativa al grado di coperura.
                    DataTable dtMostraColonnaCopertura;
                    DataView dwMostraColonnaCopertura = new DataView(dataset157.GraficoPiramide);
                    dwMostraColonnaCopertura.RowFilter = "Copertura <> '100,00'";
                    dtMostraColonnaCopertura = dwMostraColonnaCopertura.ToTable();
                    _mostracolonnacopertura = (dtMostraColonnaCopertura.Rows.Count > 0 || (coperturaRisorseNonAllocate != 100M && coperturaRisorseNonAllocate != -1M));

                    DataSetS157.ResultSetRow rowDSS157ResultSet;
                    rowDSS157ResultSet = dataset157.ResultSet.NewResultSetRow();
                    rowDSS157ResultSet.MostraColonnaCopertura = _mostracolonnacopertura;
                    dataset157.ResultSet.AddResultSetRow(rowDSS157ResultSet);

                    #endregion

                }
                //V condizione presente nella S57 non riportata nella bis
                dataThread.TotaleS57 = ctvTotale + ctvNA + dataThread.ContoCorrente - dataThread.PatrimonioNonRappresentabile;
            }


            dsr.DatiSezione = dataset157;
            dsr.Esito = dataset157.GraficoPiramide.Rows.Count;


            return dsr;

        }
    }


}