<?php

namespace Modules\ProjetAchat\Controller;

use Skeleton\Controller\Controller;
use Helpers\Trad\Trad;
use Modules\ProjetAchat\Repository\Action;
use Entity\Model\DoaActionsActeurs;
use Modules\ProjetAchat\Service\ModeleProjetService;
use Helpers\Validator\Validator;
use GuzzleHttp\Psr7\Response;
use Skeleton\Renderer\RendererInterface;
use Skeleton\Router;
use Psr\Container\ContainerInterface;
use Modules\ProjetAchat\Service\ElementsConcernedService;
use Entity\Model\DoaTaches;
use Entity\Model\DoaAction;

class ActionActorController extends Controller
{
    
    public function createEditAction() : string
    {
        $idObjet = $this->request->getAttribute('idObjet');
        $typeObjet = $this->request->getAttribute('typeObjet');
        $idTasks  = $this->request->getAttribute('idTasks');
        $idAction = $this->request->getAttribute('idAction');
        $idActor = $this->request->getAttribute('idActor');

        
        $actionRepo = new Action($this->pdo);
        $doaActeursActions = new DoaActionsActeurs($this->pdo);
        $elementConcernedService = new ElementsConcernedService($this->pdo, $this->getTranslationService());
        $listObjet = $elementConcernedService->generateArrayElementConcerned();
        
        $trad = $this->getTranslationService();

        if (!$actionRepo->actorResponsableExist($typeObjet, $idObjet, $idTasks, $idAction)) {
            $listeRole['R'] = $trad->t('Responsable');
            $actor['ROLE'] = 'R';
        } else {
            $actor['ROLE'] = 'A';
        }

        if ($idActor) {
            $actor = $doaActeursActions->find($idActor);

            if ($actor['ROLE'] == 'R') {
                $listeRole['R'] = $trad->t('Responsable');
            }
            
            $modeleProjetService = new ModeleProjetService($this->pdo);
            $actionRepo = new Action($this->pdo);

            if (!(strpos($actor['TYPE_ELEM'], 'CS_') == 0)) {
            }
            $listeElemTmp = $actionRepo->getListeValueDeclencheur($idObjet, $actor['TYPE_ELEM']);
            
            $listeElem = [];
            foreach ($listeElemTmp as $elem) {
                $listeElem[$elem['ID_ELEM']] = $modeleProjetService->generateLibelleTypeElement($elem['TYPE_ELEM'], $elem['ID_ELEM']);
            }
            
            $listeTypeActeur = $modeleProjetService->generateListTypeActeur($actor['TYPE_ELEM'], $trad);
        }
        
        $listeRole['A'] = $trad->t('Acteur');
        $listeRole['C'] = $trad->t('Contributeur');
        $listeRole['I'] = $trad->t('Informé');

        $listeDeclencheurTmp = $actionRepo->getListeDeclencheurProjet($idObjet);
        
        $listeDeclencheur = [];
        
        if ($typeObjet == 'M') {
            $listeDeclencheur['1'] = $trad->t('Propriétaire du projet');
            $listeDeclencheur['2'] = $trad->t('Prescripteur du projet');
        }
        
        // SPEC 4620 : ajout de déclencheur Responsable de la tâche (visible après Propriétaire et Prescripteur pour les modèles, et avant les éléments concernés pour les projets)
        $listeDeclencheur['3'] = $trad->t('Responsable de la tâche');

        if ($typeObjet == 'M') {
            $modeleProjetService = new ModeleProjetService($this->pdo);
            $listeTypeActeur2 = $modeleProjetService->generateListTypeActeur('DOA', $trad);
            
            if ($listeTypeActeur2) {
                foreach ($listeTypeActeur2 as $key => $acteur) {
                    $numFix = explode('|', $key);
                    $listeDeclencheur['CS_'.$numFix[1]] = $trad->t($acteur);
                }
            }
        }
        
        foreach ($listeDeclencheurTmp as $declencheur) {
            $listeDeclencheur[$declencheur['TYPE_ELEM']] = $listObjet[$declencheur['TYPE_ELEM']]??$declencheur['TYPE_ELEM'];
        }

        return $this->renderer->render('@projetAchat/action/tabs/createEditActor', [
            'idObjet'           => $idObjet,
            'typeObjet'         => $typeObjet,
            'idAction'          => $idAction,
            'idTasks'           => $idTasks,
            'idActor'           => $idActor,
            'listeRole'         => $listeRole,
            'actor'             => $actor??[],
            'listeDeclencheur'  => $listeDeclencheur,
            'listeTypeActeur'   => $listeTypeActeur,
            'listeElem'         => $listeElem,
        ]);
    }
    
    public function ajaxGenerateInputAction() : string
    {
        $idObjet = $this->request->getAttribute('idObjet');
        $typeObjet = $this->request->getAttribute('typeObjet');
        
        $post = $this->request->getParsedBody();
        $trad = $this->getTranslationService();
        
        $modeleProjetService = new ModeleProjetService($this->pdo);
        $actionRepo = new Action($this->pdo);
        $listeElemTmp = $actionRepo->getListeValueDeclencheur($idObjet, $post['TYPE_ELEM']);
        
        $listeElem = [];
        foreach ($listeElemTmp as $elem) {
            $listeElem[$elem['ID_ELEM']] = $modeleProjetService->generateLibelleTypeElement($elem['TYPE_ELEM'], $elem['ID_ELEM']);
        }
        
        $listeTypeActeur = $modeleProjetService->generateListTypeActeur($elem['TYPE_ELEM']??'', $trad);

        return $this->renderer->render('@projetAchat/action/tabs/ajaxGenerateInputActor', [
            'idObjet' => $idObjet,
            'typeObjet' => $typeObjet,
            'listeElem' => $listeElem,
            'listeTypeActeur' => $listeTypeActeur
        ]);
    }
    
    public function validateAction()
    {
        $idObjet = $this->request->getAttribute('idObjet');
        $typeObjet = $this->request->getAttribute('typeObjet');
        $idTasks  = $this->request->getAttribute('idTasks');
        $idAction = $this->request->getAttribute('idAction');
        $idActor = $this->request->getAttribute('idActor');
        
        $post = $this->request->getParsedBody();
        $trad = $this->getTranslationService();
        
        $validator = $this->createValidator();
        
        $post['EMAIL'] = $post['EMAIL']??'';
        
        $validator->zoom('Hastutil', ($post['CODE_ACTEUR']??''), $trad->t('Utilisateur'), $this->pdo, true);
        $validator->adresseMail($trad->t('Mail'), $post['EMAIL'], 0, 100);
        $validator->isFalse(($post['CODE_ACTEUR'] || $post['EMAIL'] || $post['TYPE_ELEM']), $trad->t('Vous devez sélectionner soit un utilisateur, soit un mail, soit un déclencheur.'));
        
        if ($validator->isValid()) {
            $actor = [
                'TYPE_OBJET'    => $typeObjet,
                'ID_OBJET'      => $idObjet,
                'ID_TACHE'      => $idTasks,
                'ID_ACTION'     => $idAction,
                'ROLE'          => $post['ROLE']??'',
                'CODE_ACTEUR'   => $post['CODE_ACTEUR']??'',
                'EMAIL'         => $post['EMAIL']??'',
                'TYPE_ELEM'     => $post['TYPE_ELEM']??'',
                'ID_ELEM'       => $post['ID_ELEM']??'',
                'TYPE_ACTEUR'   => $post['TYPE_ACTEUR']??'',
            ];
            
            $doaActionActorEntity = new DoaActionsActeurs($this->pdo);
            
            $doaTasksEntity = new DoaTaches($this->pdo);
            $libTasks = $doaTasksEntity->find($idTasks)['LIB']??'';

            $doaActionEntity = new DoaAction($this->pdo);
            $libAction = $doaActionEntity->find($idAction)['LIB']??'';
            
            if ($idActor) {
                $doaActionActorEntity->update($actor, $idActor);
                $commentaire = Trad::strBuild(('Modification d\'un RACI sur l\'action : @1@ de la tâche : @2@'), $libAction, $libTasks);
            } else {
                $doaActionActorEntity->insert($actor);
                $commentaire = Trad::strBuild(('Ajout d\'un RACI sur l\'action : @1@ de la tâche : @2@'), $libAction, $libTasks);
            }
            
            ModeleProjetService::updateDoaEvent($this->pdo, $idObjet, $typeObjet, $commentaire);
            
            return new Response(200, [
                
            ], (string) \json_encode([
                'statut' => 'O',
                'path' => $this->router->generateUri('ProjetAchat.Action.showDetail', ['typeObjet' => $typeObjet, 'idObjet' => $idObjet, 'idAction' => $idAction]),
                'post' => ['onglet' => 'acterAction']
            ]));
        } else {
            return new Response(200, [
                
            ], (string) \json_encode([
                'statut' => 'E',
                'content' => $this->renderer->render('@popup-erreur/ErreurCreation', [
                    'ErreurValid' => $validator->getError(),
                ])
            ]));
        }
    }
    
    public function deleteAction()
    {
        $idObjet = $this->request->getAttribute('idObjet');
        $typeObjet = $this->request->getAttribute('typeObjet');
        $idAction = $this->request->getAttribute('idAction');
        $idActor = $this->request->getAttribute('idActor');
        
        $doaActionActorEntity = new DoaActionsActeurs($this->pdo);
        $actor = $doaActionActorEntity->find($idActor);
        $doaActionActorEntity->delete($idActor);
        
        $doaTasksEntity = new DoaTaches($this->pdo);
        $libTasks = $doaTasksEntity->find($actor['ID_TACHE'])['LIB']??'';
        
        $doaActionEntity = new DoaAction($this->pdo);
        $libAction = $doaActionEntity->find($idAction)['LIB']??'';
        $trad = $this->getTranslationService();
        
        $commentaire = Trad::strBuild(('Suppression d\'un RACI sur l\'action : @1@ de la tâche : @2@'), $libAction, $libTasks);
        
        ModeleProjetService::updateDoaEvent($this->pdo, $idObjet, $typeObjet, $commentaire);
        
        return new Response(200, [
            
        ], (string) \json_encode([
            'statut' => 'O',
            'path' => $this->router->generateUri('ProjetAchat.Action.showDetail', ['typeObjet' => $typeObjet, 'idObjet' => $idObjet, 'idAction' => $idAction]),
            'post' => ['onglet' => 'acterAction']
        ]));
    }
}
