using CoreLibrary.Core;
using CoreLibrary.Events;
using CoreLibrary.Persistance;
using System.Runtime.Serialization;

namespace CoreLibrary.Joueurs
{
    /// <summary>
    /// Classe représentant un joueur.
    /// </summary>
    [DataContract]
    public class Joueur : IEstPersistant
    {
        /// <summary>
        /// Le nom du joueur.
        /// </summary>
        [DataMember]
        public string Nom { get; private init; }
        [DataMember]
        public int NbCoutTotal { get; set; }
        [DataMember]
        public int NbPartieGagnee { get; set; }
        [DataMember]
        public int NbPartieEgalite { get; set; }
        [DataMember]
        public int NbPartiePerdue { get; set; }

        /// <summary>
        /// Crée une nouvelle instance de joueur avec un nom
        /// Evénement appelé pour jouer un code.
        /// </summary>
        public event EventHandler<JouerCodeEventArgs>? JouerCode;

        /// <summary>
        /// Appel de l'événement JouerCode.
        /// </summary>
        private void QuandJouerCode(Code code) => JouerCode?.Invoke(this, new JouerCodeEventArgs(code));
       
        /// <summary>
        /// Crée une nouvelle instance de joueur avec un nom et un plateau spécifié. 
        /// </summary>
        /// <param name="nom">Le nom du joueur.</param>
        public Joueur(string nom)
        {
            Nom = nom;
            NbCoutTotal = 0;
            NbPartieGagnee = 0;
            NbPartieEgalite = 0;
            NbPartiePerdue = 0;
        }

        public Joueur(string nom, int nbCoutTotal, int nbPartieGagnee, int nbPartieEgalite, int nbPartiePerdue)
        {
            Nom = nom;
            NbCoutTotal = nbCoutTotal;
            NbPartieGagnee = nbPartieGagnee;
            NbPartieEgalite = nbPartieEgalite;
            NbPartiePerdue = nbPartiePerdue;
        }

        public void Code(Code code)
        {
            ++NbCoutTotal;
            QuandJouerCode(code);
        }

        public void AGagne() => ++NbPartieGagnee;
        public void APerdu() => ++NbPartiePerdue;
        public void AEgalite() => ++NbPartieEgalite;


        public override String ToString()
        {
            return Nom;
        }
    }
}
