<?php

include_once "../Factory/PartieFactory.php";
class PartieGateway
{
    private Connection $con;

    /**
     * @param Connection $con
     */
    public function __construct(Connection $con)
    {
        $this->con = $con;
    }
    public function creerPartie(){
        $query = "SELECT * FROM Enigme";
        $this->con->executeQuery($query);
        $results = $this->con->getResults();
        $query= "SELECT max(p.id)
        FROM PARTIE p;";
        $this->con->executeQuery($query);
        $max=$this->con->getResults()[0];
        $partie=PartieFactory::createPartie($max,$results);
        $query= "INSERT INTO Partie VALUES (:idPartie,:idEnigme)";
        $this->con->executeQuery($query, array(':idPartie' => array($partie->getIdPartie(), PDO::PARAM_STR)));
        foreach($partie->getListeEnigme() as $Enigme){
            $query= "INSERT INTO Contenir VALUES (:idPartie, :idEnigme)";
            $this->con->executeQuery($query, array(
            ':idPartie' => array($partie->getIdPartie(), PDO::PARAM_STR),
            ':idEnigme' => array($Enigme->getIdEnigme(), PDO::PARAM_STR)));
        }
    }
    public function delete(string $idPartie){
        $query= "DELETE FROM Partie WHERE id = :idPartie";
        $this->con->executeQuery($query, array(':idPartie' => array($idPartie, PDO::PARAM_STR)));
    }

    public function findOldListePartie() : array{
        $query="SELECT * FROM Partie";
        $this->con->executeQuery($query);
        $results = $this->con->getResults();
        $query= "SELECT max(p.id)
        FROM PARTIE p;";
        $this->con->executeQuery($query);
        $max=$this->con->getResults()[0];
        $listePartie=array();
        foreach($results as $row)
        {
            $query = "SELECT e.* FROM Enigme e,Contenir c,Partie p
            WHERE p.id = c.partie
            AND c.enigme = e.id";
            $this->con->executeQuery($query);
            $listeEnigme=$this->con->getResults();
            $listePartie[]=PartieFactory::createPartie($max,$listeEnigme);
        }
        return $listePartie;
    }

    public function getDashBoardData(Partie $partie) : array{
        $query="SELECT joueur
        FROM Participer p
        WHERE p.partie=:idPartie";
        $this->con->executeQuery($query,array(
            'idPartie' => array($partie->getIdPartie(),PDO::PARAM_INT)));
        $listeIdJoueur=$this->con->getResults();
        $DashboardData=array();
        foreach($listeIdJoueur as $joueur){
            $points=0;
            $query="SELECT pe.utilisateur,pe.points,pe.temps,u.pseudo
            FROM Utilisateur u,PasserEnigme pe,Partie p
            WHERE points IS NOT NULL
            AND u.email=pe.utilisateur
            AND pe.partie=:idPartie
            AND pe.utilisateur=:joueur
            GROUP BY pe.utilisateur,pe.points,pe.temps,u.pseudo
            ORDER BY u.pseudo,pe.temps ASC";
            $this->con->executequery($query,array(
                'idPartie' => array($partie->getIdPartie(),PDO::PARAM_INT),
                'joueur' => array($joueur,PDO::PARAM_STR)));
            $results=$this->con->getResults();
            $joueurDashboardData=array();
            foreach($results as $row)
            {
                $points+=$row['pe.points'];
                $joueurDashboardData[]=array($points,$row['pe.temps']);
            }
            $DashboardData[]=array($results[0]['u.pseudo'] => $joueurDashboardData);
        }
        return $DashboardData;
    }
    
    public function showAll() : void{
        $query= "SELECT * FROM Partie";
        $this->con->executeQuery($query);
        $results=$this->con->getResults();
        foreach ($results as $row) {
            echo $row['idPartie'] . '</br>';
        }
    }
}