using System;
using System.Data;
using Consulenza.ReportCommon;
using Consulenza.ReportWriter.Business.OBJ_PDF;
using System.Collections.Generic;
using Consulenza.ReportWriter.Business;

namespace Consulenza.ReportWriter.Manager.Section.Base.Proposta
{
    public class P11 : Entity.Section
    {
        public P11(EnvironmentFacade environmentFacade, int idSection)
            : base(environmentFacade, idSection)
        {
            try
            {
                Draw();
            }
            catch (Exception ex)
            {
                SectionLogger.Write("P11", ex.Message, SectionLoggerMessageLevel.E, EnvironmentFacade.ReportEnvironment);
            }
        }

        /// <summary>
        /// Disegna l'oggetto P11
        /// </summary>
        protected override sealed void Draw()
        {
            var dtP11 = GetDataTable();

            if (dtP11.Rows.Count <= 0) return;

            var coperturaPatrimonioAttuale = Convert.ToDecimal(dtP11.Rows[0]["Copertura"]);
            var coperturaPatrimonioProspettico = Convert.ToDecimal(dtP11.Rows[1]["Copertura"]);

            //Adriano: bisogna poi avere anche il flag cliente professionale su Consulenza Base
            var cliente = GetCliente();
            bool profiloProfessionale = false;
            if (cliente.Rows[0]["TipoConsulenza"].ToString() == "P")
                profiloProfessionale = true;

            bool profiloAggressivo = Convert.ToInt32(cliente.Rows[0]["Profilo"].ToString().Substring(0, 1)) >= 5;
            bool profiloProfessionaleAggressivo = profiloProfessionale && profiloAggressivo;

            if (profiloProfessionaleAggressivo)
                dtP11.Rows[2][2] = "50,00%";
            //--Adriano
            var tabella = new TablePDF(EnvironmentFacade.RendererFacade.XLeftLimit, dtP11);
            tabella.Columns.Add(new ColumnPDF("Portafoglio", 163, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Testo, "Portafoglio", "Portafoglio"));
            tabella.Columns.Add(new ColumnPDF("Controvalore", 120, HorizontalAlignmentType.Destra, false, false, 7, ColumnType.Decimale, "Controvalore", "Controvalore (€)"));
            tabella.Columns.Add(new ColumnPDF("RischioMercato", 120, HorizontalAlignmentType.Destra, false, false, 7, ColumnType.Testo, "RischioMercato", "Rischio Mercato (VaR)"));
            tabella.Columns.Add(new ColumnPDF("ClasseRischioCredito", 120, HorizontalAlignmentType.Destra, false, false, 7, ColumnType.Testo, "ClasseRischioCredito", "Rischio Credito"));
            tabella.Footer = false;
            tabella.ShowBorderLastLine = true;

            #region Note della tabella per grado copertura patrimonio attuale e prospettico

            var campiAsterisco = new[] { "RischioMercato", "ClasseRischioCredito" }; // campi del datasource su cui aggiungere gli asterischi di rimando alla note.

            var notaCoperturaPatrimonioAttuale = new TableNotePDF(TableNotePDF.TableNotePositionType.PièDiTabella, "Grado di copertura del portafoglio attuale: " + Helper.FormatPercentage(coperturaPatrimonioAttuale, 2), campiAsterisco, "portafoglio='portafoglio attuale'");
            var notaCoperturaPatrimonioProspettico = new TableNotePDF(TableNotePDF.TableNotePositionType.PièDiTabella, "Grado di copertura del portafoglio prospettico: " + Helper.FormatPercentage(coperturaPatrimonioProspettico, 2), campiAsterisco, "portafoglio='portafoglio prospettico'");

            if (!coperturaPatrimonioAttuale.Equals(100) && !coperturaPatrimonioAttuale.Equals(0))
                tabella.Notes.Add(notaCoperturaPatrimonioAttuale);

            if (!coperturaPatrimonioProspettico.Equals(100) && !coperturaPatrimonioProspettico.Equals(0))
                tabella.Notes.Add(notaCoperturaPatrimonioProspettico);

            #endregion

            AddElement(tabella);
            AddElement(new SpacePDF(20));
        }

        /// <summary>
        /// Recupera i dati necessari alla Section restituendo un DataTable.
        /// </summary>
        /// <returns></returns>
        protected sealed override DataTable GetDataTable()
        {
            var parametri = new List<Parametro>();

            #region Definizione dei parametri

            var parametro = new Parametro
            {
                Direction = ParameterDirection.Input,
                DbType = DbType.Int64,
                ParameterName = "chiaveClientePB",
                Value = EnvironmentFacade.ReportEnvironment.Cliente.Chiave
            };
            parametri.Add(parametro);

            parametro = new Parametro
            {
                Direction = ParameterDirection.Input,
                DbType = DbType.Int32,
                ParameterName = "chiaveProposta",
                Value = EnvironmentFacade.ReportEnvironment.Proposta.Chiave
            };
            parametri.Add(parametro);

            #endregion

            return EnvironmentFacade.ReportEnvironment.Proposta.PropostaCBUnica ? DataAccess.ExecuteDataTableStoredProcedure(DBProvider.SqlServerConsulenzaUnica, "REP_Prop_P11", parametri)
                : DataAccess.ExecuteDataTableStoredProcedure(DBProvider.SqlServerConsulenzaBase, "REP_Prop_P11", parametri);
        }

        protected DataTable GetCliente()
        {
            var parametri = new List<Parametro>();

            #region Definizione dei parametri

            var parametro = new Parametro
            {
                Direction = ParameterDirection.Input,
                DbType = DbType.Int64,
                ParameterName = "chiaveClientePB",
                Value = EnvironmentFacade.ReportEnvironment.Cliente.Chiave
            };
            parametri.Add(parametro);

            parametro = new Parametro
            {
                Direction = ParameterDirection.Input,
                DbType = DbType.Int32,
                ParameterName = "chiaveProposta",
                Value = EnvironmentFacade.ReportEnvironment.Proposta.Chiave
            };
            parametri.Add(parametro);

            #endregion

            return EnvironmentFacade.ReportEnvironment.Proposta.PropostaCBUnica ? DataAccess.ExecuteDataTableStoredProcedure(DBProvider.SqlServerConsulenzaUnica, "REP_Prop_P10", parametri)
                : DataAccess.ExecuteDataTableStoredProcedure(DBProvider.SqlServerConsulenzaBase, "REP_Prop_P10", parametri);
        }

        /// <summary>
        /// Recupera i dati necessari alla Section restituendo un DataSet.
        /// </summary>
        /// <returns></returns>
        protected sealed override DataSet GetDataSet()
        {
            return null;
        }
    }
}
