<?php

$debug = true;

////////////////////////////////////////////////////////////////////////
///////    Gestion de la connxeion   ///////////////////////////////////
////////////////////////////////////////////////////////////////////////

/**
 * Initialise la connexion à la base de données courante (spécifiée selon constante 
 *	globale SERVEUR, UTILISATEUR, MOTDEPASSE, BDD)			
 */
function open_connection_DB()
{
	global $connexion;

	$connexion = mysqli_connect(SERVEUR, UTILISATEUR, MOTDEPASSE, BDD);
	if (mysqli_connect_errno()) {
		printf("Échec de la connexion : %s\n", mysqli_connect_error());
		exit();
	}
}

/**
 *  	Ferme la connexion courante
 * */
function close_connection_DB()
{
	global $connexion;

	mysqli_close($connexion);
}


////////////////////////////////////////////////////////////////////////
///////   Accès au dictionnaire       ///////////////////////////////////
////////////////////////////////////////////////////////////////////////


/**
 *  Retourne la liste des tables définies dans la base de données courantes (BDD)
 * */
function get_tables()
{
	global $connexion;

	$requete = "SELECT table_name FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA LIKE '" . BDD . "'";

	$res = mysqli_query($connexion, $requete);
	$instances = mysqli_fetch_all($res, MYSQLI_ASSOC);
	return $instances;
}


/**
 *  Retourne les statistiques sur la base de données courante
 * */
function get_statistiques()
{
	global $connexion;

	$requete_stat_globales = "SELECT * FROM stat_globales";
	$requete_equipes_top_1 = "SELECT * FROM equipes_top_1";
	$requete_participants_tournois_recents = "SELECT * FROM participants_tournois_recents";
	$requete_joueurs_au_moins_deux_top_5 = "SELECT * FROM joueurs_au_moins_deux_top_5";
	$requete_tailles_plateaux = "SELECT * FROM tailles_plateaux";
	$requete_top_5_joueurs_parties_jouees = "SELECT * FROM top_5_joueurs_parties_jouees";

	$res_stat_globales = mysqli_query($connexion, $requete_stat_globales);
	$res_equipes_top_1 = mysqli_query($connexion, $requete_equipes_top_1);
	$res_participants_tournois_recents = mysqli_query($connexion, $requete_participants_tournois_recents);
	$res_joueurs_au_moins_deux_top_5 = mysqli_query($connexion, $requete_joueurs_au_moins_deux_top_5);
	$res_tailles_plateaux = mysqli_query($connexion, $requete_tailles_plateaux);
	$res_top_5_joueurs_parties_jouees = mysqli_query($connexion, $requete_top_5_joueurs_parties_jouees);

	if ($res_stat_globales === FALSE || $res_equipes_top_1 === FALSE || $res_participants_tournois_recents === FALSE) {
		echo "Erreur d'exécution de la requête SQL : " . mysqli_error($connexion);
		return null;
	}

	$stat_globales = mysqli_fetch_all($res_stat_globales, MYSQLI_ASSOC);
	$equipes_top_1 = mysqli_fetch_all($res_equipes_top_1, MYSQLI_ASSOC);
	$participants_tournois_recents = mysqli_fetch_all($res_participants_tournois_recents, MYSQLI_ASSOC);
	$joueurs_au_moins_deux_top_5 = mysqli_fetch_all($res_joueurs_au_moins_deux_top_5, MYSQLI_ASSOC);
	$tailles_plateaux = mysqli_fetch_all($res_tailles_plateaux, MYSQLI_ASSOC);
	$top_5_joueurs_parties_jouees = mysqli_fetch_all($res_top_5_joueurs_parties_jouees, MYSQLI_ASSOC);

	return [
		'stat_globales' => $stat_globales,
		'equipes_top_1' => $equipes_top_1,
		'participants_tournois_recents' => $participants_tournois_recents,
		'joueurs_au_moins_deux_top_5' => $joueurs_au_moins_deux_top_5,
		'tailles_plateaux' => $tailles_plateaux,
		'top_5_joueurs_parties_jouees' => $top_5_joueurs_parties_jouees,
	];
}

/***********************************/
/* Récupération des parties à venir et des parties en cours */
/***********************************/
function get_parties_venir_cours()
{
	global $connexion;

	$requete_parties = "SELECT * FROM partie";
	$requete_parties_a_venir = "SELECT * FROM parties_a_venir";
	$requete_parties_en_cours = "SELECT * FROM parties_en_cours";

	$res_parties = mysqli_query($connexion, $requete_parties);
	$res_parties_a_venir = mysqli_query($connexion, $requete_parties_a_venir);
	$res_parties_en_cours = mysqli_query($connexion, $requete_parties_en_cours);

	if ($res_parties === FALSE || $res_parties_a_venir === FALSE || $res_parties_en_cours === FALSE) {
		echo "Erreur d'exécution de la requête SQL : " . mysqli_error($connexion);
		return null;
	}

	$parties = mysqli_fetch_all($res_parties, MYSQLI_ASSOC);
	$parties_a_venir = mysqli_fetch_all($res_parties_a_venir, MYSQLI_ASSOC);
	$parties_en_cours = mysqli_fetch_all($res_parties_en_cours, MYSQLI_ASSOC);

	return [
		'parties' => $parties,
		'parties_a_venir' => $parties_a_venir,
		'parties_en_cours' => $parties_en_cours
	];
}

/***********************************/
/* Récupération des parties terminées avec les différentes variantes, récentes et rapides */
/***********************************/
function get_parties_terminees()
{
	global $connexion;

	$requete_parties_terminees = "SELECT * FROM parties_terminees";
	$requete_parties_terminees_recentes = "SELECT * FROM parties_terminees_recentes";
	$requete_parties_terminees_rapides = "SELECT * FROM parties_terminees_rapides";


	$res_parties_terminees = mysqli_query($connexion, $requete_parties_terminees);
	$res_parties_terminees_recentes = mysqli_query($connexion, $requete_parties_terminees_recentes);
	$res_parties_terminees_rapides = mysqli_query($connexion, $requete_parties_terminees_rapides);

	if ($res_parties_terminees === FALSE || $res_parties_terminees_recentes === FALSE || $res_parties_terminees_rapides === FALSE) {
		echo "Erreur d'exécution de la requête SQL : " . mysqli_error($connexion);
		return null;
	}

	$parties_terminees = mysqli_fetch_all($res_parties_terminees, MYSQLI_ASSOC);
	$parties_terminees_recentes = mysqli_fetch_all($res_parties_terminees_recentes, MYSQLI_ASSOC);
	$parties_terminees_rapides = mysqli_fetch_all($res_parties_terminees_rapides, MYSQLI_ASSOC);

	return [
		'parties_terminees' => $parties_terminees,
		'parties_terminees_recentes' => $parties_terminees_recentes,
		'parties_terminees_rapides' => $parties_terminees_rapides
	];
}

////////////////////////////////////////////////////////////////////////
///////    Informations (structure et contenu) d'une table    //////////
////////////////////////////////////////////////////////////////////////

/**
 *  Retourne le détail des infos sur une table
 * */
function get_infos($typeVue, $nomTable)
{
	global $connexion;

	switch ($typeVue) {
		case 'schema':
			return get_infos_schema($nomTable);
		case 'data':
			return get_infos_instances($nomTable);
		default:
			return null;
	}
}

/**
 * Retourne le détail sur le schéma de la table
 */
function get_infos_schema($nomTable)
{
	global $connexion;

	// récupération des informations sur la table (schema + instance)
	$requete = "SELECT * FROM $nomTable";
	$res = mysqli_query($connexion, $requete);

	// construction du schéma qui sera composé du nom de l'attribut et de son type	
	$schema = array(array('nom' => 'nom_attribut'), array('nom' => 'type_attribut'), array('nom' => 'clé'));

	// récupération des valeurs associées au nom et au type des attributs
	$metadonnees = mysqli_fetch_fields($res);

	$infos_att = array();
	foreach ($metadonnees as $att) {
		//var_dump($att);

		$is_in_pk = ($att->flags & MYSQLI_PRI_KEY_FLAG) ? 'PK' : '';
		$type = convertir_type($att->{'type'});

		array_push($infos_att, array('nom' => $att->{'name'}, 'type' => $type, 'cle' => $is_in_pk));
	}

	return array('schema' => $schema, 'instances' => $infos_att);

}

/**
 * Retourne les instances de la table
 */
function get_infos_instances($nomTable)
{
	return get_infos_requete("SELECT * FROM " . $nomTable);

}

function get_infos_requete($requete)
{
	// récupération des informations sur la table (schema + instance)
	$res = executer_une_requete($requete);
	// extraction des informations sur le schéma à partir du résultat précédent
	$infos_atts = mysqli_fetch_fields($res);

	// filtrage des information du schéma pour ne garder que le nom de l'attribut
	$schema = array();
	foreach ($infos_atts as $att) {
		array_push($schema, array('nom' => $att->{'name'})); // syntaxe objet permettant de récupérer la propriété 'name' du de l'objet descriptif de l'attribut courant
	}

	// récupération des données (instances) de la table
	$instances = mysqli_fetch_all($res, MYSQLI_ASSOC);

	// renvoi d'un tableau contenant les informations sur le schéma (nom d'attribut) et les n-uplets
	return array('schema' => $schema, 'instances' => $instances);
}





function convertir_type($code)
{
	switch ($code) {
		case 1:
			return 'BOOL/TINYINT';
		case 2:
			return 'SMALLINT';
		case 3:
			return 'INTEGER';
		case 4:
			return 'FLOAT';
		case 5:
			return 'DOUBLE';
		case 7:
			return 'TIMESTAMP';
		case 8:
			return 'BIGINT/SERIAL';
		case 9:
			return 'MEDIUMINT';
		case 10:
			return 'DATE';
		case 11:
			return 'TIME';
		case 12:
			return 'DATETIME';
		case 13:
			return 'YEAR';
		case 16:
			return 'BIT';
		case 246:
			return 'DECIMAL/NUMERIC/FIXED';
		case 252:
			return 'BLOB/TEXT';
		case 253:
			return 'VARCHAR/VARBINARY';
		case 254:
			return 'CHAR/SET/ENUM/BINARY';
		default:
			return '?';
	}

}

////////////////////////////////////////////////////////////////////////
///////    Traitement de requêtes                             //////////
////////////////////////////////////////////////////////////////////////

/**
 * Retourne le résultat (schéma et instances) de la requ$ete $requete
 * */
function executer_une_requete(string $requete)
{
	global $connexion;

	$res = true;

	try {

		// récupération des informations sur la table (schema + instance)
		$res = mysqli_query($connexion, $requete);

	} catch (Exception $e) {
		debug_log("Erreur SQL : " . $e->getMessage());
		return false;
	}

	if ($res === false) {
		debug_log("Erreur SQL : " . mysqli_error($connexion));
	}

	return $res;
}



/***********************************/
/* fonction de débug */
/***********************************/

function debug_log(string $msg)
{
	global $debug;

	if ($debug) {
		echo '<h1 style="color: red;">' . $msg . '</h1>';
	}
}

?>