<?php

namespace Model;

use BusinessClass\Form;
use Exception;
use GuzzleHttp\Client;
use GuzzleHttp\Exception\GuzzleException;
use PDOException;

/**
 * Permet de développer les fonctions appelées par le controllerAdmin pour gérer
 * les actions de l'administrateur
 */
class ModelAdmin
{
    private Client $client;

    public function __construct(){
        $this->client = new Client();
    }

    public function goToAdmin(): void
    {
        global $rep, $views;
        try{
            require_once($rep . $views['admin']);
        } catch (PDOException $e) {
            $error = $e->getMessage();
            require_once($rep . $views['form']);
    }
}
    /**
     * Permet de créer et d'ajouter une question et de retourner son ID afin de la
     * reconnaitre facilement dans la suite du code.
     *
     * @return int
     * @throws Exception
     */
    public function addQuestion(): int
    {
        $questionContent = $_POST['question'];
        $type = $_POST['type'];
        try {


            $question = new $type(0, $questionContent);
            $res = $this->client->request('GET', 'https://codefirst.iut.uca.fr/containers/Temoignages-deploy_api_form/getForm');
            if ($res->getStatusCode()!=200){
                throw new Exception('GetForm failed');
            }
            $form = json_decode($res->getBody());
            if (!empty($form)) {
                $res = $this->client->request('POST', 'https://codefirst.iut.uca.fr/containers/Temoignages-deploy_api_form/addQuestion?
                                    content='.$questionContent.'&
                                    classQuestion='.get_class($question).'&
                                    idForm='.$form[0]['id']
                );
                if ($res->getStatusCode()!=200){
                    throw new Exception('AddQuestion failed');
                }
                return json_decode($res->getBody());
            }
        }catch (GuzzleException $g){
            throw new Exception($g->getMessage(),$g->getCode(),$g);
        }

        return -1;
    }


    /**
     * Permet d'ajouter une possibilité de réponse à une question en l'assignant à des catégories.
     *
     * @return void
     * @throws Exception
     */
     public function addResponse(): void
    {
        $idQuestion = $_POST['idQuestion'];
        $response = $_POST['response'];
        $categories = $_POST['categories'];
        if ($categories == null) {
            $categories = [];
        }
        try {
            $res = $this->client->request('POST', 'https://codefirst.iut.uca.fr/containers/Temoignages-deploy_api_form/insertResponseInQuestion?
                                    response='.$response.'&
                                    categories='.$categories.'&
                                    $idQuestion='.$idQuestion
            );
            if ($res->getStatusCode()!=200){
                throw new Exception('InsertResponseInQuestion failed');
            }
        }catch (GuzzleException $g){
            throw new Exception($g->getMessage(),$g->getCode(),$g);
        }
    }


    /**
     * Permet de créer un nouveau formulaire en précisant son titre et sa description.
     *
     * @return void
     * @throws Exception
     */
    public function createForm(): void
    {
        try {
            $res = $this->client->request('GET', 'https://codefirst.iut.uca.fr/containers/Temoignages-deploy_api_form/getForm');
            if ($res->getStatusCode()!=200){
                throw new Exception('GetForm failed');
            }
            $formulaire = json_decode($res->getBody());
            if (empty($formulaire)) {
                $form = new Form(0, "Votre avis nous intéresse !!!", "Description de notre formulaire", array());
                $res = $this->client->request('POST', 'https://codefirst.iut.uca.fr/containers/Temoignages-deploy_api_form/insertForm?
                                    title='.$form->getTitle().'&
                                    description='.$form->getDescription()
                );
                if ($res->getStatusCode()!=200){
                    throw new Exception('InsertForm failed');
                }
            }
        }catch (GuzzleException $g){
            throw new Exception($g->getMessage(),$g->getCode(),$g);
        }
    }


    /**
     * Permet d'ajouter une nouvelle catégorie (mot-clef)
     *
     * @return void
     * @throws Exception
     */
    public function addKeyword(): void
    {
        $keyword = $_POST['keyword'];
        try {
            $res = $this->client->request('POST', 'https://codefirst.iut.uca.fr/containers/Temoignages-deploy_api_form/insertKeyword?
                                    keyword='.$keyword
            );
            if ($res->getStatusCode()!=200){
                throw new Exception('InsertKeyword failed');
            }
        }catch (GuzzleException $g){
            throw new Exception($g->getMessage(),$g->getCode(),$g);
        }
    }


    /**
     * Permet de récupérer toutes les catégories existantes.
     *
     * @return array
     * @throws Exception
     */
    public function getCategories(): array
    {
        $categories = [];
        try {
            $res = $this->client->request('GET', 'https://codefirst.iut.uca.fr/containers/Temoignages-deploy_api_form/getAllKeyword');
            if ($res->getStatusCode()!=200){
                throw new Exception('GetAllKeyword failed');
            }
            $res = json_decode($res->getBody());
            foreach ($res as $category) {
                $categories[] = $category["word"];
            }
        }catch (GuzzleException $g){
            throw new Exception($g->getMessage(),$g->getCode(),$g);
        }

        return $categories;
    }


    /**
     * Permet de récupérer toutes les questions existantes.
     *
     * @return array
     * @throws Exception
     */
    public function getQuestions(): array
    {
       try {
            $res = $this->client->request('GET', 'https://codefirst.iut.uca.fr/containers/Temoignages-deploy_api_form/existsForm');
           if ($res->getStatusCode()!=200){
               throw new Exception('Exists failed');
           }
            if (json_decode($res->getBody())){
                $res = $this->client->request('GET', 'https://codefirst.iut.uca.fr/containers/Temoignages-deploy_api_form/getForm');
                if ($res->getStatusCode()!=200){
                    throw new Exception('GetForm failed');
                }
                $idForm = json_decode($res->getBody())[0]["id"];
                $res = $this->client->request('GET', 'https://codefirst.iut.uca.fr/containers/Temoignages-deploy_api_form/getAllQuestions?
                                    idForm='.$idForm
                );
                if ($res->getStatusCode()!=200){
                    throw new Exception('GetAllQuestions failed');
                }
                $questionsArray = json_decode($res->getBody());
                return Factory::getBuiltObjects($questionsArray, "Question");
            }else{
                return array();
            }
        }catch (GuzzleException $g){
            throw new Exception($g->getMessage(),$g->getCode(),$g);
        }
    }


    /**
     * Permet de récupérer toutes les réponses existantes.
     *
     * @return array
     * @throws Exception
     */
    public function getResponsesCandidate(): array
    {
        try {
            $res = $this->client->request('GET', 'https://codefirst.iut.uca.fr/containers/Temoignages-deploy_api_form/getAllListResponsesOfCandidate');
            if ($res->getStatusCode()!=200){
                throw new Exception('GetAllListResponsesOfCandidate failed');
            }
            $responsesCandidate = json_decode($res->getBody());
            $results = [];
            foreach ($responsesCandidate as $response) {
                $res = $this->client->request('GET', 'https://codefirst.iut.uca.fr/containers/Temoignages-deploy_api_form/getDetailsListResponsesOfCandidate?
                                            id='.$response["id"]
                );
                if ($res->getStatusCode()!=200){
                    throw new Exception('GetDetailsListResponsesOfCandidate failed');
                }
                $results[] = json_decode($res->getBody());
            }
            return $results;
        }catch (GuzzleException $g){
            throw new Exception($g->getMessage(),$g->getCode(),$g);
        }
    }
}
