using CoreLibrary.Joueurs;
using CoreLibrary.Manager;

namespace MauiSpark.Views;

public class JoueurClassementNbCoupParPartie
{
    private Manageur manageur;
    private Joueur joueur;

    public Joueur Joueur
    {
        get => joueur;
        private set => joueur = value;
    }
    public int Place
    {
        get => manageur.Joueurs
            .OrderBy(joueur => joueur.NbCoutTotal/(joueur.NbPartiePerdue+joueur.NbPartieGagnee+joueur.NbPartieEgalite)).ToList()
            .IndexOf(Joueur) + 1;
    }

    public int NbCoutMoyen => joueur.NbCoutTotal / (joueur.NbPartiePerdue + joueur.NbPartieGagnee + joueur.NbPartieEgalite);

    public JoueurClassementNbCoupParPartie(Joueur joueur, Manageur manageur)
    {
        this.manageur = manageur;
        this.joueur = joueur;
    }
}

public class JoueurClassementPartieGagnee
{
    private Manageur manageur;
    private Joueur joueur;

    public Joueur Joueur
    {
        get => joueur;
        private set => joueur = value;
    }

    public int Place
    {
        get => manageur.Joueurs.OrderByDescending(joueur => joueur.NbPartieGagnee).ToList().IndexOf(Joueur) + 1;
    }

    public int NbCoutMoyen => joueur.NbCoutTotal / (joueur.NbPartiePerdue + joueur.NbPartieGagnee + joueur.NbPartieEgalite);

    public JoueurClassementPartieGagnee(Joueur joueur, Manageur manageur)
    {
        this.manageur = manageur;
        this.joueur = joueur;
    }
}

public class JoueurClassementPartieEgalite
{
    private Manageur manageur;
    private Joueur joueur;

    public Joueur Joueur
    {
        get => joueur;
        private set => joueur = value;
    }

    public int Place
    {
        get => manageur.Joueurs.OrderByDescending(joueur => joueur.NbPartieEgalite).ToList().IndexOf(joueur)+1;
    }

    public int NbCoutMoyen => joueur.NbCoutTotal / (joueur.NbPartiePerdue + joueur.NbPartieGagnee + joueur.NbPartieEgalite);

    public JoueurClassementPartieEgalite(Joueur joueur, Manageur manageur)
    {
        this.manageur = manageur;
        this.joueur = joueur;
    }
}

public class JoueurClassementPartiePerdue
{
    private Manageur manageur;
    private Joueur joueur;

    public Joueur Joueur
    {
        get => joueur;
        private set => joueur = value;
    }

    public int Place
    {
        get => manageur.Joueurs.OrderByDescending(joueur => joueur.NbPartiePerdue).ToList().IndexOf(joueur)+1;
    }

    public int NbCoutMoyen => joueur.NbCoutTotal / (joueur.NbPartiePerdue + joueur.NbPartieGagnee + joueur.NbPartieEgalite);

    public JoueurClassementPartiePerdue(Joueur joueur, Manageur manageur)
    {
        this.manageur = manageur;
        this.joueur = joueur;
    }
}

public class JoueurClassementAlphabet
{
    private Manageur manageur;
    private Joueur joueur;

    public Joueur Joueur
    {
        get => joueur;
        private set => joueur = value;
    }

    public int Place
    {
        get => manageur.Joueurs
            .OrderBy(joueur => joueur.NbCoutTotal / (joueur.NbPartiePerdue + joueur.NbPartieGagnee + joueur.NbPartieEgalite)).ToList()
            .IndexOf(Joueur) + 1;
    }

    public int NbCoutMoyen => joueur.NbCoutTotal / (joueur.NbPartiePerdue + joueur.NbPartieGagnee + joueur.NbPartieEgalite);

    public JoueurClassementAlphabet(Joueur joueur, Manageur manager)
    {
        this.manageur = manager;
        this.joueur = joueur;
    }
}

public partial class CTableauScore : ContentView
{
    public int NbClique { get; set; } = 0;

    public IEnumerable<JoueurClassementNbCoupParPartie> GetClassementNbCoupParPartie()
    {
        if(NbClique % 2 == 0)
        {
            NbClique++;
            return MauiProgram.Manageur.Joueurs
            .OrderBy(joueur => joueur.NbCoutTotal / (joueur.NbPartiePerdue + joueur.NbPartieGagnee + joueur.NbPartieEgalite))
            .Select(joueur => new JoueurClassementNbCoupParPartie(joueur, MauiProgram.Manageur));
            
        }
        else
        {
            NbClique++;
            return MauiProgram.Manageur.Joueurs
            .OrderByDescending(joueur => joueur.NbCoutTotal / (joueur.NbPartiePerdue + joueur.NbPartieGagnee + joueur.NbPartieEgalite))
            .Select(joueur => new JoueurClassementNbCoupParPartie(joueur, MauiProgram.Manageur));
        }
    }

    public IEnumerable<JoueurClassementPartieGagnee> GetClassementPartieGagnee()
    {
        if(NbClique % 2 == 0)
        {
            NbClique++;
            return MauiProgram.Manageur.Joueurs
           .OrderByDescending(joueur => joueur.NbPartieGagnee)
           .Select(joueur => new JoueurClassementPartieGagnee(joueur, MauiProgram.Manageur));
        }
        else
        {
            NbClique++;
            return MauiProgram.Manageur.Joueurs
           .OrderBy(joueur => joueur.NbPartieGagnee)
           .Select(joueur => new JoueurClassementPartieGagnee(joueur, MauiProgram.Manageur));
        }
           
    }

    public IEnumerable<JoueurClassementPartieEgalite> GetClassementPartieEgalite()
    {
        if(NbClique % 2 == 0)
        {
            NbClique++;
            return MauiProgram.Manageur.Joueurs
                .OrderByDescending(joueur => joueur.NbPartieEgalite)
                .Select(joueur => new JoueurClassementPartieEgalite(joueur, MauiProgram.Manageur));
        }
        else
        {
            NbClique++;
            return MauiProgram.Manageur.Joueurs
                .OrderBy(joueur => joueur.NbPartieEgalite)
                .Select(joueur => new JoueurClassementPartieEgalite(joueur, MauiProgram.Manageur));
        }
       
    }

    public IEnumerable<JoueurClassementPartiePerdue> GetClassementPartiePerdue()
    {
        if(NbClique % 2 == 0)
        {
            NbClique++;
            return MauiProgram.Manageur.Joueurs
            .OrderByDescending(joueur => joueur.NbPartiePerdue)
            .Select(joueur => new JoueurClassementPartiePerdue(joueur, MauiProgram.Manageur));
        }
        else
        {
            NbClique++;
;            return MauiProgram.Manageur.Joueurs
           .OrderBy(joueur => joueur.NbPartiePerdue)
           .Select(joueur => new JoueurClassementPartiePerdue(joueur, MauiProgram.Manageur));
        }
        
    }

    public IEnumerable<JoueurClassementAlphabet> GetClassementAlphabet()
    {
        if(NbClique % 2 == 0)
        {
            NbClique++;
            return MauiProgram.Manageur.Joueurs
           .OrderBy(joueur => joueur.Nom)
           .Select(joueur => new JoueurClassementAlphabet(joueur, MauiProgram.Manageur));
        }
        else
        {
            NbClique++;
            return MauiProgram.Manageur.Joueurs
            .OrderByDescending(joueur => joueur.Nom)
            .Select(joueur => new JoueurClassementAlphabet(joueur, MauiProgram.Manageur));
        }
       
    }
    public CTableauScore()
	{
		InitializeComponent();
    }

    public void UpdateClassement(Func<IEnumerable<object>> getClassement)
    {
        BindingContext = getClassement();
    }
}