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

namespace PDFGenerator.BusinessLayer.DataSection
{

    /// <summary>
    /// Summary description for DSS80Alternativa
    /// </summary>
    public class DSS80Alternativa : IDataSection
    {
        private string obtainAsteriscs(int number)
        {
            string sequence = string.Empty;
            for (int i = 0; i < number; i++) sequence = string.Format("{0}{1}", sequence, "*");
            return sequence;
        }

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

        /// <summary>
        /// Recupera i dati per la stampa della S80ALT.
        /// </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)
        {


            DataSetS80ALT dsS80ALT = new DataSetS80ALT();
            FormatNum conv = new FormatNum();
            DataSectionResult dsr = new DataSectionResult();

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

            if (dataThread.Patrimoniobancafideuramctv != 0 && dt.Rows.Count > 0)
            {

                // Set Phase 1 date
                #region Data Avvio Monitoraggio

                DateTime? dataAvvioMonitoraggio = null;
                DateTime dataPrecedenteInvioReport = new DateTime();
                //DateTime dataSituazioneCorrenteReport = new DateTime();

                FormatNum formatNum = new FormatNum();

                DataView dvAvvioMonitoraggio = new DataView(dt);
                dvAvvioMonitoraggio.RowFilter = ("Fase = 1");

                if (dvAvvioMonitoraggio.Count > 0)
                {
                    DataRow row = dvAvvioMonitoraggio[0].Row;
                    dataAvvioMonitoraggio = Convert.ToDateTime(row["DataFase"].ToString());
                }
                #endregion

                // Set Phase 2 date
                #region Data Precedente Invio Report

                DataView dwPrecedenteInvioReport = new DataView(dt);
                dwPrecedenteInvioReport.RowFilter = ("Fase = 2");
                if (dwPrecedenteInvioReport.Count > 0)
                {
                    DataRow rowPrecedenteInvioReport = dwPrecedenteInvioReport[0].Row;
                    dataPrecedenteInvioReport = Convert.ToDateTime(rowPrecedenteInvioReport["DataFase"].ToString());
                }
                #endregion

                #region Piramide dati per fasi
                // The data rows of each phase.
                DataRow[] drFase1 = dt.Select(" fase  = 1");
                DataRow[] drFase2 = dt.Select(" fase  = 2");
                DataRow[] drFase3 = dt.Select(" fase  = 3");

                // caption dell' header della Tabella
                if (dataAvvioMonitoraggio.HasValue)
                {
                    dsS80ALT.GraficoPiramide.Fase1Column.Caption = "Avvio Monitoraggio <BR>(" + dataAvvioMonitoraggio.Value.ToShortDateString() + ")";
                }

                if (dwPrecedenteInvioReport.Count > 0)
                    dsS80ALT.GraficoPiramide.Fase2Column.Caption = "Precedente invio report <BR>(" + dataPrecedenteInvioReport.ToShortDateString() + ")";
                else
                    dsS80ALT.GraficoPiramide.Fase2Column.Caption = string.Empty;

                dsS80ALT.GraficoPiramide.Fase3Column.Caption = "Situazione Corrente <BR>(" + dataThread.DataFineTrimestreCorrente.ToShortDateString() + ")";

                DataSetS80ALT.GraficoPiramideRow rowGraficoPiramide0 = dsS80ALT.GraficoPiramide.NewGraficoPiramideRow();
                DataSetS80ALT.GraficoPiramideRow rowGraficoPiramide1 = dsS80ALT.GraficoPiramide.NewGraficoPiramideRow();
                DataSetS80ALT.GraficoPiramideRow rowGraficoPiramide2 = dsS80ALT.GraficoPiramide.NewGraficoPiramideRow();
                DataSetS80ALT.GraficoPiramideRow rowGraficoPiramide3 = dsS80ALT.GraficoPiramide.NewGraficoPiramideRow();
                DataSetS80ALT.GraficoPiramideRow rowGraficoPiramide4 = dsS80ALT.GraficoPiramide.NewGraficoPiramideRow();

                if (drFase1.Length > 0)
                {
                    rowGraficoPiramide0.Fase1 = formatNum.ConvertNum(drFase1[0]["CTV_EXT"].ToString());
                    rowGraficoPiramide1.Fase1 = formatNum.ConvertNum(drFase1[0]["CTV_INV"].ToString());
                    rowGraficoPiramide2.Fase1 = formatNum.ConvertNum(drFase1[0]["CTV_PRE"].ToString());
                    rowGraficoPiramide3.Fase1 = formatNum.ConvertNum(drFase1[0]["CTV_RIS"].ToString());
                    rowGraficoPiramide4.Fase1 = formatNum.ConvertNum(drFase1[0]["CTV_LIQ"].ToString());
                }


                if (drFase2.Length > 0)
                {
                    rowGraficoPiramide0.Fase2 = formatNum.ConvertNum(drFase2[0]["CTV_EXT"].ToString());
                    rowGraficoPiramide1.Fase2 = formatNum.ConvertNum(drFase2[0]["CTV_INV"].ToString());
                    rowGraficoPiramide2.Fase2 = formatNum.ConvertNum(drFase2[0]["CTV_PRE"].ToString());
                    rowGraficoPiramide3.Fase2 = formatNum.ConvertNum(drFase2[0]["CTV_RIS"].ToString());
                    rowGraficoPiramide4.Fase2 = formatNum.ConvertNum(drFase2[0]["CTV_LIQ"].ToString());
                }

                if (drFase3.Length > 0)
                {
                    rowGraficoPiramide0.Fase3 = formatNum.ConvertNum(drFase3[0]["CTV_EXT"].ToString());
                    rowGraficoPiramide1.Fase3 = formatNum.ConvertNum(drFase3[0]["CTV_INV"].ToString());
                    rowGraficoPiramide2.Fase3 = formatNum.ConvertNum(drFase3[0]["CTV_PRE"].ToString());
                    rowGraficoPiramide3.Fase3 = formatNum.ConvertNum(drFase3[0]["CTV_RIS"].ToString());
                    rowGraficoPiramide4.Fase3 = formatNum.ConvertNum(drFase3[0]["CTV_LIQ"].ToString());
                }

                dsS80ALT.GraficoPiramide.AddGraficoPiramideRow(rowGraficoPiramide0);
                dsS80ALT.GraficoPiramide.AddGraficoPiramideRow(rowGraficoPiramide1);
                dsS80ALT.GraficoPiramide.AddGraficoPiramideRow(rowGraficoPiramide2);
                dsS80ALT.GraficoPiramide.AddGraficoPiramideRow(rowGraficoPiramide3);
                dsS80ALT.GraficoPiramide.AddGraficoPiramideRow(rowGraficoPiramide4);

                #endregion

                #region Totale Risorse Allocate
                DataSetS80ALT.RisorseAllocateRow drDatiTotaleRisorseAllocate;
                drDatiTotaleRisorseAllocate = dsS80ALT.RisorseAllocate.NewRisorseAllocateRow();
                drDatiTotaleRisorseAllocate.Descrizione = "TOTALE RISORSE ALLOCATE";

                if (drFase1.Length > 0)
                {
                    drDatiTotaleRisorseAllocate.Fase1 = formatNum.ConvertNum(drFase1[0]["RisorseAllocate"].ToString());
                }

                if (drFase2.Length > 0)
                {
                    drDatiTotaleRisorseAllocate.Fase2 = formatNum.ConvertNum(drFase2[0]["RisorseAllocate"].ToString());
                }


                if (drFase3.Length > 0)
                {
                    drDatiTotaleRisorseAllocate.Fase3 = formatNum.ConvertNum(drFase3[0]["RisorseAllocate"].ToString());
                }

                dsS80ALT.RisorseAllocate.AddRisorseAllocateRow(drDatiTotaleRisorseAllocate);
                #endregion

                #region Risorse non allocate
                DataSetS80ALT.RisorseNonAllocateRow drRisorseNonAllocate;
                drRisorseNonAllocate = dsS80ALT.RisorseNonAllocate.NewRisorseNonAllocateRow();
                drRisorseNonAllocate.Descrizione = "Risorse non allocate";

                if (drFase1.Length > 0)
                {
                    drRisorseNonAllocate.Fase1 = formatNum.ConvertNum(drFase1[0]["RisorseNonAllocate"].ToString());
                }

                if (drFase2.Length > 0)
                {
                    drRisorseNonAllocate.Fase2 = formatNum.ConvertNum(drFase2[0]["RisorseNonAllocate"].ToString());
                }

                if (drFase3.Length > 0)
                {
                    drRisorseNonAllocate.Fase3 = formatNum.ConvertNum(drFase3[0]["RisorseNonAllocate"].ToString());
                }

                dsS80ALT.RisorseNonAllocate.AddRisorseNonAllocateRow(drRisorseNonAllocate);
                #endregion

                #region TOTALE RISORSE FINANZIARIE

                DataSetS80ALT.RisorseFinanziarieRow drDatiTotaleRisorseFinanziarie;
                drDatiTotaleRisorseFinanziarie = dsS80ALT.RisorseFinanziarie.NewRisorseFinanziarieRow();
                drDatiTotaleRisorseFinanziarie.Descrizione = "TOTALE RISORSE FINANZIARIE";

                if (drFase1.Length > 0)
                {
                    drDatiTotaleRisorseFinanziarie.Fase1 = formatNum.ConvertNum(drFase1[0]["RisorseFinanziarie"].ToString());
                }

                if (drFase2.Length > 0)
                {
                    drDatiTotaleRisorseFinanziarie.Fase2 = formatNum.ConvertNum(drFase2[0]["RisorseFinanziarie"].ToString());
                }


                if (drFase3.Length > 0)
                {
                    drDatiTotaleRisorseFinanziarie.Fase3 = formatNum.ConvertNum(drFase3[0]["RisorseFinanziarie"].ToString());
                }

                dsS80ALT.RisorseFinanziarie.AddRisorseFinanziarieRow(drDatiTotaleRisorseFinanziarie);

                #endregion

                #region Scoperto di conto corrente

                DataSetS80ALT.ContoCorrenteRow drDatiContoCorrenteNegativo;
                drDatiContoCorrenteNegativo = dsS80ALT.ContoCorrente.NewContoCorrenteRow();
                drDatiContoCorrenteNegativo.Descrizione = "Scoperto di conto corrente";

                if (drFase1.Length > 0)
                {
                    if (drFase1[0]["ContoCorrente"].ToString() != "0,000")
                        drDatiContoCorrenteNegativo.Fase1 = formatNum.ConvertNum(drFase1[0]["ContoCorrente"].ToString());
                    else
                        drDatiContoCorrenteNegativo.Fase1 = "-";

                    //drDatiContoCorrenteNegativo.Fase1 = drFase1[0]["ContoCorrente"].ToString();
                }

                if (drFase2.Length > 0)
                {
                    if (drFase2[0]["ContoCorrente"].ToString() != "0,000")
                        drDatiContoCorrenteNegativo.Fase2 = formatNum.ConvertNum(drFase2[0]["ContoCorrente"].ToString());
                    else
                        drDatiContoCorrenteNegativo.Fase2 = "-";

                    //drDatiContoCorrenteNegativo.Fase2 = drFase2[0]["ContoCorrente"].ToString();
                }


                if (drFase3.Length > 0)
                {
                    if (drFase3[0]["ContoCorrente"].ToString() != "0,000")
                        drDatiContoCorrenteNegativo.Fase3 = formatNum.ConvertNum(drFase3[0]["ContoCorrente"].ToString());
                    else
                        drDatiContoCorrenteNegativo.Fase3 = "-";

                    //drDatiContoCorrenteNegativo.Fase3 = drFase3[0]["ContoCorrente"].ToString();
                }

                dsS80ALT.ContoCorrente.AddContoCorrenteRow(drDatiContoCorrenteNegativo);

                #endregion

                #region Linea Self Negativa

                DataSetS80ALT.LineaSelfNegRow drDatiLineaSelfNeg;
                drDatiLineaSelfNeg = dsS80ALT.LineaSelfNeg.NewLineaSelfNegRow();
                drDatiLineaSelfNeg.Descrizione = "Liquidità negativa \"Linee GP Eligo\"";

                if (drFase1.Length > 0)
                {
                    if (drFase1[0]["CTVSELF"].ToString() != "0,000")
                        drDatiLineaSelfNeg.Fase1 = formatNum.ConvertNum(drFase1[0]["CTVSELF"].ToString());
                    else
                        drDatiLineaSelfNeg.Fase1 = "-";
                }

                if (drFase2.Length > 0)
                {
                    if (drFase2[0]["CTVSELF"].ToString() != "0,000")
                        drDatiLineaSelfNeg.Fase2 = formatNum.ConvertNum(drFase2[0]["CTVSELF"].ToString());
                    else
                        drDatiLineaSelfNeg.Fase2 = "-";
                }


                if (drFase3.Length > 0)
                {
                    if (drFase3[0]["CTVSELF"].ToString() != "0,000")
                        drDatiLineaSelfNeg.Fase3 = formatNum.ConvertNum(dataThread.TotalSelfNegCurrentAccountValue).ToString();
                    else
                        drDatiLineaSelfNeg.Fase3 = "-";
                }

                dsS80ALT.LineaSelfNeg.AddLineaSelfNegRow(drDatiLineaSelfNeg);

                #endregion

                #region Operazioni in corso

                DataSetS80ALT.OperazioniInCorsoRow drDatiOperazioniInCorso;
                drDatiOperazioniInCorso = dsS80ALT.OperazioniInCorso.NewOperazioniInCorsoRow();
                drDatiOperazioniInCorso.Descrizione = "Operazioni in corso";

                if (drFase1.Length > 0)
                {
                    drDatiOperazioniInCorso.Fase1 = formatNum.ConvertNum(drFase1[0]["Partita_viaggiante"].ToString());
                }

                if (drFase2.Length > 0)
                {
                    drDatiOperazioniInCorso.Fase2 = formatNum.ConvertNum(drFase2[0]["Partita_viaggiante"].ToString());
                }


                if (drFase3.Length > 0)
                {
                    //Will calculated from dataThread instead of SP
                    //drDatiOperazioniInCorso.Fase3 = formatNum.ConvertNum(drFase3[0]["Partita_viaggiante"].ToString());
                    drDatiOperazioniInCorso.Fase3 = formatNum.ConvertNum(dataThread.PartiteViaggiantiInvestimento + dataThread.PartiteViaggiantiDisinvestimento).ToString();
                }

                dsS80ALT.OperazioniInCorso.AddOperazioniInCorsoRow(drDatiOperazioniInCorso);

                #endregion            


                #region Totale Patrimonto

                DataSetS80ALT.DatiTotaleRow drDatiTotale;
                drDatiTotale = dsS80ALT.DatiTotale.NewDatiTotaleRow();
                drDatiTotale.Descrizione = "TOTALE PATRIMONIO";

                if (drFase1.Length > 0)
                {
                    drDatiTotale.Fase1 = formatNum.ConvertNum(drFase1[0]["TotalePatrimonio"].ToString());
                }

                if (drFase2.Length > 0)
                {
                    drDatiTotale.Fase2 = formatNum.ConvertNum(drFase2[0]["TotalePatrimonio"].ToString());
                }

                if (drFase3.Length > 0)
                {
                    //drDatiTotale.Fase3 = formatNum.ConvertNum(drFase3[0]["TotalePatrimonio"].ToString());
                    //Will calculated from dataThread instead of SP
                    decimal totale;
                    totale = decimal.Parse(drFase3[0]["TotalePatrimonio"].ToString()) + dataThread.PartiteViaggiantiInvestimento + dataThread.PartiteViaggiantiDisinvestimento;
                    drDatiTotale.Fase3 = formatNum.ConvertNum(totale.ToString());
                }

                dsS80ALT.DatiTotale.AddDatiTotaleRow(drDatiTotale);

                #endregion

                #region Dettaglio Movimenti Dopo Dati Totale
                DataSetS80ALT.RigheDopoDatiTotaleRow drDettMovDopoDatiTotale;
                drDettMovDopoDatiTotale = dsS80ALT.RigheDopoDatiTotale.NewRigheDopoDatiTotaleRow();
                drDettMovDopoDatiTotale.Descrizione = "Movimenti da osservazione precedente";
                drDettMovDopoDatiTotale.Fase1BlankValue = string.Empty;
                drDettMovDopoDatiTotale.Fase2BlankValue = string.Empty;
                drDettMovDopoDatiTotale.Fase3BlankValue = string.Empty;

                if (drFase1.Length > 0)
                {
                    if (!drFase1[0]["DettMov"].Equals(System.DBNull.Value))
                    {
                        drDettMovDopoDatiTotale.Fase1 = formatNum.ConvertNum(drFase1[0]["DettMov"].ToString());
                        if (!drFase1[0]["NumeroAsterischiNota"].Equals(System.DBNull.Value))
                        {
                            drDettMovDopoDatiTotale.Fase1NumeroAsterischiNota = drFase1[0]["NumeroAsterischiNota"].ToString();
                            drDettMovDopoDatiTotale.Fase1 = string.Format("{0}{1}", drDettMovDopoDatiTotale.Fase1,
                                                                                    obtainAsteriscs(Convert.ToInt16(drDettMovDopoDatiTotale.Fase1NumeroAsterischiNota)));
                        }
                    }
                    else
                    {
                        drDettMovDopoDatiTotale.Fase1 = "notvisible";
                    }
                }

                if (drFase2.Length > 0)
                {
                    if (!drFase2[0]["DettMov"].Equals(System.DBNull.Value))
                    {
                        drDettMovDopoDatiTotale.Fase2 = formatNum.ConvertNum(drFase2[0]["DettMov"].ToString());
                        if (!drFase2[0]["NumeroAsterischiNota"].Equals(System.DBNull.Value))
                        {
                            drDettMovDopoDatiTotale.Fase2NumeroAsterischiNota = drFase2[0]["NumeroAsterischiNota"].ToString();
                            drDettMovDopoDatiTotale.Fase2 = string.Format("{0}{1}", drDettMovDopoDatiTotale.Fase2,
                                                                                    obtainAsteriscs(Convert.ToInt16(drDettMovDopoDatiTotale.Fase2NumeroAsterischiNota)));
                        }
                    }
                    else
                    {
                        drDettMovDopoDatiTotale.Fase2 = "notvisible";
                    }
                }

                if (drFase3.Length > 0)
                {
                    if (!drFase3[0]["DettMov"].Equals(System.DBNull.Value))
                    {
                        drDettMovDopoDatiTotale.Fase3 = formatNum.ConvertNum(drFase3[0]["DettMov"].ToString());
                        if (!drFase3[0]["NumeroAsterischiNota"].Equals(System.DBNull.Value))
                        {
                            drDettMovDopoDatiTotale.Fase3NumeroAsterischiNota = drFase3[0]["NumeroAsterischiNota"].ToString();
                            drDettMovDopoDatiTotale.Fase3 = string.Format("{0}{1}", drDettMovDopoDatiTotale.Fase3,
                                                                                    obtainAsteriscs(Convert.ToInt16(drDettMovDopoDatiTotale.Fase3NumeroAsterischiNota)));
                        }
                    }
                    else
                    {
                        drDettMovDopoDatiTotale.Fase3 = "notvisible";
                    }
                }

                dsS80ALT.RigheDopoDatiTotale.AddRigheDopoDatiTotaleRow(drDettMovDopoDatiTotale);

                DataTable dtDidascalieNote = SectionManager.GetDataSection(tabelleSessione, "[C6MartPeriodico].[PL_S80Alternativa_DidascalieNote]", dataThread);
                DataSetS80ALT.DettaglioMovimentiDidascalieNoteRow drDettaglioMovimentiDidascalieNoteRow;
                foreach (DataRow dr in dtDidascalieNote.Rows)
                {
                    drDettaglioMovimentiDidascalieNoteRow = dsS80ALT.DettaglioMovimentiDidascalieNote.NewDettaglioMovimentiDidascalieNoteRow();
                    drDettaglioMovimentiDidascalieNoteRow.NumeroAsterischi = Convert.ToInt16(dr["NumeroAsterischi"]);
                    drDettaglioMovimentiDidascalieNoteRow.Descrizione = dr["Descrizione"].ToString();
                    dsS80ALT.DettaglioMovimentiDidascalieNote.AddDettaglioMovimentiDidascalieNoteRow(drDettaglioMovimentiDidascalieNoteRow);
                }

                #endregion
            }

            dsr.DatiSezione = dsS80ALT;
            dsr.Esito = dsS80ALT.GraficoPiramide.Rows.Count;
            return dsr;

        }
    }
}