namespace Consulenza.ReportCommon
{
    public class Opzione
    {
        public string param { get; set; }
    }

    /// <summary>
    /// Opzione che indica se il report deve essere stampato in forma anonima o nominativa.
    /// </summary>
    public class Opzione1 : Opzione  {
        public bool ReportAnonimo { get { return (param=="N"); } }//s nominativo, n anonimo
    }

    // <summary>
    /// Opzione che indica se il report deve essere stampato in forma anonima o nominativa.
    /// </summary>
    public class Opzione10 : Opzione
    {
        public int[] idSchede { get { return (param == "N" ? new int[] { 118 } : new int[] { 117, 118 }); } } 
    }

    /// <summary>
    /// Opzione che restituisce la ChiaveProposta quando il tipo di report richiesto è Proposta.
    /// </summary>
    public class Opzione2 : Opzione {  
        public long ChiaveProposta { get { return long.Parse(param); } }
    }

    public class Opzione3 : Opzione {
        public bool Valore { get { return !(param == "N"); } }
    }
    public class Opzione3_1 : Opzione3 {}
    public class Opzione3_2 : Opzione3 {}
    public class Opzione3_3 : Opzione3 {}
    public class Opzione3_4 : Opzione3 {}
    public class Opzione3_5 : Opzione3 {}
    


    public class Opzione4 : Opzione {
        public bool Valore { get { return !(param == "N"); } }
    }
    public class Opzione4_1 : Opzione4 { }
    public class Opzione4_2 : Opzione { public bool Valore { get { return (param == "S"); } } }
    public class Opzione4_3 : Opzione { public bool Valore { get { return (param == "S"); } } }
    public class Opzione4_4 : Opzione4 { }
    public class Opzione4_5 : Opzione4 { }
    public class Opzione4_6 : Opzione4 { }
    public class Opzione4_7 : Opzione4 { }
    public class Opzione4_8 : Opzione { public bool Valore { get { return (param == "S"); } } }
    public class Opzione4_9 : Opzione4 { }


    public class Opzione5 : Opzione  {       
        public string Valore { get { return param; } }
    }
    public class Opzione5_1 : Opzione5 {

        public OrizzonteTemporale OrizzonteTemporale
        {
            get
            {
                switch (param)
                {
                    case "6":                     
                        return new OrizzonteTemporale
                        {
                            mesi = 6,
                            anni = 0,
                            desc = "sei mesi"
                            
                        };
                    case "12":                      
                        return new OrizzonteTemporale();
                    case "36":
                        return new  OrizzonteTemporale
                        {
                            mesi = 36,
                            anni = 3,
                            desc = "tre anni"
                            
                        };
                    case "60":                       
                          return new OrizzonteTemporale {
                            mesi = 60,
                            anni = 5,
                            desc = "cinque anni"
                        
                        };
                    case "84":                       
                          return new OrizzonteTemporale {
                              mesi = 84,
                              anni = 7,
                              desc = "sette anni"
                        
                        };
                    case "108":                       
                          return new OrizzonteTemporale {
                            mesi = 108,
                            anni = 9,
                            desc = "nove anni"
                        
                        };
                    case "120":
                         
                          return new OrizzonteTemporale {
                            mesi = 120,
                            anni = 10,
                            desc = "dieci anni"
                        };
                    default:
                          return new OrizzonteTemporale();
                }
            }
        }
    }
    public class Opzione5_2 : Opzione5_1 { }
    public class Opzione5_3 : Opzione5 { }

    public class Opzione6 : Opzione {        
        public string Valore { get { return param; } }
    }
    public class Opzione6_1 : Opzione6 { 
        public DettaglioValute DettaglioValute{
        get
            {
                switch (param)
                {
                    case "6":
                        return DettaglioValute.PrimeSei;
                    case "T":
                        return DettaglioValute.Tutte;                   
                    default:
                        return DettaglioValute.PrimeSei;
                }
            }    
        }    
    }
    public class Opzione6_2 : Opzione6 {
        public RaggruppaProdotti RaggruppaProdotti{
            get
                {
                    switch (param)
                    {
                        case "I":
                            return RaggruppaProdotti.AreaBisogno;
                        case "A":
                            return RaggruppaProdotti.Categoria; 
                         case "O":
                            return RaggruppaProdotti.Contratto; 
                        default:
                            return RaggruppaProdotti.AreaBisogno;
                    }
                }    
        }    
    } 
    public class Opzione6_3 : Opzione6 {  
        public ProdottiPatrimonio ProdottiPatrimonio{
            get
                {
                    switch (param)
                    {
                        case "10":
                            return ProdottiPatrimonio.PrimiDieci;
                        case "T":
                            return ProdottiPatrimonio.Tutti; 
                        default:
                            return ProdottiPatrimonio.PrimiDieci;
                    }
                }    
        }    
    }
    public class Opzione6_4 : Opzione6 {
        public MonitoraggiInterrotti MonitoraggiInterrotti
        {
            get
                {
                    switch (param)
                    {
                        case "3":
                            return MonitoraggiInterrotti.UltimiTre;
                        case "T":
                            return MonitoraggiInterrotti.Tutti; 
                        default:
                            return MonitoraggiInterrotti.UltimiTre;
                    }
                }    
        }    
    }
    public class Opzione6_5 : Opzione6
    {
        public Raggruppamento raggruppamento
        {
            get
            {
                switch (param)
                {
                    case "B":
                        return Raggruppamento.AreaBisogno;
                    case "C":
                        return Raggruppamento.Contratto;
                    case "P":
                        return Raggruppamento.TipologiaProdotto;
                    default:
                        return Raggruppamento.AreaBisogno;
                }
            }
        }
    }


    public class Opzione12 : Opzione { 
        public string Valore    { get { return param; } }

        public bool Area    { get { return  param.IndexOf("01")>=0; } }	 
        public bool ContrattoDossier    { get { return  param.IndexOf("02")>=0; } }	 
        public bool NomeProdotto	{ get { return  true; } }//DEFAULT OBBLI	 
        public bool CodIsin	{ get { return  param.IndexOf("03")>=0; } }	 
        public bool DistrCedoleDividendi	{ get { return  param.IndexOf("04")>=0; } }
        public bool RatingMorningstar	{ get { return  param.IndexOf("05")>=0; } }	 
        public bool NumqQuantValnom	{ get { return  param.IndexOf("06")>=0; } }	 
        public bool QuotaPrezzoEuro	{ get { return  param.IndexOf("07")>=0; } }
        public bool ControvaloreAttuale { get { return true; } }//DEFAULT	 OBBLI 
        public bool DataAgg	{ get { return  param.IndexOf("08")>=0; } }	 
        public bool VersatoNettoSott	{ get { return  param.IndexOf("09")>=0; } }	//DEFAULT
        public bool UtilePerditaSott    { get { return  param.IndexOf("10")>=0; } }	 //DEFAULT
        public bool RendAnnualSott	{ get { return  param.IndexOf("11")>=0; } }	 //DEFAULT
        public bool DataSott	{ get { return  param.IndexOf("12")>=0; } }	 //DEFAULT
        public bool VersatoNettoAssoc 	{ get { return  param.IndexOf("13")>=0; } }	 
        public bool UtilPerditaAssoc	{ get { return  param.IndexOf("14")>=0; } }	 
        public bool RendCumAssoc	{ get { return  param.IndexOf("15")>=0; } }	 
        public bool DataAssoc	{ get { return  param.IndexOf("16")>=0; } }	 
        public bool RendInizioTrimestre { get { return  param.IndexOf("17")>=0; } }	 
        public bool RendInizioAnno 	{ get { return  param.IndexOf("18")>=0; } }	 
        public bool VaR	{ get { return  param.IndexOf("19")>=0; } }//DEFAULT	 
        public bool RischioCredito	{ get { return  param.IndexOf("20")>=0; } }	 
        public bool Complessità	{ get { return  param.IndexOf("21")>=0; } }
        public bool ValoriDiCarico { get { return param.IndexOf("22") >= 0; } }
        public bool UtilePerditaCaricoEuro { get { return param.IndexOf("23") >= 0; } }
        public bool UtilePerditaCaricoPerc { get { return param.IndexOf("24") >= 0; } }

        public RaggruppaProdotti RaggruppaProdotti
        {
            get
            {
                var paramList = param.Split(',');
                switch (paramList[paramList.Length-2])
                {
                    case "A":
                        return RaggruppaProdotti.Categoria;
                    case "O":
                        return  RaggruppaProdotti.Contratto;
                    default:
                        return RaggruppaProdotti.AreaBisogno;
                }
               // if (param.IndexOf("A") >= 0) return RaggruppaProdotti.Categoria;
               // else if (param.IndexOf("O") >= 0) return RaggruppaProdotti.Contratto;
               // return RaggruppaProdotti.AreaBisogno;                 
            }
        }   
        public VisualizzazioneProdotti VisualizzioneProdotti
        {
            get
            {
                var paramList = param.Split(',');
                switch (paramList[paramList.Length-1])
                {
                    case "A":
                        return VisualizzazioneProdotti.PosizioniAttive;
                    case "SL":
                        return VisualizzazioneProdotti.PosizioniLiquidate;
                    case "CL":
                        return VisualizzazioneProdotti.ContrattiLiquidati;
                    default:
                        return VisualizzazioneProdotti.All;
                }
            }
        }
    }



    #region Enumeratori

    

    public class OrizzonteTemporale
    {
        public int mesi = 12;
        public int anni = 1;
        public string desc = "un anno";
    }
    public enum DettaglioValute {
        PrimeSei,
        Tutte
    }
    public enum RaggruppaProdotti {
        AreaBisogno,
        Categoria,
        Contratto
    }
    public enum VisualizzazioneProdotti
    {
        All,
        PosizioniLiquidate,
        ContrattiLiquidati,
        PosizioniAttive
    }
    public enum ProdottiPatrimonio  {
        PrimiDieci,
        Tutti        
    }
    public enum MonitoraggiInterrotti  {
        UltimiTre,
        Tutti
       
    }
    public enum Raggruppamento
    { 
        AreaBisogno, 
        Contratto, 
        TipologiaProdotto
    }     

    #endregion
}
