<?php

namespace Modules\Facture\Controller;

use GuzzleHttp\Psr7\Response;
use Helpers\Ariane\Ariane;
use Helpers\Fichier\Fichier;
use Skeleton\Controller\Controller;

class ExportMasseViaExcelController extends Controller
{
    public function importAction(): string
    {
        $trad = $this->getTranslationService();

        $post = $this->request->getParsedBody();
        // $post['COLONNE'] = 1;

        Ariane::generate(0, $trad->t('Export en masse par Excel'));

        return $this->renderer->render('@exportMasse/exportViaExcel', [
            'menuActive' => 'Facture',
            'post' => $post,
            
        ]);
    }

    public function ajaxImportAction()
    {
        // @phpstan-ignore-next-line TODO MSA ini_set() attend un string en 2e argument, reçoit un int
        ini_set("display_errors", 1);

        $post = $this->request->getParsedBody();
        $post['Session_UsrMultiSoc'] = $_SESSION['Session_UsrMultiSoc'];
        $post['Session_Login'] = $_SESSION['Session_Login'];
        $trad = $this->getTranslationService();

        $file = $this->request->getUploadedFiles();

        if ($file) {
            $file_name = $file['importfile']->getClientFilename();
            $fileSize = $file['importfile']->getSize();
        } else {
            $file_name = null;
            $fileSize = 0;
        }

        $validator = $this->createValidator();
        // $validator->isInteger($trad->t('Colonne Numéro Facture'), $post['COLONNE'], 0, 2);
        /** @phpstan-ignore-next-line */
        $validator->fileCheck($trad->t('Fichier excel'), $file_name ?? '', ['xsl', 'xlsx', 'csv'], '', $fileSize);

        $formatArray = [
            0 => 'NUM_FACT',
        ];


        if ($validator->isValid()) {
            $countFactExiste = 0;
            $countFactExisteKO = 0;
            $newPath = Fichier::UploadDocAtt($file_name);
            $file['importfile']->moveTo($newPath["racine"] . $newPath["new_name"]);
            $newName = $newPath["racine"] . $newPath["new_name"];

            $spreadsheet = \PhpOffice\PhpSpreadsheet\IOFactory::load($newName);
            $feuilleReponse = $spreadsheet->getSheet(0);
            $nombreTotalRow = $feuilleReponse->getHighestRow();

            $arrayImport = [];

            $rowCount = 0;
            foreach ($feuilleReponse->getRowIterator(1, $nombreTotalRow) as $row) {
                $cellCount = 0;
                foreach ($row->getCellIterator() as $cell) {
                    $value = $cell->getCalculatedValue();
                    $arrayImport[$rowCount][$formatArray[$cellCount]] = $value;
                    $cellCount++;
                }
                $rowCount++;
            }

            $rowError = 0;
            $listeNumFact = '';
            $listeNumInexistant = '';
            foreach ($arrayImport as $ligne) {
                if (count(array_filter($ligne)) === 0) {
                    $nombreTotalRow--;
                    continue;
                }

                $validatorRow = $this->createValidator();
                $validator->isInteger($trad->t("N° de facture"), $ligne['NUM_FACT'], 0, 9);
                $erreurLigne = $validatorRow->getError();

                if ($erreurLigne != '') {
                    $rowError++;
                } else {
                    // Vérification de l'existance du numéro en BDD
                    $factureExistante = $validator->zoomRequete($ligne['NUM_FACT'], $trad->t("N° de facture"), 'Facture', $this->pdo, false);
                    if ($factureExistante) {
                        $listeNumFact .= $ligne['NUM_FACT'] . ',';
                        $countFactExiste++;
                    } else {
                        $countFactExisteKO++;
                        $listeNumInexistant .= $ligne['NUM_FACT'] . ',';
                    }
                }
            }
            if ($rowError == 0) {
                if ($listeNumFact != '') {
                    $post['listeNumFact'] = substr($listeNumFact, 0, -1);
                }
                if ($listeNumInexistant != '') {
                    $post['listeNumInexistant'] = substr($listeNumInexistant, 0, -1);
                }

                $outilExportMasse = new \Modules\Facture\Outil\ExportMasse();
                $exportMasse = new \Modules\Facture\Repository\ExportMasse($this->pdo);
                $listeFacture = $exportMasse->listeFactures($post, true);

                // Liste des numéros de factures sans valeur dans FIC_LAD

                $listeFactureSansImage = $exportMasse->listeFacturesSansImage($post['listeNumFact'] ?? '');
                if (is_array($listeFactureSansImage) && count($listeFactureSansImage) > 0) {
                    $post['listeFactureSansImage'] = implode(', ', array_column($listeFactureSansImage, 'NUM_FACT'));
                }

                if ($countFactExiste == 0) {
                    $errorMessage = $trad->t('Impossible de générer l\'export : aucune des factures sélectionnées trouvées.');
                } elseif (!is_array($listeFacture) || count($listeFacture) == 0) {
                    $errorMessage = $trad->t('Impossible de générer l\'export : aucune des factures sélectionnées n\'a de fichier associé.') . '<br/><br/>' . $trad->t('Note : Seules les images factures correspondant à votre périmètre société sont extraites.');
                }
                
                if (isset($errorMessage)) {
                    return new Response(200, [], $this->renderer->render('@popup-erreur/erreurAlerteEtAvertissement', [
                        'params' => [
                            'alerte'    => $errorMessage
                        ]
                    ]));
                }

                $outilExportMasse->traitementExportMasse($this->router, $post);

                $params = [
                    'message' => $trad->t("Le traitement est en cours. Vous recevrez un email lorsqu'il sera terminé."),
                ];

                return new Response(200, [], $this->renderer->render('@popup-erreur/information', $params));
            }

            $params = [
                'alerte' => $trad->t("Le fichier excel comporte des erreurs."),
            ];
            return new Response(443, [], $this->renderer->render('@popup-erreur/erreurAlerteEtAvertissement', ['params' => $params]));
        } else {
            $params = [
                'alerte' => $validator->getError(),
            ];

            return new Response(443, [], $this->renderer->render('@popup-erreur/erreurAlerteEtAvertissement', ['params' => $params]));
        }
    }
}
