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

function get_plateau_id(int $idpartie): int
{
	return get_infos_requete("SELECT idplateau FROM partie WHERE idpartie = " . $idpartie)['instances'][0]['idplateau'];
}

function getJoueursPosition(int $idpartie, int $tour, int $pos)
{
	return get_infos_requete("SELECT idjoueur, rang FROM est_en_position JOIN joue USING(idpartie, idjoueur) WHERE idpartie = "
		. $idpartie . " AND position = " . $pos . " AND num_tour = " . $tour)['instances'];
}

function getJoueursPositions(int $idpartie, int $tour)
{
	return get_infos_requete("SELECT idjoueur, position FROM est_en_position WHERE idpartie = " .
		$idpartie . " AND num_tour = " . $tour)['instances'];
}

function getJoueurPosition(int $idpartie, int $idjoueur, int $tour)
{
	return get_infos_requete("SELECT idjoueur, position FROM est_en_position WHERE idpartie = " .
		$idpartie . " AND num_tour = " . $tour . " AND idjoueur = " . $idjoueur)['instances'][0];
}

function get_carte_id(int $idplateau, int $positionCarte): int
{
	$res = get_infos_requete("SELECT idcarte FROM est_compose WHERE idplateau = " .
	$idplateau . " AND rang = " . $positionCarte)['instances'];
	if (empty($res))
		return -1;
	return $res[0]['idcarte'];
}

function get_contrainte(int $idcontrainte, string $typeContrainte)
{
	return get_infos_requete("SELECT * FROM " . $typeContrainte . " JOIN contrainte USING(idcontrainte) WHERE idcontrainte = " . $idcontrainte)['instances'];
}

function valide_face_de_de($contrainte, &$des): bool
{
	$couleur = $contrainte['couleur'];
	$valeur = $contrainte['valeur'];
	for ($i = 0; $i < sizeof($des); $i++) {
		$de = $des[$i];
		if ($de['couleur'] == $couleur && $de['valeur'] == $valeur) {
			array_splice($des, $i, 1);
			return true;
		}
	}
	return false;
}

function valide_memes_au_choix($contrainte, &$des): bool
{
	$couleur = $contrainte['couleur'];
	$nombre = $contrainte['nombre'];
	$desPareils = array_fill(0, 6, 0);
	for ($i = 0; $i < sizeof($des); $i++) {
		$de = $des[$i];
		if ($de['couleur'] == $couleur) {
			$desPareils[$de["valeur"] - 1]++;
		}
	}

	for ($i = 0; $i < sizeof($desPareils); $i++) {
		if ($desPareils[$i] >= $nombre) {
			for ($j = 0; $j < $nombre; $j++) {
				//enlève une occurence
				unset($desPareils[array_search($i, $desPareils)]);
			}
			return true;
		}
	}

	return false;
}

function valide_serie_au_choix($contrainte, &$des): bool
{
	$couleur = $contrainte["couleur"];
	$nombre = $contrainte["nombre"];

	echo 'SHEEEEEEEEEEEEEEEEEEEEEEEESH';

	for ($i = 0; $i < sizeof($des); $i++) {
		if ($des[$i]["couleur"] == $couleur) {

			echo "je commence avec le dé " . $des[$i]["valeur"] . " !!!!!!!!!!!!! <br/>";

			$suivant = $des[$i]["valeur"] + 1;
			// pour chaque dé de la série
			$j = 0;
			for ($j = 0; $j < $nombre - 1; $j++) {
				// on le cherche
				$trouve = false;
				for ($k = 0; $k < sizeof($des); $k++) {
					if ($des[$k]["couleur"] == $couleur && $des[$k]["valeur"] == $suivant) {
						$suivant++;
						$trouve = true;
						echo "j'ai trouvé le dé " . $des[$k]["valeur"] . " ! ";
						break;
					}
				}
				if (!$trouve) {
					echo "j'ai pas trouvé le dé " . $suivant . " ! ";
					break;
				}
				echo 'CACA   ';
			}

			echo "J : " . $j . "<br/>";

			if ($j == $nombre - 1) {
				// on enlève les bons dés
				for ($valeur = $des[$i]["valeur"]; $valeur < $valeur + $nombre; $valeur++) {
					for ($k = 0; $k < sizeof($des); $k++) {
						if ($des[$k]["couleur"] == $couleur && $des[$k]["valeur"] == $valeur) {
							array_splice($des, $k, 1);
							break;
						}
					}
				}
				return true;
			}
		}
	}

	return false;
}

function valide_seuil_de_des($contrainte, &$des): bool
{
	$couleur = $contrainte['couleur'];
	$valeur = $contrainte['valeur'];
	$plusgrand = $contrainte['sens'] == '>' ? true : false;
	$total = 0;

	for ($i = 0; $i < sizeof($des); $i++) {
		$de = $des[$i];
		if ($de['couleur'] == $couleur) {
			$total += $de['valeur'];
		}
	}

	if ($plusgrand) {
		if ($total <= $valeur)
			return false;

		while ($total > 0) {
			for ($i = 0; $i < sizeof($des); $i++) {
				$de = $des[$i];
				if ($de['couleur'] == $couleur) {
					$total -= $de['valeur'];
					array_splice($des, $i, 1);
					break;
				}
			}
		}
		return true;
	} else {
		if ($total >= $valeur)
			return false;

		for ($i = 0; $i < sizeof($des); $i++) {
			$de = $des[$i];
			if ($de['couleur'] == $couleur && $de['valeur'] < $total) {
				array_splice($des, $i, 1);
				break;
			}
		}
		return true;
	}
}

function valide_contrainte(int $idcontrainte, &$des): bool
{
	$contrainte = get_contrainte($idcontrainte, "face_de_de");
	if (!empty($contrainte)) {
		return valide_face_de_de($contrainte[0], $des);
	}

	$contrainte = get_contrainte($idcontrainte, "meme_au_choix");
	if (!empty($contrainte)) {
		return valide_memes_au_choix($contrainte[0], $des);
	}

	$contrainte = get_contrainte($idcontrainte, "serie_au_choix");
	if (!empty($contrainte)) {
		return valide_serie_au_choix($contrainte[0], $des);
	}

	$contrainte = get_contrainte($idcontrainte, "seuil_de_des");
	if (!empty($contrainte)) {
		return valide_seuil_de_des($contrainte[0], $des);
	}

	echo 'QUOOOOOOOOOOOOOOOOOOI';
	return false;
}

function valide_carte(int $idcarte, &$des): bool
{
	if ($idcarte == -1)
		return false;
	$contraintes = get_carte_contraintes($idcarte);
	foreach ($contraintes as $contrainte) {
		if (!valide_contrainte($contrainte['idcontrainte'], $des)) {
			return false;
		}
	}
	return true;
}

function get_carte_contraintes(int $idcarte)
{
	return get_infos_requete("SELECT idcontrainte FROM est_contrainte WHERE idcarte = " . $idcarte)['instances'];
}

function get_des_lancer(int $idlancer)
{
	$res = get_infos_requete("SELECT rang_couleur_valeur FROM de_lance WHERE idlancer = " . $idlancer)['instances'];
	$des = array();
	foreach ($res as $row) {
		$str = $row['rang_couleur_valeur'];
		$str = explode(';', $str);
		$couleur = $str[1];
		$valeur = $str[2];
		switch ($couleur) {
			case 'B':
				$couleur = 'bleu';
				break;

			case 'J':
				$couleur = 'jaune';
				break;

			case 'R':
				$couleur = 'rouge';
				break;
		}
		array_push($des, array('couleur' => $couleur, 'valeur' => $valeur));
	}
	return $des;
}

function tente_validations(int $idpartie, int $idplateau, int $idlancer, int $tour, int $joueurPos): int
{
	$des = get_des_lancer($idlancer);
	$cartesValides = 0;
	while (valide_carte(get_carte_id($idplateau, $joueurPos + $cartesValides + 1), $des)) {
		$cartesValides++;
		if (get_carte_id($idplateau, $joueurPos + $cartesValides + 1) == -1) {
			return -1;
		}
	}
	return $cartesValides;
}

function get_lancers(int $idpartie, int $tour)
{
	return get_infos_requete("SELECT * FROM comprend WHERE idpartie = " .
		$idpartie . " AND num_tour = " . $tour . " ORDER BY numero_lancer_dans_tour")['instances'];
}

function mettre_a_jour_positions(int $idpartie, int $tour)
{
	$joueurs = getJoueursPositions($idpartie, $tour);
	$idplateau = get_plateau_id($idpartie);
	foreach ($joueurs as $joueur) {
		$joueurPos = $joueur['position'];
		if ($joueur['idjoueur'] != get_joueur_tour($idpartie, $tour)['idjoueur']) {
			placer_joueur($joueur['idjoueur'], $idpartie, $tour + 1, $joueurPos);
			continue;
		}

		$lances = get_lancers($idpartie, $tour);
		for ($i = 0; $i < 3; $i++) {
			$idlancer = $lances[$i]['idlancer'];
			$validations = tente_validations($idpartie, $idplateau, $idlancer, $tour, $joueurPos);
			if ($validations == -1) {
				// gagné !
				echo 'GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG';
				$joueurPos = 13;
				break;
			}
			$joueurPos += $validations;
		}
		placer_joueur($joueur['idjoueur'], $idpartie, $tour + 1, $joueurPos);
	}
}

function get_joueur_tour(int $idpartie, int $tour)
{
	$joueurs = getJoueursPartie($idpartie);
	$joueur_index = ($tour - 1) % sizeof($joueurs);

	return $joueurs[$joueur_index];
}

function get_joueur_actuel(int $idpartie)
{
	return get_joueur_tour($idpartie, get_partie_tour($idpartie));
}

function partie_est_a_venir(int $idpartie)
{
	return !empty(get_infos_requete("SELECT idpartie FROM partie WHERE idpartie = " .
		$idpartie . " AND etat = 'a venir'")['instances']);
}

function get_partie_tour(int $idpartie): int
{
	$tour = get_infos_requete("SELECT * FROM tour WHERE idpartie = "
		. $idpartie . " ORDER BY num_tour DESC LIMIT 1")['instances'];

	if (empty($tour)) {
		return 0;
	}

	return $tour[0]['num_tour'];
}

function getCards(int $idpartie)
{
	return get_infos_requete("SELECT img, idcarte FROM carte JOIN est_compose USING(idcarte) JOIN partie USING(idplateau) WHERE idpartie = " . $idpartie . " ORDER BY rang")['instances'];
}

function get_parties_id()
{
	$parties = get_infos_requete("SELECT idpartie FROM partie WHERE etat = 'a venir'")['instances'];

	$ids = array();
	foreach ($parties as $partie) {
		array_push($ids, $partie['idpartie']);
	}

	return $ids;
}

function placer_joueur(int $idjoueur, int $idpartie, int $tour, int $pos)
{
	executer_une_requete("INSERT INTO est_en_position (idjoueur, idpartie, num_tour, position) VALUES ("
		. $idjoueur . ", " . $idpartie . ", " . $tour . ", " . $pos . ")");
}

function placer_joueurs_debut(int $idpartie)
{
	$joueurs = getJoueursPartie($idpartie);

	foreach ($joueurs as $joueur) {
		placer_joueur($joueur['idjoueur'], $idpartie, 1, 0);
	}
}

function lancer_partie(int $idpartie)
{
	executer_une_requete("UPDATE partie SET etat = 'en cours', date_partie = NOW(), horaire = NOW() WHERE idpartie = " . $idpartie);
	creer_tour($idpartie);
	placer_joueurs_debut($idpartie);
}



function inserer_de(int $idlancer, int $rang, string $couleur, int $valeur)
{

	$rang_couleur_valeur = $rang . ";" . $couleur . ";" . $valeur;

	executer_une_requete("INSERT INTO de_lance (`rang_couleur_valeur`, `idlancer`) VALUES ('" .
		$rang_couleur_valeur . "', " . $idlancer . " )");
}

function lancer_la_couleur(int $idlancer, string $couleur, int $nbDes, int $decalage)
{
	$nums = [];
	for ($i = 0; $i < $nbDes; $i++) {
		$numDe = rand(1, 6);
		inserer_de($idlancer, $decalage + $i + 1, $couleur, $numDe);
		array_push($nums, $numDe);
	}
	return $nums;
}

function creer_tour(int $idpartie)
{
	$tour = get_partie_tour($idpartie);

	$tour++;

	executer_une_requete("INSERT INTO tour (idpartie, num_tour) VALUES (" .
		$idpartie . ", " . $tour . ")");
}

function get_lancer_dans_tour(int $idpartie, int $tour): int
{
	$res = get_infos_requete("SELECT * FROM comprend WHERE idpartie = " .
		$idpartie . " AND num_tour = " . $tour . " ORDER BY numero_lancer_dans_tour DESC")['instances'];

	if (empty($res))
		return -1;

	return $res[0]['numero_lancer_dans_tour'];
}

function get_lancers_restants(int $idpartie)
{
	return 2 - get_lancer_dans_tour($idpartie, get_partie_tour($idpartie));
}

function lancer_les_des(int $idpartie, int $desbleus, int $desjaunes, int $desrouges)
{
	$total = $desbleus + $desrouges + $desjaunes;

	if ($total != 6) {
		return [];
	}

	$des_lances = ["B" => [], "J" => [], "R" => []];

	$idlancer = get_infos_requete("INSERT INTO effectue (idjoueur) VALUES (" .
		get_joueur_actuel($idpartie)['idjoueur'] . ") RETURNING idlancer")['instances'][0]['idlancer'];

	$des_lances["B"] = lancer_la_couleur($idlancer, "B", $desbleus, 0);
	$des_lances["J"] = lancer_la_couleur($idlancer, "J", $desjaunes, $desbleus);
	$des_lances["R"] = lancer_la_couleur($idlancer, "R", $desrouges, $desbleus + $desjaunes);

	$tour = get_partie_tour($idpartie);
	$lancer_dans_tour = get_lancer_dans_tour($idpartie, $tour) + 1;

	executer_une_requete("INSERT INTO comprend (`idpartie`, `num_tour`, `idlancer`, `numero_lancer_dans_tour`) VALUES ("
		. $idpartie . ", " . $tour . ", " . $idlancer . ", " . $lancer_dans_tour . ")");

	if ($lancer_dans_tour == 2) {
		creer_tour($idpartie);
		mettre_a_jour_positions($idpartie, $tour);
	}

	return $des_lances;
}

?>