namespace CoreLibrary
{
    /// <summary>
    /// Interface définissant les règles du jeu.
    /// </summary>
    public interface IRegles
    {
        /// <summary>
        /// Obtient le nom des règles du jeu.
        /// </summary>
        string Nom { get; }

        /// <summary>
        /// Obtient le nombre de maximum de tours. 
        /// </summary>
        int TourMaximum { get; }

        /// <summary>
        /// Obtient la taille maximal du code.
        /// </summary>
        int TailleCodeMaximum { get; }

        /// <summary>
        /// Obtient le nombre de joueurs actuels.
        /// </summary>
        int NbJoueurs { get; }

        /// <summary>
        /// Obtient le nombre de maximum de joueurs.
        /// </summary>
        int NbJoueursMaximum { get; }

        /// <summary>
        /// Ajoute un joueur avec le nom spécifié.
        /// </summary>
        /// <param name="nom">Nom du joueur à ajouter</param>
        /// <returns>Le joueur ajouté.</returns>
        Joueur AjouterJoueur(string nom);

        /// <summary>
        /// Récupère le joueur courant.
        /// </summary>
        /// <returns>Le joueur courant.</returns>
        Joueur JoueurCourant();

        /// <summary>
        /// Passe la main au joueur suivant.
        /// </summary>
        void PasserLaMain();

        /// <summary>
        /// Génère un code selon les règles du jeu.
        /// </summary>
        /// <returns>Le code généré.</returns>
        Code GenererCode();

        /// <summary>
        /// Initialise le premier joueur à jouer.
        /// </summary>
        void CommencerLaPartie();

        /// <summary>
        /// Vérifie si la partie est terminée.
        /// </summary>
        /// <returns>True si la partie est terminée, sinon False.</returns>
        bool EstTerminee();

        /// <summary>
        /// Récupère les joueurs gagnants.
        /// </summary>
        /// <returns>Enumération des joueurs gagnants.</returns>
        IEnumerable<Joueur> Gagnants();

        /// <summary>
        /// Récupère les joueurs perdants.
        /// </summary>
        /// <returns>Enumération des joueurs perdants.</returns>
        IEnumerable<Joueur> Perdants();
    }
}
