START TRANSACTION;
-- "un n-uplet contenant le nombre de joueurs, le nombre d’équipes, le nombre de classements, le nombre de
-- 	tournois et la moyenne des participants par tournoi".
CREATE VIEW
	stat_globales AS
SELECT
	(
		SELECT
			COUNT(*)
		FROM
			joueur
	) AS nb_joueurs,
	(
		SELECT
			COUNT(*)
		FROM
			equipe
	) AS nb_equipes,
	(
		SELECT
			COUNT(*)
		FROM
			classement
	) AS nb_classements,
	(
		SELECT
			COUNT(*)
		FROM
			tournoi
	) AS nb_tournois,
	(
		WITH
			participants_tournois AS (
				SELECT
					idtournoi,
					COUNT(idtournoi) AS nb
				FROM
					participe
				GROUP BY
					idtournoi
			)
		SELECT
			AVG(nb) AS average
		FROM
			participants_tournois
	) AS moyenne_participants;

-- "le nombre d’équipes classées premières des classements et dont aucun des membres n’est premier dans
--	un classement individuel".
CREATE VIEW
	equipes_top_1 AS (
		SELECT
			idequipe
		FROM
			classement_equipe
		WHERE
			rang = 1
	);

CREATE VIEW
	equipes_avec_bon_joueur AS (
		SELECT DISTINCT
			idequipe
		FROM
			classement_individuel
			JOIN joueur USING (idjoueur)
		WHERE
			rang = 1
	);

-- "Pour les 3 dernières années, donner le nombre moyen de participants aux tournois".
CREATE VIEW
	participants_tournois_recents AS (
		SELECT
			idtournoi,
			COUNT(idtournoi) AS nb
		FROM
			participe
			JOIN tournoi USING (idtournoi)
		WHERE
			YEAR (date_deb) >= (YEAR(NOW()) - 3)
		GROUP BY
			idtournoi
	);

-- "Donner le nom et le prénom des joueurs classés de manière individuelle dans le top 5 d’au moins 2
--	classements de portée nationale".
CREATE VIEW
	joueurs_au_moins_deux_top_5 AS (
		SELECT DISTINCT
			J.nom,
			J.prenom
		FROM
			joueur J
			JOIN classement_individuel CI1 ON J.idjoueur = CI1.idjoueur
			JOIN classement_individuel CI2 ON J.idjoueur = CI2.idjoueur
			JOIN classement C1 ON C1.idclassement = CI1.idclassement
			JOIN classement C2 ON C2.idclassement = CI2.idclassement
		WHERE
			CI1.rang <= 5
			AND CI2.rang <= 5
			AND C1.portee = "nationale"
			AND C2.portee = "nationale"
			AND CI1.idclassement < CI2.idclassement
	);

-- "Pour chaque taille de plateau, donner le nombre de parties jouées avec un plateau de cette taille".
CREATE VIEW
	tailles_plateaux AS (
		SELECT
			taille,
			COUNT(idpartie) AS nb_parties
		FROM
			plateau
			JOIN partie USING (idplateau)
		GROUP BY
			taille
	);

-- "Le top 5 des joueurs (pseudo) qui ont joué le plus de parties"
CREATE VIEW
	top_joueurs_parties_jouees AS (
		SELECT
			pseudo,
			COUNT(idPartie) AS nb_parties
		FROM
			joueur
			JOIN joue USING (idjoueur)
		GROUP BY
			idjoueur
		ORDER BY
			nb_parties DESC
	);

CREATE VIEW
	top_5_joueurs_parties_jouees AS (
		SELECT
			*
		FROM
			top_joueurs_parties_jouees
		LIMIT
			5
	);

-------------------------------------------------------------------
-- Fonctionalités afficherParties
-- Afficher les parties dans l'état "a venir"
CREATE VIEW
	parties_a_venir AS (
		SELECT
			*
		FROM
			partie
		WHERE
			etat = "a venir"
	);

-- Afficher les parties dans l'état "en cours"
CREATE VIEW
	parties_en_cours AS (
		SELECT
			*
		FROM
			partie
		WHERE
			etat = "en cours"
	);

-- Afficher les parties dans l'état "terminee"
CREATE VIEW
	parties_terminees AS (
		SELECT
			*
		FROM
			partie
		WHERE
			etat = "terminee"
	);

-- Afficher les parties dans l'état "terminee" 
-- les 50 parties les plus récentes (avec un tri de la plus récente à la plus ancienne)
CREATE VIEW
	parties_terminees_recentes AS (
		SELECT
			*
		FROM
			partie
		WHERE
			etat = "terminee"
		ORDER BY
			date_partie ASC
		LIMIT
			50
	);

-- Afficher les parties dans l'état "terminee"
-- Les 50 parties plus rapides par taille de plateau" 
-- (avec un tri par nombre de cartes décroissant puis, pour les parties avec un plateau de même taille, 
-- de la plus rapide à la plus lente)
CREATE VIEW
	parties_terminees_rapides AS (
		SELECT
			*
		FROM
			partie pa
			JOIN plateau pl USING (idplateau)
		WHERE
			etat = "terminee"
		ORDER BY
			pl.taille ASC,
			duree ASC
		LIMIT
			50
	);

-- Affiche le nombre de carte par couleur dans le jeu
CREATE VIEW
	cartes_jeu AS (
		SELECT
			niveau as couleur,
			COUNT(idcarte) as nombre
		FROM
			carte
		GROUP BY
			niveau
		ORDER BY
			couleur
	);

COMMIT;