using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

// Attention à l'espace de nom, lors de la création d'une nouvelle classe celui-ci sera par défaut :
// namespace CD67.ModeleMVC.Entity.Extend
// Alors que pour étendre une classe il faut être dans le même namespace que l'original
namespace CD67.ModeleMVC.Entity
{
    /// <summary>
    /// Classe d'extension de celle d'Entity, nécessaire pour y associer les Metadata
    /// </summary>
    [MetadataType(typeof(EXEMPLE_VIKINGS_Metadata))]
    public partial class EXEMPLE_VIKINGS
    {
        //Peut contenir une extension utile à la classe (méthode static ou non, nouvelles propriétés, propriétés construites dynamiquement selon d'autres de la classe, etc.)

        //Exemples de 2 propriétés booléennes qui ont en base de données 0 ou 1
        public Nullable<int> alwaysYes
        {
            get { return 1; }
            set { this.alwaysYes = value; }
        }
        public Nullable<int> alwaysNo
        {
            get { return 0; }
            set { this.alwaysNo = value; }
        }

        //Exemple d'un sous-type fictif pour les listes imbriquées
        public int ID_SOUS_TYPE { get; set; }
    }

    /// <summary>
    /// Classe contenant les DataAnnotations pour chaque champ
    /// </summary>
    public class EXEMPLE_VIKINGS_Metadata
    {
        [Required]
        [Display(Name = "Clé")]
        public int ID { get; set; }
        [Required]
        [Display(Name = "Nom")]
        [StringLength(255)]
        public string NOM { get; set; }
        [Required]
        [Display(Name = "Type")]
        public int ID_TYPE { get; set; }
        [Display(Name = "Sous type", Description = "Valeur non enregistrée")]
        public int ID_SOUS_TYPE { get; set; }
        [Display(Name = "Description")]
        [StringLength(255)]
        [DataType(DataType.MultilineText)]
        public string DESCRIPTION { get; set; }
        [Display(Name = "Date inutile")]
        [DataType(DataType.Date)]
        public Nullable<System.DateTime> DATE_INUTILE { get; set; }

        //Propriétés ajoutées dans la classe partielle et qui utilise un affichage customisé MVC "YesNo", qui se trouve ici : "Views\Shared\DisplayTemplates" et "Views\Shared\EditorTemplates"
        [Display(Name = "A faim?", Description = "Toujours oui")]
        [Range(0, 1)]
        [UIHint("YesNoInt")]
        public Nullable<int> alwaysYes;
        [Display(Name = "Intellectuel?", Description = "Toujours non")]
        [Range(0, 1)]
        [UIHint("YesNoInt")]
        public Nullable<int> alwaysNo;
    }
}
