using CoreLibrary.Core;
using CoreLibrary.Joueurs;

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

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

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

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

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

        /// <summary>
        /// Ajoute un joueur à partir de son nom.
        /// </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>
        /// Démarre la partie.
        /// </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>Les joueurs gagnants.</returns>
        IEnumerable<Joueur> Gagnants();

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