using Models.Events;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;


namespace Models.Jeux.Plateau
{
    public class Partie
    {

        /// <summary>
        /// Evénement affichant le gagnant de la partie
        /// </summary>
        public event EventHandler<ShowingWinnerEventArgs> ShowingWinner;

        protected virtual void OnShowingWinner(Joueur j)
        {
            ShowingWinner?.Invoke(this, new ShowingWinnerEventArgs(j));
        }

        /// <summary>
        /// Constructeur de la classe partie,crée un nouveau plateau et assigne les couleurs au joueurs
        /// </summary>
        /// <param name="J1">Objet J1 de type Joueur correspondant au joueur numéro 1 de la partie</param>
        /// <param name="J2">Objet J2 de type Joueur correspondant au joueur numéro 2 de la partie</param>
        public Partie(Joueur J1, Joueur J2)
        {
            Plateau = new Plateau();
            Joueur1 = J1;
            Joueur2 = J2;
            JoueurCourrant = J1;
            Joueur1.CouleurDePion = Couleur.BLANC;
            Joueur2.CouleurDePion = Couleur.NOIR;
        }

        /// <summary>
        /// Crée le getter et le setter de l'attribut plateau de partie
        /// </summary>
        public Plateau Plateau
        {
            get
            {
                return plateau;
            }
            set
            {
                plateau = value;
            }
        }

        private Plateau plateau;

        /// <summary>
        /// Crée le getter et le setter de l'attribut Joueur1 de partie
        /// </summary>
        public Joueur Joueur1
        {
            get
            {
                return joueur1;
            }
            set
            { 
                joueur1 = value; 
            }
        }

        private Joueur joueur1;

        /// <summary>
        /// Crée le getter et le setter de l'attribut Joueur2 de partie
        /// </summary>
        public Joueur Joueur2
        {
            get
            {
                return joueur2;
            }
            set
            {
                joueur2 = value;
            }
        }

        private Joueur joueur2;


        /// <summary>
        /// Crée le getter et le setter de l'attribut JoueurCourrant de partie
        /// </summary>
        public Joueur JoueurCourrant
        {
            get
            {
                return joueurCourrant;
            }
            set
            {
                joueurCourrant = value;
            }
        }

        private Joueur joueurCourrant;


        /// <summary>
        /// Permet de savoir si quelqu'un a gagné la partie et dis qui est le vainqueur , chaque fois que l'on prend un 
        /// pion adverse, on gagne un point et celui a 20 gagne
        /// </summary>
        /// <returns>Renvoie un int correspondant au numéro du joueur et 0 si personne n'a encore gagné</returns>
        public int Agagner()
        {
            if (Joueur1.NbPions == 20)
            {
                return 1;
            }
            else
            {
                if (Joueur2.NbPions == 20)
                {
                    return 2;
                }
            }
            return 0;

        }





        /// <summary>
        /// Appelle l'événement affichant le gagnant de la partie
        /// </summary>
        public void AfficherGagnant()
        {
            Joueur j = new Joueur();
            OnShowingWinner(j);
        }
    }

}
