<?php

namespace Modules\ProjetAchat\Controller;

use Modules\ProjetAchat\Service\CategorieService;
use Psr\Container\ContainerInterface;
use Skeleton\Controller\Controller;
use Helpers\Ariane\Ariane;
use Helpers\Trad\Trad;
use Skeleton\Renderer\RendererInterface;
use Skeleton\Router;
use \Tamtamchik\SimpleFlash\Flash;
use GuzzleHttp\Psr7\Response;
use Modules\ProjetAchat\Repository\BibliothequeDonnee;
use Modules\ProjetAchat\Service\ModeleProjetService;
use Entity\Model\DoarCat;

class CategorieController extends Controller
{
    /**
     * @var CategorieService $categorieService
     */
    private $categorieService;

    /**
     * @var Flash $flash
     */
    private $flash;

    /**
     * CategorieController constructor.
     * @param RendererInterface $renderer
     * @param \PDO $pdo
     * @param Router $router
     * @param ContainerInterface $contenaire
     */
    public function __construct(RendererInterface $renderer, \PDO $pdo, Router $router, ContainerInterface $contenaire)
    {
        parent::__construct($renderer, $pdo, $router, $contenaire);
        $this->categorieService = new CategorieService($this->pdo);
        $this->flash = new Flash();
    }

    /**
     * @return Response|string
     */
    public function createAction()
    {
        $post = $this->request->getParsedBody();
        $idParent = $this->request->getAttribute('idParent');
        $typeObject = $this->request->getAttribute('typeObject');
        $idObject = $this->request->getAttribute('idObject');
        $isParent = $this->request->getAttribute('isParent');
        $trad = $this->getTranslationService();

        if (! empty($post)) {
            $validator = $this->validateCategory($post);
            if ($validator->isValid()) {
                $commentaire = trad::strBuild(('Ajout de la catégorie de données : @1@.'), $post['LIB']);
                ModeleProjetService::updateDoaEvent($this->pdo, $idObject, $typeObject, $commentaire);
                
                $this->categorieService->createCategory([
                    'TYPE_OBJET'    => $typeObject,
                    'ID_OBJET'      => $idObject,
                    'ID_PARENT'     => $idParent ?? 0,
                    'LIB'           => $post['LIB'],
                    'DESCR'         => $post['DESCR'],
                    'NUM_ORDRE'     => $this->categorieService->getRightOrder((int) $idParent, $typeObject)
                ]);
                
                $this->flash->message(("La catégorie de données a été créée avec succès"), "success");
                
                if ("B" === $typeObject) {
                    return $this->customRedirect('ProjetAchat.BibliothequeDonnee.index');
                } else {
                    return $this->customRedirect('ProjetAchat.ModeleProjet.details', ['typeObjet' => $typeObject,'idObjet' => $idObject], ['onglet' =>  'data', 'id' => '' ]);
                }
            } else {
                return $this->renderer->render('@popup-erreur/ErreurCreation', [
                    'ErreurValid' => $validator->getError(),
                ]);
            }
        }
        
        if ("B" === $typeObject) {
            $cancePath = $this->router->generateUri('ProjetAchat.BibliothequeDonnee.index');
        } else {
            $cancePath = $this->router->generateUri('ProjetAchat.ModeleProjet.details', ['typeObjet' => $typeObject,'idObjet' => $idObject]);
        }

        Ariane::generate(2, $trad->t('Ajout catégorie de données'), $post);

        return $this->renderer->render('@categorie/createedit', [
            'menuActive'            => 'ProjetAchat',
            'action'                => 'create',
            'category'              => $idParent ? $this->categorieService->findCategory($idParent) : [],
            'idCategory'            => null,
            'flash'                 => $this->flash,
            'typeObject'            => $typeObject,
            'idObject'              => $idObject,
            'idParent'              => $idParent,
            'isParent'              => $isParent,
            'cancelPath'            => $cancePath,
            'refCategory'           => [
                'ref'   => $idParent ? $this->categorieService->findCategory($idParent) : [],
                'type'  => (int) $idParent === 1 ? 'parent' : 'sister'
            ]
        ]);
    }

    /**
     * @return Response|string
     */
    public function editAction()
    {
        $post = $this->request->getParsedBody();
        $idCategory = $this->request->getAttribute('idCategorie');
        $typeObject = $this->request->getAttribute('typeObject');
        $category = $this->categorieService->findCategory($idCategory);
        $trad = $this->getTranslationService();

        if ($post) {
            $validator = $this->validateCategory($post);
            if ($validator->isValid()) {
                $this->categorieService->updateCategory([
                    'LIB' => $post['LIB'],
                    'DESCR' => $post['DESCR']
                ], $idCategory);
                
                $this->flash->message($trad->t("La catégorie de données a été modifiée avec succès"), "success");

                $commentaire = trad::strBuild(('Modification de la catégorie de données : @1@.'), $post['LIB']);
                ModeleProjetService::updateDoaEvent($this->pdo, $category['ID_OBJET'], $category['TYPE_OBJET'], $commentaire);
                
                if ("B" === $category['TYPE_OBJET']) {
                    return $this->customRedirect('ProjetAchat.BibliothequeDonnee.index');
                } else {
                    return $this->customRedirect('ProjetAchat.ModeleProjet.details', ['typeObjet' => $category['TYPE_OBJET'],'idObjet' => $category['ID_OBJET']], ['onglet' =>  'data', 'id' => $idCategory]);
                }
            } else {
                return $this->renderer->render('@popup-erreur/ErreurCreation', [
                    'ErreurValid' => $validator->getError(),
                ]);
            }
        }
        
        if ("B" === $typeObject) {
            $cancePath = $this->router->generateUri('ProjetAchat.BibliothequeDonnee.index');
        } else {
            $cancePath = $this->router->generateUri('ProjetAchat.ModeleProjet.details', ['typeObjet' => $category['TYPE_OBJET'],'idObjet' => $category['ID_OBJET']]);
        }

        Ariane::generate(2, $trad->t('Modifier une catégorie de données'), $post);

        return $this->renderer->render('@categorie/createedit', [
            'menuActive'            => 'ProjetAchat',
            'action'                => 'edit',
            'category'              => $category,
            'idCategory'            => $idCategory,
            'flash'                 => $this->flash,
            'cancelPath'            => $cancePath,
        ]);
    }
    
    public function deleteAction()
    {
        $typeObjet = $this->request->getAttribute('typeObject');
        $idObjet = $this->request->getAttribute('idObject');
        $idCategorie = $this->request->getAttribute('idCategorie');
        $trad = $this->getTranslationService();
        
        $bibliothequeRepo = new BibliothequeDonnee($this->pdo);
        
        if ($bibliothequeRepo->categorieUtilise($idCategorie)) {
            if ($typeObjet=='B') {
                $nextPath = $this->router->generateUri('ProjetAchat.BibliothequeDonnee.index');
            } else {
                $nextPath = $this->router->generateUri('ProjetAchat.ModeleProjet.details', ['typeObjet' => $typeObjet,'idObjet' => $idObjet]);
                $postPath = "{'onglet' :  'data', 'id' : '' }";
            }
            
            $trad = $this->getTranslationService();
            
            return new Response(
                443,
                [],
                $this->renderer->render('@popup-erreur/confirmationMultiSuppression', [
                    'message' => $trad->t('Souhaitez-vous que les modifications de la bibliothèque soient répercutées ?'),
                    'div'     => 'redirection',
                    'pathURL' => $this->router->generateUri('ProjetAchat.Categorie.deleteHeritage', ['typeObject' => $typeObjet,'idObject' => $idObjet, 'idCategorie' => $idCategorie]),
                    'form'    => '',
                    'nextPath' => $nextPath,
                    'postPath' => $postPath??'',
                ])
            );
        } else {
            $doarCatEntity = new DoarCat($this->pdo);
            $infoCategory = $doarCatEntity->find($idCategorie);
            
            $commentaire = trad::strBuild(('Suppression de la catégorie de données : @1@.'), $infoCategory['LIB']);
            ModeleProjetService::updateDoaEvent($this->pdo, $idObjet, $typeObjet, $commentaire);
            $this->categorieService->deleteCategory($typeObjet, $idObjet, $idCategorie, 2);
    
            if ($typeObjet=='B') {
                $path = $this->router->generateUri('ProjetAchat.BibliothequeDonnee.index');
            } else {
                $path = $this->router->generateUri('ProjetAchat.ModeleProjet.details', [
                    'typeObjet' => $typeObjet,
                    'idObjet' => $idObjet
                ]);
            }
            
            return new Response(200, [
                
            ], (string) \json_encode([
                'path' => $path,
            ]));
        }
    }

    /**
     * @return Response
     */
    public function deleteHeritageAction()
    {
        $typeObjet = $this->request->getAttribute('typeObject');
        $idObjet = $this->request->getAttribute('idObject');
        $idCategorie = $this->request->getAttribute('idCategorie');
        $trad = $this->getTranslationService();
        
        $post = $this->request->getParsedBody();
        $doarCatEntity = new DoarCat($this->pdo);
        $infoCategory = $doarCatEntity->find($idCategorie);
        
        if ('false' === $post['del_foldersInProgress'] && 'false' === $post['del_TemplatesOnly']) {
            $this->categorieService->deleteCategory($typeObjet, $idObjet, $idCategorie, 2);
        } elseif ('true' === $post['del_foldersInProgress']) {
            $this->categorieService->deleteCategory($typeObjet, $idObjet, $idCategorie, 0);
        } elseif ('true' === $post['del_TemplatesOnly']) {
            $this->categorieService->deleteCategory($typeObjet, $idObjet, $idCategorie, 1);
        }

        $commentaire = trad::strBuild(('Suppression de la catégorie de données : @1@.'), $infoCategory['LIB']);
        ModeleProjetService::updateDoaEvent($this->pdo, $idObjet, $typeObjet, $commentaire);
        if ($typeObjet == 'B') {
            return $this->customRedirect('ProjetAchat.BibliothequeDonnee.index');
        } else {
            return $this->customRedirect('ProjetAchat.ModeleProjet.details', ['typeObjet' => $typeObjet,'idObjet' => $idObjet], ['onglet' =>  'data', 'id' => '']);
        }
    }

    public function ajaxReOrderAction()
    {
        $typeObjet = $this->request->getAttribute('typeObject');
        $idObjet = $this->request->getAttribute('idObject');
        $post = $this->request->getParsedBody();
        
        $post['oldParent'] = $post['oldParent']=='#'? '0':$post['oldParent'];
        $post['parent'] = $post['parent']=='#'? '0':$post['parent'];
        
        $this->categorieService->reOrder($typeObjet, $idObjet, $post['idCat'], $post['oldParent'], $post['parent'], $post['old_position'], $post['position']);

        return new Response(200);
    }
    
    /**
     * @param string $path
     * @return Response
     */
    private function customRedirect(string $path, array $params = [], $post = [])
    {
        return new Response(443, [], (string) \json_encode([
            'statut' => 'O',
            'path' => $this->router->generateUri($path, $params),
            'post' => $post,
        ]));
    }

    /**
     * @param array<mixed> $payload
     * @return \Helpers\Validator\Validator
     */
    public function validateCategory(array $payload)
    {
        $validator = $this->createValidator();
        $validator->isStringAvecEspace('Catégorie', $payload['LIB'], 1, 120);
        return $validator;
    }
}
