<?php
namespace Helpers\ExportTo;

use Firebase\JWT\JWT;
use Firebase\JWT\Key;
use Helpers\Log\LogSysteme;
use Helpers\Fichier\Fichier;
use Helpers\Session\ParseBase1;
use Helpers\Trad\ITrad;
use Skeleton\Router;

class Outils
{
    protected string $clefExportBigFile;

    public function __construct()
    {
        $this->clefExportBigFile = \Helpers\ExportTo\Outils::getClef();
    }

    public static function getClef() :string
    {
        return 'dfj52558dfgqisudfgtsduidjkghfhfdùqs';
    }

    public function getClefExportBigFile() :string
    {
        return $this->clefExportBigFile;
    }

    /**
     * @param array<mixed> $arrayReq
     */
    public static function possibleGetExportBigFile(&$arrayReq) :void
    {
        $arrayReq[\Helpers\ExportTo\Outils::getClef()] = true;
    }

    /**
     * N'est plus utilisé mais util pour plus tard
     * @TODO : $case, $nomFichier, $cleUnique doivent etre escapé pour evité les injection
     */
    public function execAsynCmd(string $case, string $nomFichier, string $cleUnique = '') :void
    {
        $dataFile = \Modules\Outil\Outil\GestionFile::getFile((new ParseBase1())->getRep()->tmp . 'exportFichierghAsync.txt');
        $pathOxaversion = explode('|', $dataFile);
        $pathOxaversion = end($pathOxaversion);

        $cmd = 'start ' . ((new ParseBase1())->getPathPhp()) . $pathOxaversion . '\\IIS\\php.exe ' . (new ParseBase1())->getRep()->application . 'oxaproc\\application\\webroot\\V2\\batch.php 6be4e4ade8ae2c48e8edd00cb88e7ba63078ccede62b9d063ed904b0b51bfaf96be4e4ade8ae2c48e8edd00cb88e7ba63078ccede62b9d063ed904b0b51bfaf9 ' . $case . ' ' . uniqid("'.$cleUnique.'") . ' "' . $nomFichier . '"';

        $res = popen($cmd, 'r');
        if ($res === false) {
            throw new \Exception('Command failed "'.$cmd.'"');
        }
        pclose($res);
    }

    /**
     * @deprecated
     * @param mixed $keyJWT
     */
    public static function getExportEmailAsyncRecipient($keyJWT): string
    {
        /**
         * TODO : A Modifier car il y a deux variables donc une qui ne sert a rien
         */
        $nomDuFichier = $_SESSION['nomFichier'] ?? $_SESSION['NomFichier'];
        unset($_SESSION['NomFichier']);
        unset($_SESSION['nomFichier']);

        $return = \Modules\Outil\Outil\GestionFile::getFile(
            (new ParseBase1())->getRep()->tmp . $nomDuFichier
        );
        $decode = JWT::decode((string) $return, new Key($keyJWT, 'HS256'));
        return $decode->mailUser;
    }

    /**
     * @param mixed $keyJWT
     * @param array<mixed> $keyColonne
     * @param array<mixed> $listeDirect
     */
    public static function gestionEmailAsync2(
        string $fileBaseName,
        array $listeDirect,
        $keyJWT,
        Router $router,
        ITrad $trad,
        array $keyColonne = []
    ): void {

        foreach ($listeDirect as &$ligne) {
            if (isset($ligne['OxaCountPaginator'])) {
                unset($ligne['OxaCountPaginator']);
            }
        }

        $fileName = Fichier::createExportCsvV2($fileBaseName, $listeDirect, $keyColonne);

        /** spec 4814 : file must be moved to fic_pj (in order to be accessible in multi-server) */
        Fichier::moveTmpToFicPj($fileName);

        self::sendExportEmailAsync(
            $fileName,
            self::getExportEmailAsyncRecipient($keyJWT),
            $router,
            $trad
        );
    }

    public static function sendExportEmailAsync(
        string $fileName,
        string $destinataires,
        Router $router,
        ITrad $trad
    ): void {
        if (!file_exists(Fichier::getDirExport() . $fileName)) {
            throw new \Exception('Missing file "' . $fileName . '"');
        }
        $pathInfo = pathinfo($fileName);

        $envoiMail = \Modules\Ajax\Controller\MailController::envoiMail([
            'destinataires' => $destinataires,
            'sujet' => $trad->t('Document exporté'),
            'message' => $trad->t('Bonjour') . ',' . PHP_EOL
                . PHP_EOL
                . $trad->t('Veuillez cliquer sur le lien')
                . ' '
                . \Helpers\Outil\Outils::getRootUrl()
                . $router->generateUri('API.ChargeDocumentExterne.chargeDocumentExterne', [
                    'type' => 'exportVolume',
                    'extension' => $pathInfo['extension'] ?? '',
                    'idDoc' => $pathInfo['filename'],
                    'token' => strtolower(
                        hash(
                            'sha256',
                            ($pathInfo['extension'] ?? '')
                            . $pathInfo['filename']
                            . ($_SESSION["Session_Login"] ?? '')
                        )
                    ),
                ])
                . ' '
                . $trad->t('pour avoir accès à votre document exporté') . '.',
        ]);

        if ($envoiMail->Retour != 'O') {
            LogSysteme::prefixErrorLog((new \Exception($envoiMail->MsgErreur))->__toString());
        }
    }

    /**
     * initSession
     *
     * @param  array<mixed> $post
     * @return void
     */
    public static function initSession($post)
    {

        if (isset($post['exportActiveOxalys']) && $post['exportActiveOxalys'] == true) {
            set_time_limit(0);
            ini_set('memory_limit', '5048M');
        }
        if (isset($_SESSION['nomFichier']) && $_SESSION['nomFichier'] != '') {
            set_time_limit(0);
            ini_set("memory_limit", "2048M");
        }
    }
}
