using System.ComponentModel.DataAnnotations;

namespace Webzine.Entity
{
    /// <summary>
    /// Classe représentant un titre de musique.
    /// Lien avec l'entité <see cref="Artiste"/> : un artiste peut avoir plusieurs titres, mais un titre n'a qu'un seul artiste.
    /// Lien avec l'entité <see cref="Commentaire"/> : un titre peut avoir plusieurs commentaires, mais un commentaire n'a qu'un seul titre.
    /// </summary>
    public class Titre
    {
        /// <summary>
        /// Identifiant unique du titre.
        /// </summary>
        public int IdTitre { get; set; }

        /// <summary>
        /// Identifiant de l'artiste associé à ce titre. Clé étrangère vers l'entité <see cref="Artiste"/>.
        /// </summary>
        public int IdArtiste { get; set; }

        /// <summary>
        /// Référence à l'artiste associé à ce titre. Permet d'accéder aux informations de l'artiste à partir du titre.
        /// </summary>
        public Artiste Artiste { get; set; }

        /// <summary>
        /// Titre de la musique. Doit être compris entre 1 et 200 caractères.
        /// </summary>
        [Required]
        [MinLength(1)]
        [MaxLength(200)]
        [Display(Name = "Titre")]
        public string Libelle { get; set; }

        /// <summary>
        /// Chronique du titre, qui peut contenir une description ou une critique de la musique. Doit être compris entre 10 et 4000 caractères.
        /// </summary>
        [Required]
        [MinLength(10)]
        [MaxLength(4000)]
        public string Chronique { get; set; }

        /// <summary>
        /// Date de création du titre. Représente la date à laquelle le titre a été ajouté à la base de données. Doit être une date valide et est obligatoire.
        /// </summary>
        [Required]
        [Display(Name = "Date de création")]
        public DateTime DateCreation { get; set; }

        /// <summary>
        /// Durée du titre en secondes. Doit être un entier positif et est obligatoire.
        /// </summary>
        [Display(Name = "Durée en secondes")]
        public int Duree { get; set; }

        /// <summary>
        /// Date de sortie du titre. Représente la date à laquelle le titre a été publié ou rendu disponible au public. Doit être une date valide et est obligatoire.
        /// </summary>
        [Required]
        [Display(Name = "Date de sortie")]
        public DateTime DateSortie { get; set; }

        /// <summary>
        /// URL de la jaquette de l'album associé au titre. Doit être une chaîne de caractères comprise entre 1 et 250 caractères, et est obligatoire. Représente l'image de couverture de l'album auquel le titre appartient.
        /// </summary>
        [Required]
        [MaxLength(250)]
        [Display(Name = "Jaquette de l'album")]
        public string UrlJaquette { get; set; }

        /// <summary>
        /// URL d'écoute du titre. Doit être une chaîne de caractères comprise entre 13 et 250 caractères, et est obligatoire. Représente le lien vers la plateforme ou le service où le titre peut être écouté en ligne.
        /// </summary>
        [MinLength(13)]
        [MaxLength(250)]
        [Display(Name = "URL d'écoute")]
        public string UrlEcoute { get; set; }

        /// <summary>
        /// Nombre de lectures du titre. Représente le nombre de fois que le titre a été écouté ou joué. Doit être un entier positif et est obligatoire.
        /// </summary>
        [Required]
        [Display(Name = "Nombre de lectures")]
        public int NbLectures { get; set; }

        /// <summary>
        /// Nombre de likes du titre. Représente le nombre de fois que le titre a été aimé ou apprécié par les utilisateurs. Doit être un entier positif et est obligatoire.
        /// </summary>
        [Required]
        [Display(Name = "Nombre de likes")]
        public int NbLikes { get; set; }

        /// <summary>
        /// Nom de l'album associé au titre. Doit être une chaîne de caractères comprise entre 1 et 200 caractères, et est obligatoire. Représente le nom de l'album auquel le titre appartient.
        /// </summary>
        [Required]
        public string Album { get; set; }

        /// <summary>
        /// Liste des commentaires associés à ce titre. Permet d'accéder à tous les commentaires laissés par les utilisateurs sur ce titre. Un titre peut avoir plusieurs commentaires, mais un commentaire n'a qu'un seul titre.
        /// </summary>
        public List<Commentaire> Commentaires { get; set; }

        /// <summary>
        /// Liste des styles associés à ce titre. Permet d'accéder à tous les styles musicaux auxquels ce titre appartient. Un titre peut appartenir à plusieurs styles, et un style peut être associé à plusieurs titres (relation many-to-many).
        /// </summary>
        public List<Style> Styles { get; set; } = new List<Style>();
    }
    }
