<?php

namespace Modules\Evaluation\Controller;

use Modules\Evaluation\Service\CampaignService;
use Skeleton\Controller\Controller;
use Helpers\Ariane\ArianeSub;
use Modules\Consultation\Repository\AoEvent;
use Modules\Consultation\Repository\GestionConsultation;
use Helpers\Trad\Trad;
use Modules\Consultation\WebService\Consultation;
use Helpers\Outil\treeview;
use Modules\Evaluation\Service\BibliothequeService;
use Entity\Model\BibQstTh;
use Entity\Model\BibQstQ;
use GuzzleHttp\Psr7\Response;
use Helpers\Outil\Date;
use Helpers\Outil\Roles;
use Modules\Evaluation\Repository\BibliothequeDeQuestions;
use Modules\Evaluation\Repository\Campaign;
use Modules\Evaluation\Repository\Import\ImportQuiz;
use Modules\Evaluation\Repository\Model;
use Modules\Evaluation\Service\ImportService;
use stdClass;
use Helpers\Session\Enums\MenuTopEnum;
use Helpers\Session\Session;

class ImportBibliothequeController extends Controller
{
    /**
     * @var array<mixed>
     */
    protected array $droits = [];

    /**
     * init
     * gestion des droits
     *
     * @return void
     */
    public function init()
    {
        $droits = [
            'HA_MQUESCM' => Roles::droitsUtilisateur($this->pdo, 'HA_MQUESCM', $_SESSION["Session_Login"]), // Droit de création et modification des modèles et les catégories de modèles
            'HA_CEVAVIS' => Roles::droitsUtilisateur($this->pdo, 'HA_CEVAVIS', $_SESSION["Session_Login"]), // Droit de visu des campagnes
            'HA_CEVALCM' => Roles::droitsUtilisateur($this->pdo, 'HA_CEVALCM', $_SESSION["Session_Login"]), // Droit de création et modification des campagnes
            'HA_CEVASUP' => Roles::droitsUtilisateur($this->pdo, 'HA_CEVASUP', $_SESSION["Session_Login"]), // Droit de suppression des campagnes d'évaluation
            'HA_BIBQTCM' => Roles::droitsUtilisateur($this->pdo, 'HA_BIBQTCM', $_SESSION["Session_Login"]), // Droit de création et modification de questionnaire
        ];

        $this->droits = $droits;
    }

    /**
     * listeImportModeleAction
     *
     * @return string|Response
     */
    public function listeImportModeleAction()
    {
        $idMode = $this->request->getAttribute('idMode');
        $mode   = $this->request->getAttribute('mode');

        $trad = $this->getTranslationService();

        $modelRepo    = new Model($this->pdo);
        $campaignRepo = new Campaign($this->pdo);
        $listeModele  = $modelRepo->listeModele();

        switch ($mode) {
            case 'AO':
            case 'AO_CONTRIB':
                $menuLeft = 'gestionAO';
                $menuActive = Session::verifySessionTypeMenuTop(MenuTopEnum::P2P) ? 'eproc' : 'Consultations';
                $titre = $trad->t('Gestion consultations');
                ArianeSub::generate(1, 0, $trad->t('Import'), $_SERVER['REQUEST_URI'], 1);

                $gestionConsu = new GestionConsultation($this->pdo);
                $consultation = $gestionConsu->getInfoAo($idMode);

                $aoEvent = new AoEvent($this->pdo);
                $AOEventCreat = $aoEvent->getNameCreate($idMode);
                break;

            case 'campagne':
                $menuActive = Session::verifySessionTypeMenuTop(MenuTopEnum::S2C) ? 'Consultations' : 'Evaluations';
                $titre = $trad->t('Campagnes d\'évaluation');
                $campaign = (new CampaignService($this->pdo, $this->getTranslationService()))
                    ->campaignDetail(
                        $idMode,
                        $this->router,
                        $this->droits
                    );

                $subtitle = Trad::strBuild($trad->t('Campagne n°@1@ créée le @2@ par @3@'), $campaign['ID_CAMP'], Date::dateConverte($campaign['DTECREAT']), $campaign['CREATOR']);
                $deleteMessage = $trad->t('Voulez-vous supprimer la campagne @1@ ?');

                ArianeSub::generate(1, 0, $trad->t('Import'), $_SERVER['REQUEST_URI'], 1);
                break;

            // on vérifie le type de campagne (ID_GRILLE) et s'il s'agit d'une campagne multisociete (TOUTESTE)

            // on ne présente que les modèles multisociété ou qui contiennent le code société


            case 'modele':
                $menuActive = Session::verifySessionTypeMenuTop(MenuTopEnum::S2C) ? 'Consultations' : 'Evaluations';
                $titre = $trad->t('Gestion modèles');
                ArianeSub::generate(1, 0, $trad->t('Import'), $_SERVER['REQUEST_URI'], 1);
                break;

            default:
                break;
        }

        return $this->renderer->render('@Evaluation/Import/Bibliotheque/importModele', [
            'menuLeft' => $menuLeft ?? '',
            'menuActive' => $menuActive ?? '',
            'mode' => $mode,
            'idMode' => $idMode,
            'consultation' => $consultation ?? '',
            'campaign' => $campaign ?? [],
            'AOEventCreat' => $AOEventCreat ?? '',
            'titre' => $titre ?? '',
            'subtitle' => $subtitle ?? '',
            'listeModele' => $listeModele,
            'pathBack' => $this->router->generateUri('Evaluation.BibliothequeDeQuestions.gestionBibliotheque', ['mode' => $mode, 'idCamp' => $idMode]),
            'deleteMessage' => $deleteMessage ?? '',
        ]);
    }

    /**
     * importModeleAction
     *
     * @return string|Response
     */
    public function importModeleAction()
    {
        $idMode   = $this->request->getAttribute('idMode');
        $mode     = $this->request->getAttribute('mode');
        $idModele = $this->request->getAttribute('idModele');

        $xmlResult = '';
        if ($mode == 'AO' || $mode == 'AO_CONTRIB') {
            $consultationWSDL = new Consultation();
            $xmlResult        = $consultationWSDL->importModele($idMode, $idModele);
            $reponse          = new \SimpleXMLElement($xmlResult->responseData);

            if ($reponse->Statut == "O") {
                return new Response(443, [], (string) \json_encode([
                    'statut' => 'O',
                    'path' => $this->router->generateUri('Evaluation.BibliothequeDeQuestions.gestionBibliotheque', ['mode' => $mode, 'idCamp' => $idMode]),
                    'post' => []
                ]));
            } else {
                return $this->renderer->render('@popup-erreur/ErreurCreation', [
                    'ErreurValid' => $reponse->MsgErreur,
                ]);
            }
        } else {
            $importQuiz = new ImportQuiz($this->pdo);

            $importQuiz->importQuizFromModel($idMode, $idModele);

            // une fois qu'on a importé le modèle, on importe les groupes d'évaluateurs associés
            (new ImportService($this->pdo))->importGroupsOfRaters($mode, $idMode, 'model', $idModele);

            // puis on importe les filtres du modèle dans la campagne
            $importQuiz->importFiltersFromModel($idMode, $idModele);

            return new Response(443, [], (string) \json_encode([
                'statut' => 'O',
                'path' => $this->router->generateUri('Evaluation.BibliothequeDeQuestions.gestionBibliotheque', ['mode' => $mode, 'idCamp' => $idMode]),
                'post' => []
            ]));
        }
    }

    public function treeviewBibliothequeAction(): string
    {
        $idMode       = $this->request->getAttribute('idMode');
        $mode         = $this->request->getAttribute('mode');
        $idThemeCible = $this->request->getAttribute('idThemeCible');
        $typeImport   = $this->request->getAttribute('typeImport');
        $post         = $this->request->getParsedBody();

        $trad = $this->getTranslationService();
        switch ($mode) {
            case 'AO':
            case 'AO_CONTRIB':
                $menuLeft = 'gestionAO';
                $menuActive = Session::verifySessionTypeMenuTop(MenuTopEnum::P2P) ? 'eproc' : 'Consultations';
                $titre = $trad->t('Gestion consultations');
                ArianeSub::generate(1, 0, $trad->t('Import'), $_SERVER['REQUEST_URI'], 1);

                $gestionConsu = new GestionConsultation($this->pdo);
                $consultation = $gestionConsu->getInfoAo($idMode);

                $aoEvent = new AoEvent($this->pdo);
                $AOEventCreat = $aoEvent->getNameCreate($idMode);
                break;

            case 'modele':
                $menuActive = Session::verifySessionTypeMenuTop(MenuTopEnum::S2C) ? 'Consultations' : 'Evaluations';
                $modelRepository = new Model($this->pdo);
                $model = $modelRepository->modelDetail($idMode);
                $titre = $trad->t('Gestion modèles');
                $subtitle = Trad::strBuild($trad->t('Modèle @1@ créé le @2@ par @3@'), $model['LIB_MODEL'], Date::dateConverte($model['DTE_CREAT']), $model['CREATOR']);
                ArianeSub::generate(1, 0, $trad->t('Import'), $_SERVER['REQUEST_URI'], 1);

                break;

            case 'campagne':
                $menuActive = Session::verifySessionTypeMenuTop(MenuTopEnum::S2C) ? 'Consultations' : 'Evaluations';
                $titre = $trad->t('Campagnes d\'évaluation');
                $campaign = (new CampaignService($this->pdo, $this->getTranslationService()))
                    ->campaignDetail(
                        $idMode,
                        $this->router,
                        $this->droits
                    );


                $subtitle = Trad::strBuild(
                    $trad->t('Campagne n°@1@ créée le @2@ par @3@'),
                    $campaign['ID_CAMP'],
                    Date::dateConverte($campaign['DTECREAT']),
                    $campaign['CREATOR']
                );
                $deleteMessage = $trad->t('Voulez-vous supprimer la campagne @1@ ?');
                ArianeSub::generate(1, 0, $trad->t('Import'), $_SERVER['REQUEST_URI'], 1);

                break;
            default:
                break;
        }

        $repositoryBibliotheque = new BibliothequeDeQuestions($this->pdo);
        $listeQuestion          = $repositoryBibliotheque->listeTreeQuestion('question');

        $treeView           = new treeview();
        $bibliothqueService = new BibliothequeService();

        $treeBibliotheque = $bibliothqueService->treeBibliotheque(
            '',
            $listeQuestion,
            $post,
            (
                $typeImport == 'T'
                ? $this->contenaire->get('baseUrl') . 'IconeV2/Global/download.svg'
                : ''
            )
        );
        $treeBibliotheque = $treeView->array_filter_and_tags($treeBibliotheque);

        return $this->renderer->render('@Evaluation/Import/Bibliotheque/importBibliotheque', [
            'menuLeft' => $menuLeft ?? '',
            'menuActive' => $menuActive ?? '',
            'titre' => $titre ?? '',
            'subtitle' => $subtitle ?? '',
            'typeImport' => $typeImport ?? '',
            'consultation' => $consultation ?? '',
            'campaign' => $campaign ?? [],
            'modele' => $model ?? [],
            'AOEventCreat' => $AOEventCreat ?? '',
            'tree' => $treeBibliotheque,
            'mode' => $mode,
            'idMode' => $idMode,
            'idThemeCible' => $idThemeCible,
            'pathBack' => $this->router->generateUri('Evaluation.BibliothequeDeQuestions.gestionBibliotheque', ['mode' => $mode, 'idCamp' => $idMode]),
            'deleteMessage' => $deleteMessage ?? '',
        ]);
    }

    public function ajaxDetailThemeAction(): string
    {
        $idMode       = $this->request->getAttribute('idMode');
        $mode         = $this->request->getAttribute('mode');
        $idTheme      = $this->request->getAttribute('idTheme');
        $typeImport   = $this->request->getAttribute('typeImport');
        $idThemeCible = $this->request->getAttribute('idThemeCible');
        $post         = $this->request->getParsedBody();

        $bibQstTh  = new BibQstTh($this->pdo);
        $infoTheme = $bibQstTh->find($idTheme);

        $bibQstQ                = new BibQstQ($this->pdo);
        $repositoryBibliotheque = new BibliothequeDeQuestions($this->pdo);

        if ($mode == 'AO') {
            $listeQuestion = $repositoryBibliotheque->questionsListForImportRfx($idTheme);
        } else {
            $listeQuestion = $bibQstQ->fetchAll([], ['filter_egal_ID_THEME' => $idTheme]);
        }

        $listeTmp = json_decode($post['data']);

        foreach ($listeTmp as $data) {
            $listDataSelect[] = $data->value;
        }
        return $this->renderer->render('@Evaluation/Import/Bibliotheque/ajaxImportBibliotheque', [
            'infoTheme' => $infoTheme,
            'idThemeCible' => $idThemeCible,
            'idMode' => $idMode,
            'typeImport' => $typeImport,
            'mode' => $mode,
            'listeQuestion' => $listeQuestion,
            'listDataSelect' => $listDataSelect ?? [],
        ]);
    }

    /**
     * ajaxAjoutAction
     *
     * @return string|Response
     */
    public function ajaxAjoutAction()
    {
        $idMode       = $this->request->getAttribute('idMode');
        $mode         = $this->request->getAttribute('mode');
        $idTheme      = $this->request->getAttribute('idTheme'); // le thème que l'on veut importer
        $typeImport   = $this->request->getAttribute('typeImport');
        $idThemeCible = $this->request->getAttribute('idThemeCible'); // le thème dans lequel on veut éventuellement importer
        $post         = $this->request->getParsedBody();
        $trad         = $this->getTranslationService();

        $importService = new ImportService($this->pdo);

        if ($idTheme == '_NoTheme') {
            $idTheme = '';
        }

        $xmlResult = '';
        switch ($mode) {
            case 'AO_CONTRIB':
            case 'AO':
                if ($typeImport == 'Q') {
                    $listeTmp = json_decode($post['data']);
                    foreach ($listeTmp as $data) {
                        if (strpos($data->name, 'tokenCSRF') !== 0) {
                            $listDataSelect[] = $data->value;
                        }
                    }
                }

                $consultationWSDL = new Consultation();
                $xmlResult = $consultationWSDL->importBibliotheque(
                    $idMode,
                    $typeImport,
                    $idThemeCible,
                    $idTheme,
                    $listDataSelect ?? [],
                    $mode == 'AO'
                );
                break;

            case 'modele':
                $importQuiz = new ImportQuiz($this->pdo);

                if ($typeImport == 'Q') {
                    $listDataSelect = [];
                    $listeTmp       = json_decode($post['data']);
                    foreach ($listeTmp as $data) {
                        if (strpos($data->name, 'tokenCSRF') !== 0) {
                            $listDataSelect[] = $data->value;
                        }
                    }
                    $importQuiz->importQuestionsFromLibrary($mode, $idMode, $idThemeCible, $listDataSelect);

                    // une fois qu'on a importé les questions, on importe les groupes de noteurs associés
                    $importService->importGroupsOfRaters($mode, $idMode, 'library', '', $listDataSelect);

                    $message = $trad->t('Les questions ont bien été importées.');

                    return $this->renderer->render('@popup-erreur/information', [
                        'message' => $message,
                    ]);
                }

                $importQuiz->importThemeFromLibrary($mode, $idMode, $idTheme, $idThemeCible ?? '');

                // une fois qu'on a importé le thème, on importe les groupes de noteurs associés
                $importService->importGroupsOfRaters($mode, $idMode, 'library', $idTheme, []);

                $message = $trad->t('Le thème a bien été importé.');

                return $this->renderer->render('@popup-erreur/information', [
                    'message' => $message,
                ]);


            case 'campagne':
                $importQuiz = new ImportQuiz($this->pdo);

                if ($typeImport == 'Q') {
                    $listDataSelect = [];
                    $listeTmp       = json_decode($post['data']);
                    foreach ($listeTmp as $data) {
                        if (strpos($data->name, 'tokenCSRF') !== 0) {
                            $listDataSelect[] = $data->value;
                        }
                    }

                    if (count($listDataSelect) > 0) {
                        $importQuiz->importQuestionsFromLibrary($mode, $idMode, $idThemeCible, $listDataSelect);

                        // une fois qu'on a importé les questions, on importe les groupes de noteurs associés
                        $importService->importGroupsOfRaters($mode, $idMode, 'library', '', $listDataSelect);

                        return $this->renderer->render('@popup-erreur/information', [
                            'message' => $trad->t('Les questions ont bien été importées.'),
                        ]);
                    } else {
                        return new Response(443, [], $trad->t(
                            'Vous devez sélectionner au moins une question.',
                        ));
                    }
                }

                $importQuiz->importThemeFromLibrary($mode, $idMode, $idTheme, $idThemeCible ?? '');

                // une fois qu'on a importé le thème, on importe les groupes de noteurs associés
                $importService->importGroupsOfRaters($mode, $idMode, 'library', $idTheme, []);

                return $this->renderer->render('@popup-erreur/information', [
                    'message' => $trad->t('Le thème a bien été importé.'),
                ]);

            default:
                break;
        }

        if ($typeImport == 'T') {
            $message = $trad->t('Le thème a bien été importé.');
        } else {
            $message = $trad->t('Les questions ont bien été importées.');
        }

        // @phpstan-ignore-next-line
        $reponse = new \SimpleXMLElement($xmlResult->responseData);
        if ($reponse->Statut == "O") {
            return $this->renderer->render('@popup-erreur/information', [
                'uriRetour' => $this->router->generateUri('Evaluation.BibliothequeDeQuestions.gestionBibliotheque', ['mode' => $mode, 'idCamp' => $idMode]),
                'message' => $message,
            ]);
        } else {
            return $this->renderer->render('@popup-erreur/ErreurCreation', [
                'ErreurValid' => $reponse->MsgErreur,
            ]);
        }
    }
}
