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

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

        /// <summary>
        /// Disegna l'oggetto T11
        /// </summary>
        protected override sealed void Draw()
        {
            var dtT11Testo = GetText();
            var dtT11Dati = GetDataTable();

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

            var labelIntestazione = new FormattedTextAreaPDF(dtT11Testo.Rows[0]["Testo1"].ToString(), EnvironmentFacade.RendererFacade.XLeftLimit + 5);
            AddElement(labelIntestazione);
            AddElement(new SpacePDF(7));

            List<string> stringheElencoPuntato;

            //Adriano
            //Adriano: bisogna poi avere anche l'informazione su cliente professionale/retail sul servizio di Consulenza Base
            var cliente = GetCliente();
            bool profiloProfessionale = false;
            bool profiloAggressivo = Convert.ToInt32(cliente.Rows[0]["Profilo"].ToString().Substring(0, 1)) >= 5;
            bool profiloProfessionaleAggressivo = profiloProfessionale && profiloAggressivo;
            
            //E' richiesto di escludere dall'elenco puntato le motivazioni sull'inadeguatezza relative a complessità, frequenza e concentrazione prodotti complessi
            // la stored procedure non restituisce i campi id degli indicatori, quindi bisogna fare un controllo sui campi descrittivi
            if (profiloProfessionale)
                 stringheElencoPuntato = (from DataRow row in dtT11Dati.Rows
                                          where !(row["Indicatore"].ToString().Contains("Complessità"))
                                          && !(row["Indicatore"].ToString().Contains("Frequenza"))
                                          && !(row["Indicatore"].ToString().Contains("Concentrazione prod"))
                                          select row["Indicatore"] + ": " + Helper.ReplaceVariables(row["Descrizione"].ToString(), EnvironmentFacade.ReportEnvironment)).ToList();
            else
                 stringheElencoPuntato = (from DataRow row in dtT11Dati.Rows
                                          select row["Indicatore"] + ": " + Helper.ReplaceVariables(row["Descrizione"].ToString(), EnvironmentFacade.ReportEnvironment)).ToList();

            //--Adriano
            //originale:
            //var stringheElencoPuntato = (from DataRow row in dtT11Dati.Rows select row["Indicatore"] + ": " + Helper.ReplaceVariables(row["Descrizione"].ToString(), EnvironmentFacade.ReportEnvironment)).ToList();

            var lista = new UnorderedListPDF(EnvironmentFacade.RendererFacade.XLeftLimit, stringheElencoPuntato, BulletType.Trattino);

            AddElement(lista);
            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_T11", parametri)
                : DataAccess.ExecuteDataTableStoredProcedure(DBProvider.SqlServerConsulenzaBase, "REP_Prop_T11", 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;
        }
    }
}
