using CoreLibrary;
using CoreLibrary.Regles;
using CoreLibrary.Core;
using Xunit;
using System.Reflection;
using CoreLibrary.Events;

namespace UnitTesting
{
    public class PartieUT
    {
        [Fact]
        public void TestPartieInitialiseCorrectement()
        {
            
            IRegles regles = new ReglesClassiques();
            Partie partie = new Partie(regles);

            Assert.NotNull(partie);
        }

        [Fact]
        public void TestJouerAppelleDemanderJoueurEvent()
        {
            IRegles regles = new ReglesClassiques();
            Partie partie = new Partie(regles);
            bool eventAppelle = false;


            partie.DemanderJoueur += (sender, e) =>
            {
                eventAppelle = true;
                return $"Joueur {e.Numero}";
            };

            partie.Jouer();
            Assert.True(eventAppelle);
        }


        [Fact]
        public void TestJouerAppelleDemanderJetonEvent()
        {
            IRegles regles = new ReglesClassiques();
            Partie partie = new Partie(regles);
            bool eventAppelle = false;

            partie.DemanderJeton += (sender, e) =>
            {
                eventAppelle = true;
                return new Jeton();
            };
              
            partie.Jouer();
            Assert.True(eventAppelle);
        }

        [Fact]
        public void TestJouerAppelleAjouterJoueurEvent()
        {
            IRegles regles = new ReglesClassiques();
            Partie partie = new Partie(regles);
            bool eventAppelle = false;

            partie.AjouterJoueur += (sender, e) =>
            {
                eventAppelle = true;
               
            };
            partie.Jouer();
            Assert.True(eventAppelle);

        }

        [Fact]
        public void TestJouerAppelleDebutPartieEvent()
        {
            IRegles regles = new ReglesClassiques();
            Partie partie = new Partie(regles);
            bool eventAppelle = false;

            partie.DebutPartie += (sender, e) =>
            {
                eventAppelle = true;
            };
            partie.Jouer();
            Assert.True(eventAppelle);
        }

        [Fact]
        public void TestJouerAppelleNouveauTourEvent()
        {
            IRegles regles = new ReglesClassiques();
            Partie partie = new Partie(regles);
            bool eventAppelle = false;

            partie.NouveauTour += (sender, e) =>
            {
                eventAppelle = true;
            };

            partie.Jouer();
            Assert.True(eventAppelle);
        }

        [Fact]
        public void TestJouerAppelleNouveauJetonEvent()
        {
            IRegles regles = new ReglesClassiques();
            Partie partie = new Partie(regles);
            bool eventAppelle = false;

            partie.AjouterJeton += (sender, e) =>
            {
                eventAppelle = true;
            };

            partie.Jouer();
            Assert.True(eventAppelle);
        }
      
        [Fact]
        public void TestJouerAppelleNouveauCodeEvent()
        {
            IRegles regles = new ReglesClassiques();
            Partie partie = new Partie(regles);
            bool eventAppelle = false;

            partie.AjouterCode += (sender, e) =>
            {
                eventAppelle = true;
            };

            partie.Jouer();
            Assert.True(eventAppelle);
        }

        [Fact]
        public void TestJouerAppellePasserMainEvent()
        {
            IRegles regles = new ReglesClassiques();
            Partie partie = new Partie(regles);
            bool eventAppelle = false;

            partie.PasserMain += (sender, e) =>
            {
                eventAppelle = true;
            };

            partie.Jouer();
            Assert.True(eventAppelle);
        }

        [Fact]
        public void TestJouerAppellePartieTermineeEvent()
        {
            IRegles regles = new ReglesClassiques();
            Partie partie = new Partie(regles);
            bool eventAppelle = false;

            partie.PartieTerminee += (sender, e) =>
            {
                eventAppelle = true;
            };

            partie.Jouer();
            Assert.True(eventAppelle);
        }

        [Fact]
        public void TestCreerCodeJetonNull()
        {
            IRegles regles = new ReglesClassiques();
            Partie partie = new Partie(regles);

            //Type type = typeof(Partie);

            //FieldInfo? fieldInfo = type.GetField("CreerCode(Code code)", BindingFlags.NonPublic | BindingFlags.Instance);
            //Assert.NotNull(fieldInfo);

            //Code? codeSecret = (Code?)fieldInfo.GetValue(plateau);

            //Assert.NotNull(codeSecret);
            //plateau.AjouterCode(codeSecret);
            //Assert.True(plateau.Victoire);
        }

        [Fact]
        public void TestQuandSupprimerDernierJeton()
        {
            IRegles regles = new ReglesClassiques();
            Partie partie = new Partie(regles);
            bool appele = false;

            partie.DemanderJeton += (sender, e) =>
            {
                return e.Indice == 0 || appele ? new Jeton() : null;
            };

                partie.SupprimerDernierJeton += (sender, e) =>
            {
                appele = true;
            };

            partie.Jouer();


            Assert.True(appele);
        }
    }
}
