using CoreLibrary;
using CoreLibrary.Exceptions;
using Xunit;

namespace UnitTesting
{
    public class ReglesClassiquesUT
    {
        [Fact]
        public void TestConstructor()
        {
            ReglesClassiques regles = new ReglesClassiques();

            Assert.NotNull(regles);
            Assert.Equal(0, regles.NbJoueurs);
            Assert.Equal(2, regles.NbJoueursMaximum);
        }

        [Fact]
        public void TestAjouterJoueur() 
        {
            ReglesClassiques regles = new ReglesClassiques();

            regles.AjouterJoueur("MonJoueur");

            Assert.Equal(1, regles.NbJoueurs);
        }

        [Fact]
        public void TestJoueurCourantWithPlayer()
        {
            ReglesClassiques regles = new ReglesClassiques();
            regles.AjouterJoueur("joueur1");
            regles.AjouterJoueur("joueur2");
            regles.CommencerLaPartie();

            Joueur joueurCourant = regles.JoueurCourant();

            Assert.NotNull(joueurCourant);
            Assert.Equal("joueur1", joueurCourant.Nom);
        }

        [Fact]
        public void TestJoueurCourantNoPlayer()
        {
            ReglesClassiques regles = new ReglesClassiques();
            Assert.Throws<PartieNonCommenceeException>(() => regles.JoueurCourant());
        }

        [Fact]
        public void TestPasserLaMainValid()
        {
            ReglesClassiques regles = new ReglesClassiques();
            regles.AjouterJoueur("joueur1");
            regles.AjouterJoueur("joueur2");

            regles.CommencerLaPartie();
            Joueur joueurCourantInitial = regles.JoueurCourant();
            regles.PasserLaMain();
            Joueur joueurCourantSuivant = regles.JoueurCourant();

            Assert.NotEqual(joueurCourantInitial, joueurCourantSuivant);
            Assert.Equal("joueur2", joueurCourantSuivant.Nom);
        }

        [Fact]
        public void TestPasserLaMainInvalid()
        {
            ReglesClassiques regles = new ReglesClassiques();
            Assert.Throws<PartieNonCommenceeException>(() => regles.PasserLaMain());
        }

        [Fact]
        public void TestGenererCode()
        {
            ReglesClassiques regles = new ReglesClassiques();
            Code code = regles.GenererCode();

            Assert.NotNull(code);
            Assert.Equal(regles.TailleCodeMaximum, code.TailleMaximale());
        }

        [Fact]
        public void TestCommencerLaPartie()
        {
            ReglesClassiques regles = new ReglesClassiques();
            regles.AjouterJoueur("joueur1");
            regles.AjouterJoueur("joueur2");

            regles.CommencerLaPartie();
            Joueur joueurCourant = regles.JoueurCourant();

            Assert.NotNull(joueurCourant);
            Assert.Equal("joueur1", joueurCourant.Nom);
        }

        [Fact]
        public void TestEstTermineeTrue()
        {
            //
        }

        [Fact]
        public void TestEstTermineeFalse()
        {
            ReglesClassiques regles = new ReglesClassiques();
            regles.AjouterJoueur("joueur1");
            regles.AjouterJoueur("joueur2");
            regles.CommencerLaPartie();

            bool estTerminee = regles.EstTerminee();

            Assert.False(estTerminee);
        }

        //Test Gagnants et Perdants + TestEstTermineeTrue + TestConstructor PB

    }
}
