<?php


//Les données sont directement chargées depuis la base de données
require_once 'dao/bdd.php';

/**
 * @brief Classe DAO retournant des informations relatives au classement
 */
class point_manager
    {
    /**
     * @brief Retourne le nombre de point pour une partie spécifié
     * @return int : nb de points
     */
    public static function getGamePoint($game_id)
        {
        //Pour obtenir le nombre de point, il faut :
        // la durée de la partie => table GAME
        // le nombre de réponses => table QUESTION
        // le nombre de bonne réponses => table LINK_GAME_QUESTION

        //Récupération de la durée
        $length = self::getLengthByGame($game_id);

        //Récupération du nombre de questions
        $nb_question = self::getNbQuestion($game_id);

        //Récupération du nombre de bonne réponses
        $nb_br = self::getGoodAnswer($game_id);
        
            
        //Calcul du score final
        $points = ($nb_br[0] / $nb_question[0]) * 100 - ($length[0] / 1000);

        if ($points < 0)
            {
            return 0;
            } else
            {
            return $points;
            }


        //On retourne le résultat
        return $points;
        }

        
        /**
         * @brief Obtient le nombre de bonnes réponses dans une partie
         * @arg $game_id identifiant de la partie
         * @return int
         */
   public static function getGoodAnswer($game_id)
        {

        //Récupération de la base de données
        $bdd = bdd::getInstance()->getPDO();
        
        //Mise en place de la requête
        $query = "SELECT SUM(lnk.reponse = question.bonnereponse) AS sum 
                  FROM link_game_question AS lnk INNER JOIN question
                  ON lnk.question_id = question.id
                  WHERE lnk.game_id = '" . $game_id . "'";

        //Récupération des résultat
        $data = $bdd->query($query)->fetch();
        
        //On renvoie les données
        return $data;
        }

        /**
         * @brief Obtient le nombre de questions associées à une partie
         * @arg $game_id identifiant de la partie
         * @return int
         */
    public static function getNbQuestion($game_id)
        {
        //Récupération de la BDD
        $bdd = bdd::getInstance()->getPDO();
        
        //Création de la requête
        $query = "SELECT COUNT(*) AS nb
                  FROM link_game_question AS lnk INNER JOIN question
                  ON lnk.question_id = question.id
                  WHERE lnk.game_id = '" . $game_id . "'";

        //Récupération des résultats
        $data = $bdd->query($query)->fetch();
        
        //On renvoie les infos
        return $data;
        }

        /**
         * @brief Obtient les identifiants des parties jouées par un joueur
         * @arg $login login du joueur
         * @return tableau d'entier
         */
    public static function getGamesByLogin($login)
        {
        //Mise en place de la connexion à la base de données
        $bdd = bdd::getInstance()->getPDO();

        //Mise en place de la requête
        $query = "SELECT id FROM game WHERE user_login = '$login'";

        //Récupération des résultats
        $result = $bdd->query($query)->fetchAll();

        //On renvoi les résultats
        return $result;
        }

        /**
         * @brief Obtient la durée d'une partie
         * @arg $game_id identifiant de la partie
         * @return int (temps en milliseconde)
         */
    public static function getLengthByGame($game_id)
        {
        //Mise en place de la connexion à la base de données
        $bdd = bdd::getInstance()->getPDO();

        //Mise en place de la requête
        $query = "SELECT length FROM game ORDER BY id = '$game_id'";

        //Récupération du résultat
        $result = $bdd->query($query)->fetch();

        //On renvoie les résultats
        return $result;
        }

        /**
         * @brief Obtient la liste de toutes les personnes inscrites
         * @return tableau de login
         */
    public static function getAllPlayer()
        {
        //Mise en place de la connexion à la base de données
        $bdd = bdd::getInstance()->getPDO();

        //Mise en place de la requête
        $query = "SELECT login FROM user ORDER BY login ASC";

        //Récupération des résultats
        $result = $bdd->query($query)->fetchAll();

        //On renvoie les résultats
        return $result;
        }

    /**
     * @brief Obtient le nom de la catégorie et les 2 réponses du groupe de question associé à l'identifiant de la partie
     * @arg $game_id identifiant de la partie
     * @return array[categorie, reponse0, reponse1]
     */
    public static function getInfoByGroupId($game_id)
        {
        //Récupếration de la connexion à la base de données
        $bdd = bdd::getInstance()->getPDO();

        //Création de la requête
        $query = "SELECT categorie_nom AS categorie, reponse0, reponse1 FROM `group` WHERE `id`= 
            (SELECT group_id FROM question WHERE `id` = 
                (SELECT question_id FROM link_game_question WHERE game_id = '$game_id' LIMIT 1)
            LIMIT 1) 
        LIMIT 1";

        //Récupération des résultats
        $result = $bdd->query($query)->fetch();

        //On renvoie les données
        return $result;
        }

        /**
         * @brief Obtient les parties jouée par un joueur dans une catégorie
         * @arg $login login du joueur
         * @arg $cat catégorie désirée
         * @return tableau contenant l'id, le temps et le login de la partie
         */
    public static function getGameByLoginByCat($login, $cat)
        {
        //Mise en place de la BDD
        $bdd = bdd::getInstance()->getPDO();

        //Mise en place de la requête
        $query = "SELECT * FROM game 
                WHERE game.user_login = '$login'
                AND game.id = 
                    ANY(
                            SELECT lnk.game_id
                            FROM link_game_question AS lnk
                            INNER JOIN question
                            ON lnk.question_id = question.id

                            INNER JOIN `group`
                            ON question.group_id = group.id

                            INNER JOIN categorie
                            ON `group`.categorie_nom = categorie.nom

                            WHERE categorie.nom = '$cat'

                            GROUP BY lnk.game_id
                    )";

        //Récupération des résultats
        $result = $bdd->query($query)->fetchAll();

        //On renvoie les résultats
        return $result;
        }

    }

?>
