using Consulenza.DataServices.fideuram.data.service;
using System.Linq;

namespace Consulenza.ReportWriter.Business
{
    /// <summary>
    /// Classe utilizzata per determinare il tipo di profilo (professionale, retail) di un Cliente o di un Nucleo e il grado di aggressività.
    /// </summary>
    public class Profiler
    {

        /// <summary>
        /// Imposta o recupera l'informazione se il Cliente ha un profilo professionale.
        /// </summary>
        public bool ProfiloProfessionale { get; set; }
        /// <summary>
        /// Imposta o recupera l'informazione se il Cliente ha un profilo aggressivo.
        /// </summary>
        public bool ProfiloAggressivo { get; set; }
        /// <summary>
        /// Imposta o recupera l'informazione se il Cliente ha un profilo professionale aggressivo.
        /// </summary>
        public bool ProfiloProfessionaleAggressivo { get; set; }

        private rsAnagraficaNucleo _rsAnagraficaNucleo;
        private rsClienteAnagrafica _rsClienteAnagrafica;

        private enum TipoReport { cliente, nucleo };
        private TipoReport _tipo;

        /// <summary>
        /// Costruttore
        /// </summary>
        public Profiler()
        {

        }
        /// <summary>
        /// Costruttore
        /// </summary>
        /// <param name="rsAnagraficaNucleo">rsAnagraficaNucleo Anagrafica Nucleo</param>
        public Profiler(rsAnagraficaNucleo rsAnagraficaNucleo)
        {
            _rsAnagraficaNucleo = rsAnagraficaNucleo;
            _tipo = TipoReport.nucleo;
            SetProfilo();
        }
        /// <summary>
        /// Costruttore
        /// </summary>
        /// <param name="rsClienteAnagrafica">rsClienteAnagrafica Anagrafica Cliente</param>
        public Profiler(rsClienteAnagrafica rsClienteAnagrafica)
        {
            _rsClienteAnagrafica = rsClienteAnagrafica;
            _tipo = TipoReport.cliente;
            SetProfilo();
        }
        /// <summary>
        /// Imposta il profilo
        /// </summary>
        private void SetProfilo()
        {
            if (_tipo == TipoReport.nucleo)
            {
                ProfiloProfessionale = isNucleoProfessionale(_rsAnagraficaNucleo.listaClientiNucleo);
                ProfiloAggressivo = isNucleoAggressivo(_rsAnagraficaNucleo.listaClientiNucleo);

            }
            else
            {
                //ProfiloProfessionale = _rsClienteAnagrafica.idTipoCliente == 1 ? true: false;
                //a regime vanno letti da datiSeiUnico...
                ProfiloProfessionale = _rsClienteAnagrafica.clienteProfile.clienteProfessionale; 
                ProfiloAggressivo = _rsClienteAnagrafica.codProfilo >= 5 ? true : false;
            }

            // indica che il cliente è professionale con profilo aggressivo (le modifiche sui valori di rischio etc si applicano su questa tipologia)
            ProfiloProfessionaleAggressivo = ProfiloProfessionale && ProfiloAggressivo;

        }

        private bool isNucleoProfessionale(rsAnagraficaClienteNucleo[] listaClientiNucleo)
        {
            //In attesa di un valore indicativo sulla categoria Cliente

            if (listaClientiNucleo.Where(x => x.tipoConsulenza != "P").ToList().Count() > 0)
                return false;
            else
                return true;
            //if (listaClientiNucleo.Where(x => x.clienteProfessionale == false).ToList().Count() > 0)
            //    return false;
            //else
            //    return true;

        }
        //--Adriano

        //Adriano: serve per determinare se tutti i clienti appartenenti al nucleo hanno un profilo aggressivo (codProfilo >=5)
        private bool isNucleoAggressivo(rsAnagraficaClienteNucleo[] listaClientiNucleo)
        {
            if (listaClientiNucleo.Min(c => c.codProfilo) >= 5)
                return true;
            else
                return false;
        }
    }
}
