<?php

namespace Modules\ProjetAchat\Controller;

use Entity\Model\Doa;
use Entity\Model\DoaActionsActeurs;
use Entity\Model\DoaActionsRACI;
use Entity\Model\DoaTacheH;
use Entity\Model\DoaTaches;
use GuzzleHttp\Psr7\Response;
use Helpers\Ariane\Ariane;
use Helpers\Ariane\ArianeSub;
use Helpers\ChampsSupplementaire\ChampSupp;
use Skeleton\Controller\Controller;
use Helpers\Trad\Trad;
use Helpers\Validator\Validator;
use Modules\ProjetAchat\Repository\Acteur;
use Modules\ProjetAchat\Repository\ProjetAchat;
use Modules\ProjetAchat\Service\ModeleProjetService;

class ActeurController extends Controller
{
    public function switchUserAction() : string
    {
        $listeCSUser = [];
        $post = $this->request->getParsedBody();
        $idObjet = $this->request->getAttribute('idProjet');

        $doa = new Doa($this->pdo);
        $projet = $doa->find($idObjet);

        $trad = $this->getTranslationService();

        Ariane::generate(2, $trad->t('Modification d\'acteurs'), $post);

        ArianeSub::init();
        ArianeSub::generate(0, 1, $trad->t('Entête de projet'), $this->router->generateUri('ProjetAchat.Acteur.switchUser', ['idProjet' => $idObjet]), 1);
        ArianeSub::generate(0, 2, $trad->t('Tâches et actions'), $this->router->generateUri('ProjetAchat.Acteur.listeActor', ['idProjet' => $idObjet]), 0);

        $modeleProjetService = new ModeleProjetService($this->pdo);
        $listeTypeActeur = $modeleProjetService->generateListTypeActeur('DOA', $trad);

        if ($listeTypeActeur) {
            foreach ($listeTypeActeur as $key => $acteur) {
                $numFix = explode('|', $key);
                $listeCSUser[] = $numFix[1];
            }
        }

        return $this->renderer->render('@projetAchat/acteur/switchUser', [
            'menuActive'                => 'ProjetAchat',
            'projet'    => $projet,
            'idObjet'   => $idObjet,
            'listeCSUser' => $listeCSUser,
        ]);
    }

    public function confirmationSwitchAction() : string
    {
        $post = $this->request->getParsedBody();
        $idObjet = $this->request->getAttribute('idProjet');

        $trad = $this->getTranslationService();

        $validator = $this->createValidator();
        $validator->zoom('Hastutil', $post['NEW_USER'], $trad->t('Nouvel utilisateur'), $this->pdo, false);

        
        if ($validator->isValid()) {
            $acteurRepo = new Acteur($this->pdo);
            $countTask = $acteurRepo->countResponsableTaskFound($idObjet, $post['OLD_USER'], null, false);
            $countAction = $acteurRepo->countActeurActionFound($idObjet, $post['OLD_USER'], null, false);
    
            $message = Trad::strBuild($trad->t('@1@ responsable(s) de tâche(s) vont être modifié(s) par @2@.'), $countTask['COUNT'], $post['NEW_USER']);
            $message .= ' </br> '.Trad::strBuild($trad->t('@1@ acteur(s) d\'action(s) vont être modifié(s) par @2@.'), $countAction['COUNT'], $post['NEW_USER']);
    
            return $this->renderer->render('@popup-erreur/confirmationSuppresion', [
                'pathURL' => $this->router->generateUri('ProjetAchat.Acteur.ajaxSwitch', ['idProjet' => $idObjet]),
                'message' => $message,
                'div' => 'page',
                'form' => serialize($post)
            ]);
        } else {
            return $this->renderer->render('@popup-erreur/ErreurCreation', [
                'ErreurValid' => $validator->getError(),
                'desactiveRow' => true,
            ]);
        }
    }

    public function ajaxSwitchAction()
    {
        $post = $this->request->getParsedBody();
        $post =  unserialize($post['form'], ["allowed_classes" => false]);
        $idObjet = $this->request->getAttribute('idProjet');

        $projetAchatEntity = new ProjetAchat($this->pdo);

        $oldPoprio = $post['OLD_USER'];
        $newProprio = $post['NEW_USER'];

        if (strpos($post['CHAMPS'], 'CS_') === 0) {
            $numFix = substr($post['CHAMPS'], 3);
            ChampSupp::updateChampSupp('DOA', str_pad($idObjet, 9, '0', STR_PAD_LEFT), $numFix, $post['NEW_USER'], $this->pdo);
        } else {
            $doa = new Doa($this->pdo);
            $doa->update([
                $post['CHAMPS'] => $post['NEW_USER'],
            ], $idObjet);
        }

        $projetAchatEntity->updateResponsableAction($idObjet, $oldPoprio, $newProprio, true);
        $projetAchatEntity->updateResponsableTaches($idObjet, $oldPoprio, $newProprio);
        $projetAchatEntity->updateResponsableRaciAction($idObjet, $oldPoprio, $newProprio, true);

        return new Response(200);
    }

    public function listeActorAction() : string
    {
        $post = $this->request->getParsedBody();
        $idObjet = $this->request->getAttribute('idProjet');

        $trad = $this->getTranslationService();

        $listeRole['R'] = $trad->t('Responsable');
        $listeRole['A'] = $trad->t('Acteur');
        $listeRole['C'] = $trad->t('Contributeur');
        $listeRole['I'] = $trad->t('Informé');


        $doa = new Doa($this->pdo);
        $infoDOA = $doa->find($idObjet);

        $listeActeurEntete[''] = $trad->t('Autre');

        if ($infoDOA['PROPRIETAIRE'] == $infoDOA['PRESCRIPTEUR']) {
            $listeActeurEntete[$infoDOA['PROPRIETAIRE']] = $trad->t('Proprietaire').'/ '.$trad->t('Prescripteur');
        } else {
            $listeActeurEntete[$infoDOA['PROPRIETAIRE']] = $trad->t('Proprietaire');
            $listeActeurEntete[$infoDOA['PRESCRIPTEUR']] = $trad->t('Prescripteur');
        }

        $modeleProjetService = new ModeleProjetService($this->pdo);
        $listeTypeActeur = $modeleProjetService->generateListTypeActeur('DOA', $trad);

        if ($listeTypeActeur) {
            foreach ($listeTypeActeur as $key => $acteur) {
                $numFix = explode('|', $key);
                
                $valCS = ChampSupp::getValueCS('DOA', str_pad($idObjet, 9, '0', STR_PAD_LEFT), $numFix[1], $this->pdo);
                
                if (!$valCS) {
                } elseif (array_key_exists($valCS, $listeActeurEntete)) {
                    $listeActeurEntete[$valCS] = $listeActeurEntete[$valCS].'/ '.$acteur;
                } else {
                    $listeActeurEntete[$valCS] = $acteur;
                }
            }
        }

        $listeReponsable = $listeActeurEntete;

        $listeActeurEntete['EMAIL'] = $trad->t('Email');
        
        $doaTachesH = new DoaTacheH($this->pdo);
        
        $listeTachePere = $doaTachesH->findAll(['TYPE_OBJET' => 'D','ID_OBJET' => $idObjet,'ID_PARENT' => 0], [], ['tri_NUM_ORDRE' => 'asc']);

        ArianeSub::generate(0, 2, $trad->t('Tâches et actions'), $this->router->generateUri('ProjetAchat.Acteur.listeActor', ['idProjet' => $idObjet]), 1);

        return $this->renderer->render('@projetAchat/acteur/listeActeur', [
            'menuActive'                => 'ProjetAchat',

            'listeTachePere' => $listeTachePere,
            'idObjet'   => $idObjet,
            'listeRole' => $listeRole,
            'projet' => $infoDOA,
            'listeActeurEntete' => $listeActeurEntete,
            'listeReponsable' => $listeReponsable,
        ]);
    }
    
    public function ajaxRemplacerAction() : string
    {
        $post = $this->request->getParsedBody();
        $idObjet = $this->request->getAttribute('idProjet');

        $trad = $this->getTranslationService();

        $validator = $this->createValidator();
        $validator->zoom('Hastutil', $post['REMPLACER_PAR'], $trad->t('Remplacer par'), $this->pdo, true);
        
        $tacheSelected = [];
        $acteurSelected = [];
        $listeSelected = [];
        foreach ($post as $key => $val) {
            if (strpos($key, 'seleced-') === 0) {
                $explodKey = explode('-', $key);
                if ($explodKey[1] == 'TACHE') {
                    $tacheSelected[] = $explodKey[2];
                } else {
                    $acteurSelected[] = $explodKey[2];
                }
                $listeSelected[] = $key;
            }
        }

        if ($validator->isValid()) {
            $acteurRepo = new Acteur($this->pdo);
            $countTask = $acteurRepo->countResponsableTaskFound($idObjet, $post['RECHERCHE'], $tacheSelected, true);
            $countAction = $acteurRepo->countActeurActionFound($idObjet, $post['RECHERCHE'], $acteurSelected, true);

            $message = Trad::strBuild($trad->t('@1@ responsable(s) de tâche(s) selectionné(s), @2@ vont être modifié(s) par @3@.'), count($tacheSelected), $countTask['COUNT'], $post['REMPLACER_PAR']);
            $message .= ' </br> '.Trad::strBuild($trad->t('@1@ acteur(s) d\'action(s) selectionné(s), @2@ vont être modifié(s) par @3@.'), count($acteurSelected), $countAction['COUNT'], $post['REMPLACER_PAR']);
            
            return $this->renderer->render('@popup-erreur/confirmationSuppresion', [
                'pathURL' => $this->router->generateUri('ProjetAchat.Acteur.ajaxConfirmationRemplacer', ['idProjet' => $idObjet]),
                'message' => $message,
                'div' => 'page',
                'form' => serialize([
                    'tacheSelected' => $tacheSelected,
                    'acteurSelected' => $acteurSelected,
                    'RECHERCHE' => $post['RECHERCHE'],
                    'REMPLACER_PAR' => $post['REMPLACER_PAR'],
                ])
            ]);
        } else {
            return $this->renderer->render('@popup-erreur/ErreurCreation', [
                'ErreurValid' => $validator->getError(),
                'desactiveRow' => true,
            ]);
        }
    }

    public function ajaxConfirmationRemplacerAction()
    {
        $post = $this->request->getParsedBody();
        $idObjet = $this->request->getAttribute('idProjet');

        $arraySelected =  unserialize($post['form'], ["allowed_classes" => false]);

        $acteurRepo = new Acteur($this->pdo);
        $acteurRepo->updateResponsableTask($idObjet, $arraySelected['RECHERCHE'], $arraySelected['REMPLACER_PAR'], $arraySelected['tacheSelected']);
        $acteurRepo->updateActorAction($idObjet, $arraySelected['RECHERCHE'], $arraySelected['REMPLACER_PAR'], $arraySelected['acteurSelected']);

        return new Response(200);
    }

    public function ajaxUpdateActeurAction()
    {
        $post = $this->request->getParsedBody();

        $champExplode = explode('-', $post['codeChps']);

        if ($champExplode[1] == 'TACHE') {
            $doaTache = new DoaTaches($this->pdo);
            $doaTache->update([
                'RESPONSABLE' => $post['value'],
            ], $champExplode[2]);
        } elseif ($champExplode[1] == 'ACTEUR') {
            $doaActionsRACI = new DoaActionsActeurs($this->pdo);
            $doaActionsRACI->update([
                'CODE_ACTEUR' => $champExplode[0]=='ZOOM'? $post['value']:'',
                'EMAIL' => $champExplode[0]=='ZOOM'? '':$post['value'],
            ], $champExplode[2]);
        }

        return new Response(200);
    }
}
