package fr.uge.poo.pokemon.arena;

import fr.uge.poo.pokemon.items.Pokemon;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Objects;
import java.util.concurrent.ThreadLocalRandom;
import java.util.function.Predicate;

public class Arena {

    private final ArrayList<Pokemon> fighters = new ArrayList<>();

    public Arena(List<Pokemon> pokemons) {
        Objects.requireNonNull(pokemons);
        for(var pokemon : pokemons){
            Objects.requireNonNull(pokemon);
            if (!pokemon.isAlive()){
                throw new IllegalArgumentException("All pokemon entering the arena must be alive");
            }
            fighters.add(pokemon);
        }
    }

    public Pokemon winner(){
        if (fighters.size()!=1){
            throw new IllegalStateException("A winner has not yet been crowned");
        }
        return fighters.iterator().next();
    }

    public void startFight(){

        var rng = ThreadLocalRandom.current();
        while(fighters.size()!=1){
            var indexAttacker = rng.nextInt(0,fighters.size());
            var indexDefender = rng.nextInt(0,fighters.size());
            if (indexDefender==indexAttacker){
                continue;
            }
            var attacker = fighters.get(indexAttacker);
            var defender = fighters.get(indexDefender);
            System.out.println(attacker + " attacks " + defender);
            Pokemon.attack(attacker,defender);
            if (!defender.isAlive()){
                System.out.println(defender + " died :(");
                fighters.remove(defender);
            }
        }
        System.out.println("Combat is finished. The winner is "+winner());
    }

    public static void main(String[] args) {
        var arena = new Arena(List.of(new Pokemon("Ronflex",10,100,4),new Pokemon("Miaouss",1,10,10),new Pokemon("Bulbizar",5,5,8)));
        arena.startFight();
    }
}
