using System.Collections.Generic;
using Consulenza.ReportCommon;
using System.Data;
using System;

namespace Consulenza.Base.Business
{
    //17-07-2015 modifica al visual studio 2013 linda fabiani: modificato il file proj
    // test checkin da vs 2010
    public static class DataService
    {
        /// <summary>
        /// Salva il pdf del report passato in input nel database.
        /// Esegue la stored "WritePDFintoDB".
        /// Torna true o false a seconda se l'inserimento è andato a buon fine o meno.
        /// </summary>
        /// <param name="chiaveCliente">Chiave del cliente.</param>
        /// <param name="chiaveReport">Chiave del report(per il report di proposta passare la chiaveProposta).</param>
        /// <param name="tipologiaReport">Tipologia per esteso del report.</param>
        /// <param name="report">Stream dati del report da salvare.</param>
        /// <returns></returns>
        public static bool SalvaReport(long chiaveCliente, int chiaveReport, string tipologiaReport, byte[] report, bool unica)
        {
            #region Definizione dei parametri

            var parametri = new List<Parametro>();

            var parametro = new Parametro
            {
                Direction = ParameterDirection.Input,
                DbType = DbType.Int64,
                ParameterName = "ChiaveClientePB",
                Value = chiaveCliente
            };
            parametri.Add(parametro);

            parametro = new Parametro
            {
                Direction = ParameterDirection.Input,
                DbType = DbType.Int32,
                ParameterName = "ChiaveReport",
                Value = chiaveReport
            };
            parametri.Add(parametro);

            parametro = new Parametro
            {
                Direction = ParameterDirection.Input,
                DbType = DbType.AnsiString,
                ParameterName = "TipologiaReport",
                Value = tipologiaReport
            };
            parametri.Add(parametro);

            parametro = new Parametro {ParameterName = "Report", DbType = DbType.Binary, Value = report};
            parametri.Add(parametro);

            #endregion

            return unica ? DataAccess.ExecuteNonQueryStoredProcedure(DBProvider.SqlServerConsulenzaUnica, "WritePDFintoDB", parametri) > -1
                : DataAccess.ExecuteNonQueryStoredProcedure(DBProvider.SqlServerConsulenzaBase, "WritePDFintoDB", parametri) > -1;
        }

        /// <summary>
        /// Classe che fornisce metodi per il recupero di informazioni del cliente.
        /// </summary>
        public static class ClienteManager
        {
            /// <summary>
            /// Recupera la chiave interna del cliente a partire dai parametri passati in input codiceRete e codiceFiscalePivaMandato eseguendo la stored REP_GETCHIAVECLIENTE.
            /// </summary>
            /// <param name="codiceRete">Codice della Rete cui il PB (Private Banker) è associato.</param>
            /// <param name="codiceFiscale">Codice Fiscale</param>
            /// <param name="partitaIva">Partita IVA</param>
            /// <param name="codiceMandato">Codice Mandato(nel caso di una Fiduciaria)</param>
            /// <returns></returns>
            public static long RecuperaChiaveCliente(string codiceRete, string codiceFiscale, string partitaIva, string codiceMandato, bool unica)
            {
                var parametri = new List<Parametro>();

                #region Definizione dei parametri

                var parametro = new Parametro
                {
                    Direction = ParameterDirection.Input,
                    DbType = DbType.String,
                    ParameterName = "codiceRete",
                    Value = codiceRete
                };
                parametri.Add(parametro);

                parametro = new Parametro
                {
                    Direction = ParameterDirection.Input,
                    DbType = DbType.String,
                    ParameterName = "codiceFiscale",
                    Value = codiceFiscale
                };
                parametri.Add(parametro);

                parametro = new Parametro
                {
                    Direction = ParameterDirection.Input,
                    DbType = DbType.String,
                    ParameterName = "pIva",
                    Value = partitaIva
                };
                parametri.Add(parametro);

                parametro = new Parametro
                {
                    Direction = ParameterDirection.Input,
                    DbType = DbType.String,
                    ParameterName = "codiceMandato",
                    Value = codiceMandato
                };
                parametri.Add(parametro);

                #endregion

                var objReturn = unica ? DataAccess.ExecuteScalarStoredProcedure(DBProvider.SqlServerConsulenzaUnica, "REP_GETCHIAVECLIENTE", parametri)
                    : DataAccess.ExecuteScalarStoredProcedure(DBProvider.SqlServerConsulenzaBase, "REP_GETCHIAVECLIENTE", parametri);


                if (objReturn != null)
                    //return (long)objReturn;
                    return Convert.ToInt64(objReturn);

                return -1;
            }


            

            /// <summary>
            /// Recupera le informazioni relative al cliente la cui chiave è passata in input.
            /// </summary>
            /// <param name="chiaveCliente">Chiave del cliente</param>
            /// <returns></returns>
            public static Cliente RecuperaCliente(long chiaveCliente, bool unica)
            {
                List<Parametro> parametri = new List<Parametro>();
                Parametro parametro;

                Cliente cliente = new Cliente();

                #region Definizione dei parametri

                parametro = new Parametro();
                parametro.Direction = ParameterDirection.Input;
                parametro.DbType = DbType.Int64;
                parametro.ParameterName = "chiaveClientePb";
                parametro.Value = chiaveCliente;
                parametri.Add(parametro);

                #endregion

                DataTable dt = unica ? DataAccess.ExecuteDataTableStoredProcedure(DBProvider.SqlServerConsulenzaUnica, "REP_INFOCLIENTEPB", parametri)
                    : DataAccess.ExecuteDataTableStoredProcedure(DBProvider.SqlServerConsulenzaBase, "REP_INFOCLIENTEPB", parametri);

                if (dt.Rows.Count > 0)
                {
                    cliente.Chiave = chiaveCliente;
                    cliente.CodiceFiscale = dt.Rows[0]["codFis"].ToString().ToUpper();
                    cliente.Nome = dt.Rows[0]["nome_cliente"].ToString().ToUpper();
                    cliente.Cognome = dt.Rows[0]["cognome_cliente"].ToString().ToUpper();
                }
                return cliente;
            }
        }

        /// <summary>
        /// Classe che fornisce metodi per il recupero di informazioni del cliente.
        /// </summary>
        public static class PrivateBankerManager
        {
            /// <summary>
            /// Recupera le informazioni relative al private banker a partire dalla chiave del cliente passata in input.
            /// Nel caso in cui il pb recuperato è un livello TFA viene restituito il suo pb Manager, il cui codage è quello impostato nella proprietà CodiceManager.
            /// </summary>
            /// <param name="chiaveCliente">Chiave del cliente a partire dalla quale recuperare il private banker associato</param>
            /// <returns></returns>
            public static PrivateBanker RecuperaPrivateBanker(long chiaveCliente, bool unica)
            {
                var parametri = new List<Parametro>();

                var privatebanker = new PrivateBanker();

                #region Definizione dei parametri per REP_InfoClientePb

                var parametro = new Parametro
                {
                    Direction = ParameterDirection.Input,
                    DbType = DbType.Int64,
                    ParameterName = "chiaveClientePb",
                    Value = chiaveCliente
                };
                parametri.Add(parametro);

                #endregion

                var dt = unica ? DataAccess.ExecuteDataTableStoredProcedure(DBProvider.SqlServerConsulenzaUnica, "REP_InfoClientePb", parametri)
                    : DataAccess.ExecuteDataTableStoredProcedure(DBProvider.SqlServerConsulenzaBase, "REP_InfoClientePb", parametri);
                
                var livelloPb = dt.Rows[0]["livello_pb"] == DBNull.Value ? string.Empty : dt.Rows[0]["livello_pb"].ToString().ToUpper();
                var codiceAgenteManager = dt.Rows[0]["codManager_pb"] == DBNull.Value ? string.Empty : dt.Rows[0]["codManager_pb"].ToString().ToUpper();
                var codiceRete = dt.Rows[0]["rete"] == DBNull.Value ? string.Empty : dt.Rows[0]["rete"].ToString().ToUpper();
                var codiceLivelloUtenteTfa = codiceRete.Equals("F") ? "TFA" : "APF";

                if (livelloPb.ToUpper().Equals(codiceLivelloUtenteTfa))
                {
                    #region Definizione dei parametri per REP_InfoClientePbByCodAge
                    parametri.Clear();
                    parametro = new Parametro
                    {
                        Direction = ParameterDirection.Input,
                        DbType = DbType.AnsiString,
                        ParameterName = "codage",
                        Value = codiceAgenteManager
                    };
                    var parametro2 = new Parametro
                    {
                        Direction = ParameterDirection.Input,
                        DbType = DbType.String,
                        ParameterName = "reteage",
                        Value = codiceRete
                    };
                    parametri.Add(parametro);
                    parametri.Add(parametro2);

                    #endregion

                    dt.Clear();
                    dt = unica ? DataAccess.ExecuteDataTableStoredProcedure(DBProvider.SqlServerConsulenzaUnica, "REP_InfoClientePbByCodAge", parametri)
                        : DataAccess.ExecuteDataTableStoredProcedure(DBProvider.SqlServerConsulenzaBase, "REP_InfoClientePbByCodAge", parametri);
                }

                if (dt.Rows.Count > 0)
                {
                    privatebanker.Cap = dt.Rows[0]["cap"] == DBNull.Value ? string.Empty : dt.Rows[0]["cap"].ToString().ToUpper();
                    privatebanker.Citta = dt.Rows[0]["citta"] == DBNull.Value ? string.Empty : dt.Rows[0]["citta"].ToString().ToUpper();
                    privatebanker.Codice = dt.Rows[0]["codage"] == DBNull.Value ? string.Empty : dt.Rows[0]["codage"].ToString().ToUpper();
                    privatebanker.CodiceRete = dt.Rows[0]["rete"] == DBNull.Value ? string.Empty : dt.Rows[0]["rete"].ToString().ToUpper();
                    privatebanker.Indirizzo = dt.Rows[0]["indirizzo"] == DBNull.Value ? string.Empty : dt.Rows[0]["indirizzo"].ToString().ToUpper();
                    privatebanker.Nominativo = dt.Rows[0]["nominativo_pb"] == DBNull.Value ? string.Empty : dt.Rows[0]["nominativo_pb"].ToString().ToUpper();
                    privatebanker.NumeroCivico = dt.Rows[0]["numcivico"] == DBNull.Value ? string.Empty : dt.Rows[0]["numcivico"].ToString().ToUpper();
                    privatebanker.PrefissoTelefono = dt.Rows[0]["ptel"] == DBNull.Value ? string.Empty : dt.Rows[0]["ptel"].ToString().ToUpper();
                    privatebanker.Telefono = dt.Rows[0]["tel"] == DBNull.Value ? string.Empty : dt.Rows[0]["tel"].ToString().ToUpper();
                    privatebanker.Livello = dt.Rows[0]["livello_pb"] == DBNull.Value ? string.Empty : dt.Rows[0]["livello_pb"].ToString().ToUpper();
                    privatebanker.CodiceManager = dt.Rows[0]["codManager_pb"] == DBNull.Value ? string.Empty : dt.Rows[0]["codManager_pb"].ToString().ToUpper();
                }               

                return privatebanker;
            }
        }


        public static class PrivateDelegatoManarger
        {
            /// <summary>
            /// Recupera le informazioni relative al private banker a partire dalla chiave del cliente passata in input.
            /// Nel caso in cui il pb recuperato è un livello TFA viene restituito il suo pb Manager, il cui codage è quello impostato nella proprietà CodiceManager.
            /// </summary>
            /// <param name="chiaveCliente">Chiave del cliente a partire dalla quale recuperare il private banker associato</param>
            /// <returns></returns>
            public static Delegato RecuperaDelegato(int chiaveClientePB, int chiaveProposta,bool unica)
            {
                
                var parametri = new List<Parametro>();
                Parametro parametro;
                
                
                var privateDelegato = new Delegato();

                #region Definizione dei parametri per REP_getDelegato
                if (chiaveClientePB > 0 )
                {
                    parametro = new Parametro
                    {
                        Direction = ParameterDirection.Input,
                        DbType = DbType.Int64,
                        ParameterName = "chiaveClientePB",
                        Value = chiaveClientePB
                    };
                    parametri.Add(parametro);
                }
                parametro = new Parametro
                {
                    Direction = ParameterDirection.Input,
                    DbType = DbType.Int64,
                    ParameterName = "chiaveProposta",
                    Value = chiaveProposta
                };
                parametri.Add(parametro);

               

                #endregion

                var dt = DataAccess.ExecuteDataTableStoredProcedure(DBProvider.SqlServerConsulenzaUnica, "REP_getDelegatoProposta", parametri);
                if ( dt.Rows.Count > 0 )
                 {
                    privateDelegato.chiaveDelegato = Convert.ToInt32(dt.Rows[0]["chiaveDelegato"].ToString());
                    privateDelegato.CodiceFiscale = dt.Rows[0]["codFis"].ToString().ToUpper();
                    privateDelegato.Nome = dt.Rows[0]["nomeDelegato"].ToString().ToUpper();
                    privateDelegato.Cognome = dt.Rows[0]["cognomeDelegato"].ToString().ToUpper();
                 }
                

             
                return privateDelegato;
            }
        }

    }
}
