namespace Utilitarios.APINet.Atributos
{
    using System;
    using System.ComponentModel.DataAnnotations;
    using System.Globalization;
    using UtilitariosNet.Recursos;

    public class FechaRangoAttribute : ValidationAttribute
    {
        #region "DECLARACIONES"

        /// <summary>
        /// Fecha minima
        /// </summary>
        public DateTime fechaMinima { get; set; }

        /// <summary>
        /// Fecha maxima
        /// </summary>
        public DateTime fechaMaxima { get; set; }

        #endregion "DECLARACIONES"

        #region "CONSTRUCTORES"

        /// <summary>
        /// Construcor de la clase
        /// </summary>
        /// <param name="fechaMinima">Fecha minima</param>
        /// <param name="fechaMaxima">Fecha Maxima</param>
        public FechaRangoAttribute(int fechaMinima, int fechaMaxima) : base(RecursosUtilitarios.ErrorRangoFecha)
        {
            this.fechaMinima = DateTime.Now.AddDays(-fechaMinima);
            this.fechaMaxima = DateTime.Now.AddDays(fechaMaxima);
        }

        #endregion "CONSTRUCTORES"

        #region "METODOS PUBLICOS"

        /// <summary>
        /// Valida la fecha
        /// </summary>
        /// <param name="value">Valor de la fecha</param>
        /// <returns>Un booleano indicando si es valida o no</returns>
        public override bool IsValid(object value)
        {
            bool isValidDate = true;

            if (value != null && value is DateTime)
            {
                DateTime dateValue = (DateTime)value;
                isValidDate = this.fechaMinima <= dateValue && dateValue <= this.fechaMaxima;
            }

            return isValidDate;
        }

        /// <summary>
        /// Formato del error
        /// </summary>
        /// <param name="name">Nombre</param>
        /// <returns>Un string con el formato</returns>
        public override string FormatErrorMessage(string name)
        {
            return string.Format(CultureInfo.CurrentCulture, ErrorMessageString, name, this.fechaMinima, this.fechaMaxima);
        }

        #endregion "METODOS PUBLICOS"
    }
}