<?php
namespace Modules\API\APIInterne\OxaMobility\Controller;

use GuzzleHttp\Psr7\Response;
use Helpers\Fichier\Fichier;
use Helpers\Session\ParseBase1;

class DOCController extends AbsApiController
{

    /**
     * @return void|Response
     */
    public function init()
    {
        if (($_SESSION["Session_Login"] ?? '') == '') {
            $trad = $this->getTranslationService();

            $return['Statut'] = 'E';
            $return['MsgErreur'] = $trad->t('Accès refusé.');
            return $this->createApiResponse($return);
        }
    }

    /**
     * @OA\Post(
     *      path="/doc/download",
     *      summary="télécharge un document",
     *      tags={"Documents"},
     *      @OA\RequestBody(
     *          description="CodeDossierRacine",
     *          required=true,
     *          @OA\MediaType(
     *              mediaType="application/xml",
     *          )
     *      ),
     *      @Oa\Response(
     *          response="200",
     *          description="Nouveau bon de réception",
     *          @OA\XmlContent(
     *             type="array",
     *             @OA\items(
     *                  type="string"))
     *       )
     * )
     * @return Response|string
     */
    public function DOWNLOADAction()
    {
        $return = [];
        $trad = $this->getTranslationService();
        $body = $this->request->getMetaBody();

        if (empty($body['Utilisateur'])) {
            $return['Statut'] = 'E';
            $return['MsgErreur'] = $trad->t('Le code utilisateur est obligatoire.');
        }

        $body['CodeDossierRacine'] = is_array($body['CodeDossierRacine'])? '':$body['CodeDossierRacine'];
        $body['NomFichier']        = is_array($body['NomFichier'])? '':$body['NomFichier'];
        $body['NomFichierAff']     = is_array($body['NomFichierAff'])? '':$body['NomFichierAff'];

        $dossierRacine = $body['CodeDossierRacine'];
        $nomFichier = $body['NomFichier'];
        $nomFichierAAfficher = $body['NomFichierAff'];
        
        if (!isset($dossierRacine) || $dossierRacine == '') {
            $return['Statut'] = 'E';
            $return['MsgErreur'] = $trad->t('Une erreur est survenue pendant la récupération de votre document.');
        } else {
            if ($dossierRacine === 'tmp') {
                $dossierRacine = (new ParseBase1())->getRep()->tmp;
            } elseif ($dossierRacine === 'pj') {
                $dossierRacine = (new ParseBase1())->getRep()->pj;
            } else {
                $return['Statut'] = 'E';
                $return['MsgErreur'] = $trad->t('Une erreur est survenue pendant la récupération de votre document.');
            }
        }

        if (!isset($nomFichier) || $nomFichier == '') {
            $return['Statut'] = 'E';
            $return['MsgErreur'] = $trad->t('Une erreur est survenue pendant la récupération de votre document.');
        }

        if (!isset($nomFichierAAfficher) || $nomFichierAAfficher == '') {
            $nomFichierAAfficher = $nomFichier;
        }
        if (@fopen(Fichier::filterTraversal($dossierRacine, $nomFichier), 'r', false)) {
            $fichier = Fichier::UploadClient(Fichier::filterTraversal($dossierRacine, $nomFichier), $nomFichierAAfficher, true);
            return $fichier;
        } else {
            $return['Statut'] = 'E';
            $return['MsgErreur'] = $trad->t('Une erreur est survenue pendant la récupération de votre document.');
        }
        return $this->createApiResponse($return, '', 210);
    }

    /**
     * @OA\Post(
     *      path="/doc/upload",
     *      summary="charge un document",
     *      tags={"Documents"},
     *      @OA\RequestBody(
     *          description="CodeDossierRacine",
     *          required=true,
     *          @OA\MediaType(
     *              mediaType="application/xml",
     *          )
     *      ),
     *      @Oa\Response(
     *          response="200",
     *          description="Document chargé",
     *          @OA\XmlContent(
     *             type="array",
     *             @OA\items(
     *                  type="string"))
     *       ),
     *       security={{
     *          "ApiKeyAuth": {}
     *      }}
     * )
     *
     */
    public function UPLOADAction() :Response
    {
        $return = [];
        $trad = $this->getTranslationService();
        $body = $this->request->getMetaBody();

        if (empty($body['Utilisateur'])) {
            $return['Statut'] = 'E';
            $return['MsgErreur'] = $trad->t('Le code utilisateur est obligatoire.');
        }
        
        $body['CodeDossierRacine'] = is_array($body['CodeDossierRacine'])? '':$body['CodeDossierRacine'];
        $body['BufferFichier']        = is_array($body['BufferFichier'])? '':$body['BufferFichier'];
        $body['NomFichierAff']     = is_array($body['NomFichierAff'])? '':$body['NomFichierAff'];
        
        $dossierRacine = $body['CodeDossierRacine'];
        $nomFichier = $body['NomFichierAff'];
        $bufferFichier = \base64_decode($body['BufferFichier']);
        
        if (!isset($dossierRacine) || $dossierRacine == '') {
            $return['Statut'] = 'E';
            $return['MsgErreur'] = $trad->t('Une erreur est survenue pendant la récupération de votre document.');
        } else {
            if ($dossierRacine === 'tmp') {
                $dossierRacine = (new ParseBase1())->getRep()->tmp;
            } elseif ($dossierRacine === 'pj') {
                $dossierRacine = (new ParseBase1())->getRep()->pj;
            } else {
                $return['Statut'] = 'E';
                $return['MsgErreur'] = $trad->t('Une erreur est survenue pendant la récupération de votre document.');
            }
        }
        
        if (!isset($nomFichier) || $nomFichier == '') {
            $return['Statut'] = 'E';
            $return['MsgErreur'] = $trad->t('Une erreur est survenue pendant le chargement de votre document.');
        }
        if ($bufferFichier == '') {
            $return['Statut'] = 'E';
            $return['MsgErreur'] = $trad->t('Une erreur est survenue pendant le chargement de votre document.');
        } else {
            $nomFichierAff = $nomFichier;
            $nomFichier = \pathinfo($nomFichier);
            $nomFichier = $nomFichier['filename'] . '_'
                . \uniqid() . '.'
                . ($nomFichier['extension'] ?? '');
            $fichier = Fichier::createFichier($dossierRacine, $nomFichier, $bufferFichier);
            if ($fichier) {
                $return['Statut'] = 'O';
                $return['CodeDossierRacine'] = 'tmp';
                $return['NomFichier'] = htmlspecialchars($nomFichier, ENT_XML1);
                $return['NomFichierAff'] = htmlspecialchars($nomFichierAff, ENT_XML1);
            } else {
                $return['Statut'] = 'E';
                $return['MsgErreur'] = $trad->t('Une erreur est survenue pendant le chargement de votre document.');
            }
        }

        return $this->createApiResponse($return);
    }
}
