package fr.uge.concurrence.exo1;

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

public class WordGuess {
	private final String solution;
	private final int nbThreads;
	
	private static final int CREDITS = 4;

	private WordGuess(String solution, int nbThreads) {
		this.solution = solution;
		this.nbThreads = nbThreads;
		super();
	}

	public static WordGuess newWordGuess(int nbThreads) {
		var solution = Words.randomWord();
		return new WordGuess(solution, nbThreads);
	}

	public boolean register() {
		// TODO
		return false;
	}

	public Map<Thread, Integer> credits() {
		// TODO
		return null;
	}
	
	private Optional<String> play(char letter) {
		// TODO
		return null;
	}

	public static void main(String[] args) {
		var nbThreads = 6;
		var game = newWordGuess(nbThreads - 1);
		var threads = new Thread[nbThreads];

		for (int i = 0; i < nbThreads; i++) {
			threads[i] = Thread.ofPlatform().name("thread " + i).start(() -> {
				var name = Thread.currentThread().getName();
				try {
					waitRandom(2000);
					// Inscription
					System.out.println(name + " tries to register");
					if (!game.register()) {
						System.out.println(name + " NOT registered");
						return;
					}
					System.out.println(name + " registered");
					
//					// Jeu
//					var already = new StringBuilder();
//					while (true) {
//						var letter = Words.randomLetter(already.toString());
//						already.append(letter);
//						System.out.println(name + " plays " + letter);
//						
//						var played = game.play(letter);
//						if (played.isEmpty()) {
//							System.out.println(name + " LOST");
//							return;
//						}
//						var state = played.orElseThrow();
//						if (!state.contains(".")) {
//							System.out.println(name + " WON: " + state);
//							return;
//						}
//						System.out.println("\t\t " + state);
//						already.append(state);
//					
//					    waitRandom(1000);
//
//					    // Q4
//						//if (ThreadLocalRandom.current().nextInt(10) == 0) {
//						//	System.out.println("CRASH: " + name);
//						//	Thread.currentThread().interrupt();
//						//}
//					}
				} catch (InterruptedException e) {
					// TODO
				}
			});
		}
	}

	public static void waitRandom(int clue) throws InterruptedException {
		Thread.sleep(clue + Math.abs(ThreadLocalRandom.current().nextInt() % clue));
	}
}
