using System.Collections.Generic;
using System.Data;
using System.Web;
using System.IO;
using System;
using PDFGenerator.BusinessLayer.DataSection;
using DataAccessLayer;
using System.Linq;

namespace PDFGenerator.BusinessLayer
{
    /// <summary>
    /// Summary description for SectionManager
    /// </summary>
    /// 
    public class SectionManager
    {        
        private static NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger();

        #region public methods

        //public static DataTable GetDataSection(List<SessionStruct> tabelleSessione, string storedProcedure)
        //{
        //    return getDataTable(tabelleSessione, storedProcedure, null);
        //}
        public static DataTable GetDataSection(List<SessionStruct> tabelleSessione, string storedProcedure, DataThread dataThread)
        {
            List<Parametro> listaParametri = null;
            switch (storedProcedure.ToUpper())
            {
                case "[C6MART].[GESTIONE_S_INTERMEDIARI]":
                case "[C6MARTPERIODICO].[GESTIONE_S_INTERMEDIARI]":
                    listaParametri = GetParameterListSeparateReteCodiceFiscale(dataThread.Rete, dataThread.CodiceFiscale);
                    break;
                case "[C6MART].[PL_DSS1PATRIMONIOCOMPLESSIVO]":
                    listaParametri = GetParameterListSeparateReteAgente(dataThread.Agente, dataThread.CodiceFiscale, dataThread.Rete);
                    break;
                case "[C6MARTPERIODICO].[PL_S80ALTERNATIVA_DIDASCALIENOTE]":
                    listaParametri = new List<Parametro>();
                    break;
                default:
                    listaParametri = GetParameterList(dataThread.Agente, dataThread.CodiceFiscale, dataThread.Rete);
                    break;
            }
            return getDataTable(tabelleSessione, storedProcedure, listaParametri, dataThread.DataAccess);
        }
        //public static DataTable GetDataSection(List<SessionStruct> tabelleSessione, string storedProcedure, string codicePB, string codicecliente, string codicerete)
        //{
        //    List<Parametro> listaParametri = null;
        //    switch (storedProcedure.ToUpper())
        //    {
        //        case "CTABLE_MENU_CARATTERISTICHE_PATRIMONIO":
        //        case "CTABLE_MENU_CARATTERISTICHE_VARIE":
        //        case "FRAMES":
        //        case "GENERATOR_SETCLIENTE":
        //            listaParametri = GetParameterListSeparateReteAgente(codicePB, codicecliente, codicerete);
        //            break;

        //        default:
        //            listaParametri = GetParameterList(codicePB, codicecliente, codicerete);
        //            break;
        //    }
        //    return getDataTable(tabelleSessione, storedProcedure, listaParametri);
        //}
        //public static DataTable GetDataSection(List<SessionStruct> tabelleSessione, string storedProcedure, string reteAgente, string codicecliente)
        //{
        //    List<Parametro> listaParametri = null;
        //    switch (storedProcedure.ToUpper())
        //    {
        //        case "GENERATOR_SETCLIENTE":
        //            listaParametri = GetParameterListSeparateReteAgente(reteAgente.Remove(0, 1), codicecliente, reteAgente.Remove(1, reteAgente.Length - 1));
        //            break;

        //        default:
        //            listaParametri = GetParameterList(reteAgente, codicecliente);
        //            break;
        //    }
        //    return getDataTable(tabelleSessione, storedProcedure, listaParametri);
        //}
        #endregion

        #region private methods
        private static List<Parametro> GetParameterList(string codicePB, string codiceCliente, string codiceRete, string parameterName, object _value, DbType _dbtype)
        {
            List<Parametro> ParameterStoredProcedureList = GetParameterList(codicePB, codiceCliente, codiceRete);
            Parametro param = new Parametro();
            param.ParameterName = parameterName;
            param.Value = _value;
            param.DbType = _dbtype;
            ParameterStoredProcedureList.Add(param);

            return ParameterStoredProcedureList;

        }
        private static List<Parametro> GetParameterList(string codicePB, string codiceCliente, string codiceRete, string parameterName, object _value, DbType _dbtype, string parameterName1, object _value1, DbType _dbtype1)
        {
            List<Parametro> ParameterStoredProcedureList = GetParameterList(codicePB, codiceCliente, codiceRete);
            Parametro param = new Parametro();
            param.ParameterName = parameterName;
            param.Value = _value;
            param.DbType = _dbtype;
            ParameterStoredProcedureList.Add(param);

            Parametro param1 = new Parametro();
            param1.ParameterName = parameterName1;
            param1.Value = _value1;
            param1.DbType = _dbtype1;
            ParameterStoredProcedureList.Add(param1);

            return ParameterStoredProcedureList;

        }
        private static List<Parametro> GetParameterList(string codicePB, string codiceCliente, string codiceRete, string parameterName, object _value, DbType _dbtype, string parameterName1, object _value1, DbType _dbtype1, string parameterName2, object _value2, DbType _dbtype2)
        {
            List<Parametro> ParameterStoredProcedureList = GetParameterList(codicePB, codiceCliente, codiceRete);
            Parametro param = new Parametro();
            param.ParameterName = parameterName;
            param.Value = _value;
            param.DbType = _dbtype;
            ParameterStoredProcedureList.Add(param);

            Parametro param1 = new Parametro();
            param1.ParameterName = parameterName1;
            param1.Value = _value1;
            param1.DbType = _dbtype1;
            ParameterStoredProcedureList.Add(param1);

            Parametro param2 = new Parametro();
            param2.ParameterName = parameterName2;
            param2.Value = _value2;
            param2.DbType = _dbtype2;
            ParameterStoredProcedureList.Add(param2);

            return ParameterStoredProcedureList;


        }
        private static List<Parametro> GetParameterListSeparateReteAgente(string codicePB, string codiceCliente, string codiceRete, string parameterName, object _value, DbType _dbtype, string parameterName1, object _value1, DbType _dbtype1)
        {

            List<Parametro> ParameterStoredProcedureList = GetParameterListSeparateReteAgente(codicePB, codiceCliente, codiceRete);
            Parametro param = new Parametro();
            param.ParameterName = parameterName;
            param.Value = _value;
            param.DbType = _dbtype;
            ParameterStoredProcedureList.Add(param);

            Parametro param1 = new Parametro();
            param1.ParameterName = parameterName1;
            param1.Value = _value1;
            param1.DbType = _dbtype1;
            ParameterStoredProcedureList.Add(param1);

            return ParameterStoredProcedureList;

        }
        private static List<Parametro> GetParameterListSeparateReteAgente(string codicePB, string codiceCliente, string codiceRete, string parameterName, object _value, DbType _dbtype)
        {

            List<Parametro> ParameterStoredProcedureList = GetParameterListSeparateReteAgente(codicePB, codiceCliente, codiceRete);
            Parametro param = new Parametro();
            param.ParameterName = parameterName;
            param.Value = _value;
            param.DbType = _dbtype;
            ParameterStoredProcedureList.Add(param);

            return ParameterStoredProcedureList;

        }
        private static List<Parametro> GetParameterListSeparateReteCodiceFiscale(string codiceRete, string codiceCliente)
        {

            List<Parametro> ParameterStoredProcedureList = new List<Parametro>();

            Parametro param;
            param = new Parametro();
            param.ParameterName = "rete";
            param.Value = codiceRete;
            param.DbType = DbType.String;
            ParameterStoredProcedureList.Add(param);

            param = new Parametro();
            param.ParameterName = "codiceCliente";
            param.Value = codiceCliente;
            param.DbType = DbType.String;
            ParameterStoredProcedureList.Add(param);

            return ParameterStoredProcedureList;

        }
        private static List<Parametro> GetParameterListSeparateReteAgente(string codicePB, string codiceCliente, string codiceRete)
        {

            List<Parametro> ParameterStoredProcedureList = new List<Parametro>();

            Parametro param;
            param = new Parametro();
            param.ParameterName = "rete";
            param.Value = codiceRete;
            param.DbType = DbType.String;
            ParameterStoredProcedureList.Add(param);

            param = new Parametro();
            param.ParameterName = "reteAgente";
            param.Value = codiceRete + codicePB;
            param.DbType = DbType.String;
            ParameterStoredProcedureList.Add(param);

            param = new Parametro();
            param.ParameterName = "codiceCliente";
            param.Value = codiceCliente;
            param.DbType = DbType.String;
            ParameterStoredProcedureList.Add(param);

            return ParameterStoredProcedureList;

        }
        private static List<Parametro> GetParameterListSeparateReteAgente(string codicePB, string codiceCliente, string codiceRete, string parameterName, object _value, DbType _dbtype, string parameterName1, object _value1, DbType _dbtype1, string parameterName2, object _value2, DbType _dbtype2)
        {

            List<Parametro> ParameterStoredProcedureList = GetParameterListSeparateReteAgente(codicePB, codiceCliente, codiceRete);
            Parametro param = new Parametro();
            param.ParameterName = parameterName;
            param.Value = _value;
            param.DbType = _dbtype;
            ParameterStoredProcedureList.Add(param);

            Parametro param1 = new Parametro();
            param1.ParameterName = parameterName1;
            param1.Value = _value1;
            param1.DbType = _dbtype1;
            ParameterStoredProcedureList.Add(param1);

            Parametro param2 = new Parametro();
            param2.ParameterName = parameterName2;
            param2.Value = _value2;
            param2.DbType = _dbtype2;
            ParameterStoredProcedureList.Add(param2);

            return ParameterStoredProcedureList;

        }
        private static List<Parametro> GetParameterList(string codicePB, string codiceCliente, string codiceRete)
        {

            List<Parametro> ParameterStoredProcedureList = new List<Parametro>();

            Parametro param;
            param = new Parametro();
            //param.ParameterName = "reteAgente";
            //param.Value = codiceRete + codicePB;
            param.ParameterName = "Rete";
            param.Value = codiceRete;
            param.DbType = DbType.String;
            ParameterStoredProcedureList.Add(param);


            param = new Parametro();
            param.ParameterName = "CodiceFiscale";
            param.Value = codiceCliente;
            param.DbType = DbType.String;
            ParameterStoredProcedureList.Add(param);

            return ParameterStoredProcedureList;

        }
        private static List<Parametro> GetParameterList(string reteAgente, string codiceCliente)
        {

            List<Parametro> ParameterStoredProcedureList = new List<Parametro>();

            Parametro param;
            param = new Parametro();
            param.ParameterName = "reteAgente";
            param.Value = reteAgente;
            param.DbType = DbType.String;
            ParameterStoredProcedureList.Add(param);


            param = new Parametro();
            param.ParameterName = "codiceCliente";
            param.Value = codiceCliente;
            param.DbType = DbType.String;
            ParameterStoredProcedureList.Add(param);

            return ParameterStoredProcedureList;

        }
        private static List<Parametro> GetParameterList(string codiceCliente)
        {

            List<Parametro> ParameterStoredProcedureList = new List<Parametro>();

            Parametro param;
            param = new Parametro();
            param.ParameterName = "codiceCliente";
            param.Value = codiceCliente;
            param.DbType = DbType.String;
            ParameterStoredProcedureList.Add(param);

            return ParameterStoredProcedureList;

        }
        private static DataTable getDataTable(List<SessionStruct> tabelleSessione, string storedProcedure, List<Parametro> listaParametri, DataAccessDE dataAccess)
        {
            string chiave = storedProcedure;
            foreach (Parametro parametro in listaParametri)
            {
                if (parametro.Value != null)
                    chiave += "|" + parametro.Value.ToString();
                else
                    chiave += "|" + string.Empty;

            }
            SessionStruct sessionStruct = tabelleSessione.Find(delegate (SessionStruct s) { return s.Chiave == chiave; });

            if (sessionStruct != null)
            {
                return sessionStruct.Tabella;
            }
            else {
                DataTable dataTable = null;
                try
                {
                    dataTable = dataAccess.ExecuteDataTableStoredProcedure(DBProvider.SqlServerStampeC6, storedProcedure, listaParametri);
                    dataTable.TableName = storedProcedure;
                    tabelleSessione.Add(new SessionStruct(chiave, dataTable));
                    return dataTable;
                }
                catch (Exception ex)
                {

                    throw ex;
                }
            }
        }
        #endregion
    }
}