<?php

namespace Modules\Reception\Controller;

use GuzzleHttp\Psr7\Response;
use Helpers\Fichier\Fichier;
use Modules\Reception\Service\CreationBRService;
use Skeleton\Controller\Controller;

class DocumentController extends Controller
{
    /**
     * enregistrementAjoutDocAttAction
     *
     * @return Response
     */
    public function saveNewDocAction()
    {
        $post = $this->request->getParsedBody();
        $id = $this->request->getAttribute('id');
        $NO_DA = $this->request->getAttribute('NO_DA');

        return $this->_checkFile($post, $id, $NO_DA, false);
    }

    /**
     * enregistrementEditDocAttAction
     *
     * @return Response
     */
    public function saveEditDocAction()
    {
        $post = $this->request->getParsedBody();
        $id = $this->request->getAttribute('id');
        $NO_DA = $this->request->getAttribute('NO_DA');

        return $this->_checkFile($post, $id, $NO_DA, true);
    }

    /**
     * _checkFile
     *
     * @param  array<mixed> $post
     * @param  string $id
     * @param  string $NO_DA
     * @param  bool $modif
     * @return Response
     */
    private function _checkFile(array $post, string $id, string $NO_DA, bool $modif)
    {
        $trad = $this->getTranslationService();

        /** On verifie les champs **/
        $validator = $this->createValidator();

        $validator->isStringAvecEspace($trad->t('Titre'), $post['ajout-titre'], 1, 60);

        if (isset($post['ajout-auteur'])) {
            $validator->zoom('HASTUTIL', $post['ajout-auteur'], $trad->t('Auteur'), $this->pdo, false);
        } else {
            $validator->zoom('HASTUTIL', $post['text_AUTEUR'], $trad->t('Auteur'), $this->pdo, false);
        }

        $validator->zoom('Centre', $post['ajout-centre'], $trad->t('Centre'), $this->pdo, true);

        if ($post['ajout-dt_paru']) {
            $validator->isDate($post['ajout-dt_paru'], '', '', false, $trad->t('de parution'));
        }
        if ($post['ajout-dt_vali']) {
            $validator->isDate($post['ajout-dt_vali'], '', '', false, $trad->t('fin de validité'));
        }

        if ($post['ajout-dt_vali'] != '') {
            $validator->isTrue(
                $post['ajout-dt_paru'] > $post['ajout-dt_vali'],
                $trad->t('La date de parution ne peut pas être supérieure à la date de fin de validité.')
            );
        }

        $validator->isCheck($post['ajout-pj_commande']);
        $validator->isStringAvecEspace($trad->t('Commentaire'), $post['ajout-com'], 0, 3000);

        $file = $this->request->getUploadedFiles();
        if ($modif) {
            $docAtt = (new CreationBRService($this->pdo, $this->getTranslationService()))
                ->getInfoDoc($post['idDocBr']);
        }

        // si modification d'un document rattaché à un BR en cours de création, on ne contrôle pas l'existence du fichier car il est 'simulé'
        if ($file) {
            $file_name = $file['importdocGlobal']->getClientFilename();
            $fileSize = $file['importdocGlobal']->getSize();
        } else {
            $file_name = '';
            $fileSize = 0;
            if ($modif) {
                $file_name = $docAtt['NEW_NAME'];
            }
        }

        if (!$modif) {
            $validator->fileCheck("", $file_name ?? '', [], '', $fileSize ?? 0);
        }

        if ($validator->isValid()) {
            $newPath = Fichier::UploadDocAtt($file_name);

            if (($fileSize ?? 0) > 0) {
                $file['importdocGlobal']->moveTo($newPath["racine"] . $newPath["new_name"]);
            }

            $refObjet = $id;

            $value = [
                "langue" => $_SESSION['Session_Langue'],
                "new_name" => $newPath["new_name"],
                "file_name" => $file_name,
                "typeObjet" => $NO_DA,
                "refObjet" => $refObjet,
                "typePj" => $post['ajout-pj'],
                "titreDoc" => $post['ajout-titre'],
                "auteur" => $post['ajout-auteur'],
                "centre" => $post['ajout-centre'],
                "dateParu" => $post['ajout-dt_paru'],
                "dateVali" => $post['ajout-dt_vali'],
                "PJCommande" => $post['ajout-pj_commande'],
                "commentaire" => $post['ajout-com'],
            ];

            $params = [
                'id'    => $id,
            ];
            if ($modif) {
                if (isset($post['idDocBr'])) {
                    $params['idDoc'] = $post['idDocBr'];
                }
            }

            $response = [
                'statut' => 'O',
                'path' => $this->router->generateUri('Reception.CreationBR.saveDoc', $params),
                'post' => [
                    'DOC_ATT' => $value,
                ]
            ];
            return new Response(200, [], (string)\json_encode($response));
        }

        return new Response(200, [], (string)json_encode(['erreur' => $validator->getError(), 'statut' => 'E']));
    }
}
