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

namespace Consulenza.Immobiliare.Business
{
    public static class DataService
    {
        /// <summary>
        /// Classe che fornisce metodi per il recupero di informazioni del cliente.
        /// </summary>
        public static class ClienteManager
        {
            /// <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)
            {
                var parametri = new List<Parametro>();

                var cliente = new Cliente();

                #region Definizione dei parametri

                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);

                if (dt.Rows.Count <= 0) return cliente;

                cliente.Chiave = chiaveCliente;
                cliente.CodiceFiscale = dt.Rows[0]["codFis"].ToString() != "" ? dt.Rows[0]["codFis"].ToString().ToUpper() : dt.Rows[0]["codFisGiuridiche"].ToString().ToUpper();
                cliente.PartitaIva = dt.Rows[0]["pIva"].ToString().ToUpper();
                cliente.Nome = dt.Rows[0]["nome_cliente"].ToString().ToUpper();
                cliente.Cognome = dt.Rows[0]["cognome_cliente"].ToString().ToUpper();
                cliente.FlagMonitoraggioImmobiliare = dt.Rows[0]["flagMonitoraggioImmobiliare"].Equals(true);
                cliente.FlagNucleo = dt.Rows[0]["flagNucleo"].Equals(true);
                cliente.FlagPianificazioneSuccessoria = dt.Rows[0]["flagPianificazioneSuccessoria"].Equals(true);

            
                cliente.FlagMonitoraggioImmobiliare = dt.Rows[0]["flagMonitoraggioImmobiliare"].Equals(true);
                cliente.FlagNucleo = dt.Rows[0]["flagNucleo"].Equals(true);
                cliente.FlagPianificazioneSuccessoria = dt.Rows[0]["flagPianificazioneSuccessoria"].Equals(true);


                if (cliente.CodiceFiscale == "")
                    cliente.CodiceFiscale = cliente.PartitaIva;

                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) return privatebanker;

                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;
            }
            //firma per nucleo
            public static PrivateBanker RecuperaPrivateBanker(string codagente, string reteagente, 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.String,
                    ParameterName = "codage",
                    Value = codagente
                };
                var parametro2 = new Parametro
                {
                    Direction = ParameterDirection.Input,
                    DbType = DbType.String,
                    ParameterName = "reteage",
                    Value = reteagente
                };
                parametri.Add(parametro);
                parametri.Add(parametro2);
                #endregion

                var dt = unica ? DataAccess.ExecuteDataTableStoredProcedure(DBProvider.SqlServerConsulenzaUnica, "REP_InfoPbNucleo", parametri) : DataAccess.ExecuteDataTableStoredProcedure(DBProvider.SqlServerConsulenzaEvoluta, "REP_InfoPbNucleo", 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
                    };
                    parametri.Add(parametro);

                    #endregion

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

                if (dt.Rows.Count <= 0) return privatebanker;

                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;
            }
        }
        
       
        #region Nucleo 28 luglio 2015
        public static class NucleoManager
        {
            /// <summary>
            /// Recupera le informazioni relative al nucleo la cui chiave è passata in input.
            /// </summary>
            /// <param name="chiaveCliente">Chiave del cliente</param>
            /// <returns></returns>
            /// </summary>
            public static Nucleo RecuperaNucleo(long chiaveNucleo, bool unica)
            {
                var parametri = new List<Parametro>();
                var nucleo = new Nucleo();


                #region Definizione dei parametri

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

                #endregion

                var dt = unica ? DataAccess.ExecuteDataTableStoredProcedure(DBProvider.SqlServerConsulenzaUnica, "REP_NUCLEOIMMOBILIARE", parametri) : DataAccess.ExecuteDataTableStoredProcedure(DBProvider.SqlServerConsulenzaEvoluta, "REP_NUCLEOIMMOBILIARE", parametri);

                if (dt.Rows.Count <= 0) return nucleo;
                nucleo.ChiaveNucleo = chiaveNucleo;
                nucleo.NomeNucleo = dt.Rows[0]["nome"].ToString();
                nucleo.AgenteNucleo = dt.Rows[0]["AgenteNucleo"].ToString();
                nucleo.ReteNucleo = dt.Rows[0]["retenucleo"].ToString();
                nucleo.ChiaveClientePBPrincipale = 0;

                // Gestione per MonitoraggioNucleiImmobiliare
                if (!String.IsNullOrEmpty(dt.Rows[0]["chiaveClientePB"].ToString())) 
                nucleo.ChiaveClientePBPrincipale = Convert.ToInt64(dt.Rows[0]["chiaveClientePB"].ToString());



                string[] chiaviClienti = new string[0];
                chiaviClienti = dt.Rows[0]["chiaviClientePB"] != DBNull.Value ? dt.Rows[0]["chiaviClientePB"].ToString().Split(',') : chiaviClienti;

                if (chiaviClienti.Length > 0)
                {
                    foreach (string s in chiaviClienti)
                    {
                        if (!string.IsNullOrEmpty(s))
                        {
                            Cliente cli = new Cliente();
                            cli = ClienteManager.RecuperaCliente(int.Parse(s), unica);
                            cli.Nome = Helper.CapitalizeWords(cli.Nome.ToLower());
                            cli.Cognome = Helper.CapitalizeWords(cli.Cognome.ToLower());
                            nucleo.ListaClientiNucleo.Add(cli);
                        }
                    }
                }

                // Aggiunta caruso              
                if (nucleo.ChiaveClientePBPrincipale == 0)
                    nucleo.ChiaveClientePBPrincipale = nucleo.ListaClientiNucleo[0].Chiave; 

                if (nucleo.ChiaveClientePBPrincipale == 0)
                    nucleo.ChiaveClientePBPrincipale = nucleo.ListaClientiNucleo[0].Chiave;

                return nucleo;
            }

            public static bool HasServizioAggiuntivoImmobiliare(long chiaveNucleo, bool unica)
            {
                var parametri = new List<Parametro>();
                var nucleo = new Nucleo();


                #region Definizione dei parametri

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

                #endregion

                var dt = unica ? DataAccess.ExecuteDataTableStoredProcedure(DBProvider.SqlServerConsulenzaUnica, "REP_NucleoImmobiliare_HaServizioImmobiliare", parametri) : DataAccess.ExecuteDataTableStoredProcedure(DBProvider.SqlServerConsulenzaEvoluta, "REP_NucleoImmobiliare_HaServizioImmobiliare", parametri);

                return Convert.ToInt32(dt.Rows[0]["result"].ToString()) > 0;
            }
        }
        #endregion
    }
}
