<?php

function println($str): void
{
	echo $str . '<br/>';
}

function rangDansPlateau(int $idplateau, int $rang): bool
{
	return !empty(get_infos_requete("SELECT idplateau AS nb FROM est_compose WHERE idplateau = " .
		$idplateau . " AND rang = " . $rang)['instances']);
}

function getCarteID(string $couleur, int $index): int
{
	return get_infos_requete("SELECT idcarte FROM carte WHERE niveau = '" . $couleur . "'")['instances'][$index - 1]['idcarte'];
}

function carteDansPlateau(int $idplateau, int $idcarte): bool
{
	return !empty(get_infos_requete("SELECT idcarte AS nb FROM est_compose WHERE idplateau = " .
		$idplateau . " AND idcarte = " . $idcarte)['instances']);
}

function ajouterCarte(int $idcarte, int $idplateau, int $rang): void
{
	executer_une_requete("INSERT INTO est_compose (idcarte, idplateau, rang) VALUES (" . $idcarte . ", " . $idplateau . ", " . $rang . ")");
}

function ajouterCartesAlea(string $couleur, int $nbCartesCouleurPartie, int $nbCartes, int $idplateau): void
{
	$nbCartesJeu = get_infos_requete("SELECT nombre FROM cartes_jeu WHERE couleur = '" . $couleur . "'")['instances'][0]['nombre'];

	for ($i = 0; $i < $nbCartesCouleurPartie; $i++) {
		$rang = rand(1, $nbCartes);
		while (rangDansPlateau($idplateau, $rang)) {
			$rang = rand(1, $nbCartes);
		}
		$idcarte = getCarteID($couleur, rand(1, $nbCartesJeu));
		while (carteDansPlateau($idplateau, $idcarte)) {
			$idcarte = getCarteID($couleur, rand(1, $nbCartesJeu));
		}
		ajouterCarte($idcarte, $idplateau, $rang);
	}
}

function creerPartie(int $nbCartesVertes, int $nbCartesOranges, int $nbCartesNoires): int
{
	$total = $nbCartesVertes + $nbCartesOranges + $nbCartesNoires;
	$res = get_infos_requete("INSERT INTO plateau (`taille`) VALUES ('" . $total .
		"') RETURNING idplateau");

	if ($res === false) {
		echo 'La requête a échoué';
		return false;
	}

	$idplateau = $res['instances'][0]['idplateau'];

	$res = get_infos_requete("INSERT INTO partie (date_partie, horaire, etat, idplateau) VALUES (NOW(), NOW(), 'a venir', "
		. $idplateau . ") RETURNING idpartie");

	if ($res === false) {
		echo 'La requête a échoué';
		return false;
	}

	$idpartie = $res['instances'][0]['idpartie'];

	ajouterCartesAlea("noire", $nbCartesNoires, $total, $idplateau);
	ajouterCartesAlea("orange", $nbCartesOranges, $total, $idplateau);
	ajouterCartesAlea("verte", $nbCartesVertes, $total, $idplateau);

	return $idpartie;
}

function getJoueurs()
{
	return get_infos_instances("joueur")['instances'];
}


function getJoueursPartie(int $idpartie)
{
	return get_infos_requete("SELECT * FROM joue JOIN joueur J USING(idjoueur) WHERE joue.idpartie = " . $idpartie)['instances'];
}


function ajouter_joueur(int $idpartie, int $idjoueur): void
{
	$couleur = rand(0, 16777215);
	executer_une_requete("INSERT INTO joue (idpartie, idjoueur, couleur_pion) VALUES (" . $idpartie . ", " . $idjoueur . ", " . $couleur . ")");
}

function enlever_joueur(int $idpartie, int $idjoueur): void
{
	executer_une_requete("DELETE FROM joue WHERE idpartie = " . $idpartie . " AND idjoueur = " . $idjoueur);
}

function valider_partie(int $idpartie, string $ordre): void
{
	$joueurs = null;
	switch ($ordre) {
		case "honneurJeune":
			$joueurs = get_infos_requete("SELECT * FROM joue JOIN joueur J USING(idjoueur) WHERE joue.idpartie = " . $idpartie . " ORDER BY annee_nais");
			break;

		case "honneurNul":
			$joueurs = get_infos_requete("SELECT idjoueur, COUNT(idjoueur) as nb_parties FROM joueur JOIN joue USING(idjoueur) WHERE idjoueur IN(SELECT idjoueur FROM joue WHERE idpartie=" .
				$idpartie . ") GROUP BY idjoueur ORDER BY nb_parties");
			break;

		case "aleatoire":
			// TODO: vrai aléatoire
			$joueurs = get_infos_requete("SELECT * FROM joue JOIN joueur J USING(idjoueur) WHERE joue.idpartie = " . $idpartie);
			break;

		default:
			debug_log("How did we get there ?");
			break;
	}

	for ($i = 1; $i <= sizeof($joueurs['instances']); $i++) {
		executer_une_requete("UPDATE joue SET rang = " . $i . " WHERE (`idjoueur` = " . $joueurs['instances'][$i - 1]['idjoueur'] . ") and (`idpartie` = " . $idpartie . ");");
	}
}

?>