package fr.uge.concurrence;

import java.util.List;
import java.util.Optional;
import java.util.concurrent.ThreadLocalRandom;

import fr.uge.concurrence.TeamBidding.STATUS;

public class TeamBiddingTest {
    public static void main(String[] args) {
        var nbCaptains = 6;
        var nbPlayers = 30;
        var players = new Thread[nbPlayers];
        
        var teamBiddig = new TeamBidding(nbCaptains - 1);

        for (int i = 0; i < nbPlayers; i++) {
            players[i] = Thread.ofPlatform().start(() -> {
                var name = Thread.currentThread().getName();
                while (true) {
                    try {
                        Thread.sleep(ThreadLocalRandom.current().nextInt(1000));
                        var waiting = teamBiddig.waitingTeams();
                        if (waiting == null) {
                            System.out.println(name + " stops, all teams are  full");
                            return;
                        }
                        String teamName;
                        if (waiting.isEmpty()) {
                            System.out.println(name + " : no team available, tries to be captain");
                            teamName = "Team of " + name;
                        } else {
                            teamName = waiting.get(ThreadLocalRandom.current().nextInt(waiting.size()));
                        }

                        System.out.println(name + " asks for " + teamName);
                        var result = teamBiddig.bidForTeam(teamName);
                        if (result == STATUS.NOT_IN_TEAM) {
                            System.out.println(name + " not in team");
                            continue;
                        }
                        System.out.println(name + " is enroled in " + teamName);
                        return;
                    } catch (InterruptedException e) {
                        throw new AssertionError();
                    }
                }
            });
        }
    }
}