package fr.uge.concurrence.exo1;

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

public class ThreadMonitor {

	public ThreadMonitor(int capacity) {
		// TODO
	}

	public OptionalInt ping() {
		// TODO
		return null;
	}

	public boolean makeRoom() {
		// TODO
		return true;
	}

	public List<Thread> threadOrder() {
		// TODO
		return null;
	}

	public static void main(String[] args) {
		var nbThreads = 10;
		var threadMonitor = new ThreadMonitor(4);

		for (int i = 0; i < nbThreads; i++) {
			Thread.ofPlatform().name("" + i).start(() -> {
				var name = "thread " + Thread.currentThread().getName();
				try {
					while (true) {
						var milliseconds = 800 + ThreadLocalRandom.current().nextLong(500);
						Thread.sleep(milliseconds);

						IO.println(name + " pings...");
						var position = threadMonitor.ping();
						if (position.isEmpty()) {
							IO.println(name + " leaves (no room left)");
							return;
						}
						IO.println(name + " in position " + position.orElseThrow());
					}
				} catch (InterruptedException e) {
					throw new AssertionError();
				}
			});
		}

		for (;;) {
			try {
				Thread.sleep(1000);
				IO.println(threadMonitor.threadOrder());
//				if (threadMonitor.makeRoom()) {
//					IO.println("** Room has been made **");
//				} else {
//					IO.println("** No room needed **");
//				}
			} catch (InterruptedException e) {
				throw new AssertionError();
			}
		}
	}
}
