<?php

namespace Modules\Ajax\Controller\Facture;

use Helpers\Log\LogSysteme;
use Helpers\Fichier\Fichier;
use Helpers\Outil\Outils;
use Skeleton\Controller\Controller;
use Modules\Ajax\WebService\EnvoiMail;
use Modules\Facture\Outil\ExportMasse;
use Helpers\Session\ParseBase1;

class ExportMasseFacturesController extends Controller
{
    public function traitementAsynchroneExportAction() : string
    {
        set_time_limit(0);
        ini_set('memory_limit', '500M');
        $post = $this->request->getParsedBody(true);

        if (!isset($post['Session_Login'])) {
            $post['Session_Login'] = $_SESSION["Session_Login"];
        }
        
        $ExportMasse = new \Modules\Facture\Repository\ExportMasse($this->pdo);
        $listeFacture = $ExportMasse->listeFactures($post);
        $trad = $this->getTranslationService();

        $zipsAndMissingInvoices = ExportMasse::createZipFileOfInvoices($listeFacture);
        
        $zips = $zipsAndMissingInvoices['nomZips'];
        $missingInvoices = $zipsAndMissingInvoices['missingInvoices'];

        $Hastutil = new \Entity\Model\Hastutil($this->pdo);
        $destinataire = $Hastutil->find($post['Session_Login'])['EMAIL'];
        $zipLinks = '';

        foreach ($zips as $zip) {
            $fileName = $zip.'.zip';
            $filePath = (new ParseBase1())->getRep()->tmp . $fileName;
            if (! file_exists($filePath)) {
                LogSysteme::prefixErrorLog('Missing file "'.$filePath.'"');
                continue;
            }

            $oldFic = $filePath;
            $newFic = Fichier::getDirExport().$fileName;
            
            $b = @copy($oldFic, $newFic);
            if ($b === false) {
                error_log((new \Exception('Failed copy "'.$oldFic.'" to "'.$newFic.'"'))->__toString());
            }


            $link = $this->router->generateUri('API.ChargeDocumentExterne.chargeDocumentExterne', [
                'type'      => 'exportVolume',
                'extension' => 'zip',
                'idDoc'     => $zip,
                'token'     => \strtolower(hash('sha256', 'zip'.$zip.($post['Session_Login']))),
            ]);

            $zipLinks .= PHP_EOL
                . PHP_EOL
                . Outils::getRootUrl()
                . $link;
        }

        // Get message
        if (empty($zipLinks)) {
            $message = $trad->t('Bonjour').','.PHP_EOL
                . PHP_EOL
                . $trad->t('Le traitement demandé est terminé') . '.'. PHP_EOL
                . PHP_EOL
                .$trad->t('Aucune image facture n\'a pu être extraite.') . PHP_EOL;
        } else {
            if (isset($missingInvoices) && $missingInvoices != '') {
                $message = $trad->t('Bonjour').','. PHP_EOL
                    . PHP_EOL
                    . $trad->t('Le traitement demandé est terminé') . '.'. PHP_EOL
                    . PHP_EOL
                    . $trad->t('Les fichiers suivants n\'ont pas pu être ajoutés à l\'extraction')
                    . $trad->colon() . $missingInvoices . PHP_EOL
                    . PHP_EOL
                    . $trad->t('Veuillez cliquer sur le(s) lien(s) pour récupérer le résultat du traitement')
                    . $trad->colon() . $zipLinks;
            } else {
                $message = $trad->t('Bonjour').','. PHP_EOL
                    . PHP_EOL
                    . $trad->t('Le traitement demandé est terminé') . '.'. PHP_EOL
                    . PHP_EOL
                    . $trad->t('Veuillez cliquer sur le(s) lien(s) pour récupérer le résultat du traitement')
                    . $trad->colon() . $zipLinks;
            }
            
            if (isset($post['listeNumInexistant']) && $post['listeNumInexistant']) {
                $message .= PHP_EOL
                    . PHP_EOL
                    . $trad->t('Les N° suivants ne correspondent pas à un N° d\'enregistrement facture') . ':' . $post['listeNumInexistant'];
            }
            
            if (isset($post['listeFactureSansImage']) && $post['listeFactureSansImage']) {
                $message .= PHP_EOL
                    . PHP_EOL
                    . $trad->t('Les N° d\'enregistrements suivants n\'ont pas d\'image facture associée') . ':' . $post['listeFactureSansImage'];
            }
        }
        $message .= PHP_EOL
            . PHP_EOL
            . $trad->t('Note : Seules les images factures correspondant à votre périmètre société sont extraites.');

        $envoiMailWSDL = new EnvoiMail();
        $envoiMailWSDL->envoiMail([
            'destinataires' => $destinataire,
            'Session_Login' => $post['Session_Login'],
            'sujet' => $trad->t('Export en masse des images de factures') ,
            'message' => $message
        ]);

        return 'true';
    }
}
