<?php

namespace Modules\Parametrage\Facture\Controller;

use Modules\Parametrage\Facture\Service\ParamFactureService;
use Skeleton\Controller\Controller;
use Entity\Model\Fourniss;
use Entity\Model\Paravrac;
use Exception;
use GuzzleHttp\Psr7\Response;
use Helpers\Ariane\Ariane;
use Helpers\Ariane\ArianeSub;
use Helpers\Fichier\Fichier;
use Helpers\Log\LogSysteme;
use Helpers\Outil\Roles;
use Helpers\Parametres\Constante;
use Helpers\Trad\Trad;
use Helpers\Validator\Validator;
use Modules\Parametrage\Facture\Repository\ParametrageLAD;

class ParametrageLADController extends Controller
{
    /**
     * @var string $menuActive
     */
    public $menuActive = '';
    /**
     * @var string $menuLeft
     */
    public $menuLeft = '';
    /**
     * @var int $indexAriane
     */
    public $indexAriane = 0;

    public function init(): void
    {
        if (($_SESSION['ariane'][0]['path'] ?? null) == $this->router->generateUri('Parametrage.Parametrage.index')) {
            $this->indexAriane = 1;
            $this->menuActive = 'Parametrage';
            $this->menuLeft = '';
        } else {
            $this->indexAriane = 0;
            $this->menuActive = 'Facture';
            $this->menuLeft = '';
        }
    }

    public function LADAction(): string
    {

        $post = $this->request->getParsedBody();
        $paravrac = new Paravrac($this->pdo);
        $erreur = '';
        $trad = $this->getTranslationService();

        if ($post) {
            $validator = $this->createValidator();
            $validator->zoom('Hastutil', $post['responsableFactureLAD'], $trad->t('Responsable des factures LAD'), $this->pdo, false);
            if ($validator->isValid()) {
                $ladArchiveAuto = $paravrac->find(['CODEPARV' => 'LADARCHIVE_AUTO'])['LIB01PARV'] ?? false;
                $userRestFacLad = $paravrac->find(['CODEPARV' => 'USER_RESP_FACT_LAD'])['LIB01PARV'] ?? false;
                $ladValid = $paravrac->find(['CODEPARV' => 'LADVALID_AUTO'])['LIB01PARV'] ?? false;

                if ($ladValid != '') {
                    $paravrac->update([
                        'LIB01PARV' => (
                            (isset($post['validAutoEntete']) && $post['validAutoEntete'] == 'on') ? 'O' : 'N') . '|'
                            . ((isset($post['validAutoAffectation']) && $post['validAutoAffectation'] == 'on') ? 'O' : 'N') . '|'
                            . ((isset($post['validAutoBAP']) && $post['validAutoBAP'] == 'on') ? 'O' : 'N')

                    ], ['TYPEPARV' => 'PARAMGEN', 'CODEPARV' => 'LADVALID_AUTO']);
                } else {
                    $paravrac->insert([
                        'LIB01PARV' => (
                            (isset($post['validAutoEntete']) && $post['validAutoEntete'] == 'on') ? 'O' : 'N') . '|'
                            . ((isset($post['validAutoAffectation']) && $post['validAutoAffectation'] == 'on') ? 'O' : 'N') . '|'
                            . ((isset($post['validAutoBAP']) && $post['validAutoBAP'] == 'on') ? 'O' : 'N'),
                        'TYPEPARV' => 'PARAMGEN',
                        'CODEPARV' => 'LADVALID_AUTO'
                    ]);
                }

                if ($userRestFacLad !== false) {
                    $paravrac->update([
                        'LIB01PARV' => $post['responsableFactureLAD']

                    ], ['TYPEPARV' => 'PARAMGEN', 'CODEPARV' => 'USER_RESP_FACT_LAD']);
                } else {
                    $paravrac->insert([
                        'LIB01PARV' => $post['responsableFactureLAD'],
                        'TYPEPARV' => 'PARAMGEN',
                        'CODEPARV' => 'USER_RESP_FACT_LAD'
                    ]);
                }

                if ($ladArchiveAuto !== false) {
                    $paravrac->update([
                        'LIB01PARV' => (isset($post['archivageAutoFactureCree']) && $post['archivageAutoFactureCree'] == 'on') ? 'O' : 'N'

                    ], ['TYPEPARV' => 'PARAMGEN', 'CODEPARV' => 'LADARCHIVE_AUTO']);
                } else {
                    $paravrac->insert([
                        'LIB01PARV' => (isset($post['archivageAutoFactureCree']) && $post['archivageAutoFactureCree'] == 'on') ? 'O' : 'N',
                        'TYPEPARV' => 'PARAMGEN',
                        'CODEPARV' => 'LADARCHIVE_AUTO'
                    ]);
                }
            } else {
                $erreur = $validator->getError();
            }
        }

        $ladArchiveAuto = $paravrac->find(['CODEPARV' => 'LADARCHIVE_AUTO'])['LIB01PARV'] ?? false;
        $userRestFacLad = $paravrac->find(['CODEPARV' => 'USER_RESP_FACT_LAD'])['LIB01PARV'] ?? false;
        $ladValid = $paravrac->find(['CODEPARV' => 'LADVALID_AUTO'])['LIB01PARV'] ?? false;
        $ladValidExplod = explode('|', $ladValid);
        $validAutoEntete = $ladValidExplod[0] ?? 'N';
        $validAutoAffectation = $ladValidExplod[1] ?? 'N';
        $validAutoBAP = $ladValidExplod[2] ?? 'N';

        Ariane::generate($this->indexAriane, $trad->t('Gestion des paramétrages LAD'), []);

        ArianeSub::init();
        ArianeSub::generate(0, 1, $trad->t('Paramétrage LAD'), $this->router->generateUri('Parametrage.ParametrageLAD.LAD'), 1);

        if ($_SESSION["Session_Login"] == 'OXAUSER' || Roles::GetALL()) {
            ArianeSub::generate(0, 2, $trad->t('Signature'), $this->router->generateUri('Parametrage.ParametrageFlexi.signature'), 0);
        }

        ArianeSub::generate(0, 3, $trad->t('Paramétrage fournisseur'), $this->router->generateUri('Parametrage.ParametrageLAD.fournisseur'), 0);

        return $this->renderer->render('@ParamFac/lad', [
            'menuActive' => $this->menuActive,
            'menuLeft' => $this->menuLeft,
            'ladArchiveAuto' => $ladArchiveAuto,
            'userRestFacLad' => $userRestFacLad,
            'ladValid' => $ladValid,
            'validAutoEntete' => $validAutoEntete,
            'validAutoAffectation' => $validAutoAffectation,
            'validAutoBAP' => $validAutoBAP,
            'post' => $post,
            'erreur' => $erreur
        ]);
    }

    public function fournisseurAction(): string
    {
        $post = $this->request->getParsedBody();

        $parametrageRepository = new ParametrageLAD($this->pdo);

        $delCodeFournisseur = $this->request->getAttribute('delCodeFournisseur');

        if ($delCodeFournisseur) {
            $parametrageRepository->deleteFournisseurArticlePourcentage([
                "COD_FRS" => $delCodeFournisseur,
            ]);
        }

        $trad = $this->getTranslationService();

        $paginator = new \Helpers\Pagination\PaginatorGestion();
        $paginator->generate('0', 'CODE_ART', 'DESC');

        $listeFournisseurs = $parametrageRepository->listeArticlesAutoFournisseur('', $post);

        if ($listeFournisseurs === [] && $post["filter_egal_CODE"]) {
            $rechercheNonAbouti = true;
        }

        $infoPagination = \Helpers\Pagination\PaginatorGestion::getInfoPagination();

        Ariane::generate($this->indexAriane, $trad->t('Gestion des paramétrages LAD'), []);
        ArianeSub::init();
        ArianeSub::generate(0, 1, $trad->t('Paramétrage LAD'), $this->router->generateUri('Parametrage.ParametrageLAD.LAD'), 0);
        if ($_SESSION["Session_Login"] == 'OXAUSER' || Roles::GetALL()) {
            ArianeSub::generate(0, 2, $trad->t('Signature'), $this->router->generateUri('Parametrage.ParametrageFlexi.signature'), 0);
        }
        ArianeSub::generate(0, 3, $trad->t('Paramétrage fournisseur'), $this->router->generateUri('Parametrage.ParametrageLAD.fournisseur'), 1);

        $societe = $post['societe'] ?? $_SESSION['Session_SocUsr'];

        $sectorise = (\Helpers\Outil\Roles::droit($this->pdo, 'SISECTOR', 'PARAMSTE') || \Helpers\Outil\Roles::droit($this->pdo, 'SCASECTO', 'PARAMSTE') || \Helpers\Outil\Roles::droit($this->pdo, 'CDCSECTO', 'PARAMSTE')) ? true : false;

        return $this->renderer->render('@ParamFac/fournisseur', [
            'menuActive' => $this->menuActive,
            'menuLeft' => $this->menuLeft,
            'post' => $post,
            'listes' => $listeFournisseurs,
            'infoPagination' => $infoPagination,
            'sectorise' => $sectorise,
            'societe' => $societe,
            'rechercheNonAbouti' => $rechercheNonAbouti ?? false
        ]);
    }
    /**
     * @return string|Response
     */
    public function creationParamLADFournisseurAction()
    {
        $post = $this->request->getParsedBody();

        $type = $this->request->getAttribute('type');
        $codeSociete = $this->request->getAttribute('codeSte');
        $codeFournisseur = $this->request->getAttribute('codeFournisseur');
        $fromFicheFournisseur = $this->request->getAttribute('fromFicheFournisseur');

        $parametrageRepository = new ParametrageLAD($this->pdo);

        if ($codeFournisseur) {
            $articles = $parametrageRepository->listeArticlesAutoFournisseur($codeFournisseur);
            if ($articles && isset($articles[0]['ART_SANS_CMD'])) {
                if (!ParamFactureService::calculPourcentage($articles[0]['ART_SANS_CMD'])) {
                    $parametrageRepository->recalculPourcentage($articles[0]['CODE'], $articles[0]['ART_SANS_CMD']);
                    $articles = $parametrageRepository->listeArticlesAutoFournisseur($codeFournisseur, $post);
                }
                $type = 'modification';
            } else {
                $type = 'ajout';
                $parametrageRepository->deleteFournisseurArticlePourcentage(['COD_FRS' => $articles['COD_FRS']]);
            }
        }

        $erreur = '';
        $trad = $this->getTranslationService();

        if ($post && $post['formSubmited'] === 'true') {
            $validator = $this->createValidator();
            unset($post['formSubmited']);
            $fromFicheFournisseur = $post['fromFicheFournisseur'];
            unset($post['fromFicheFournisseur']);

            // Validation des inputs par lignes -> recherche effectuée en fonction du digit en fin de name de l'input
            $keysOfPost = array_keys($post);

            foreach ($keysOfPost as $key) {
                if (preg_match('/^fournisseur\d+$/', $key, $matches)) {
                    $matches[0] = substr($matches[0], -1);
                    $correspondingNumber[] = $matches[0];
                }
            }

            $count = 0;
            $fournisseur = $article = $pourcentage = false;
            $sumPourcentage = [];
            $allArticles = [];

            foreach ($post as $key => $value) {
                if ($key === 'text_fournisseur' . ($correspondingNumber[$count] ?? '') || $key === 'text_article' . ($correspondingNumber[$count] ?? '')) {
                    unset($post[$key]);
                    continue;
                }

                if ($key === "fournisseur" . ($correspondingNumber[$count] ?? '')) {
                    $validator->zoom('Fourniss', $value, $trad->t('Fournisseur'), $this->pdo, false);
                    $fournisseur = true;
                    if ($codeFournisseur != $value) {
                        $validator->setError($trad->t("Code fournisseur incorrect."));
                    }
                } elseif ($key === "article" . ($correspondingNumber[$count] ?? '')) {
                    $validator->zoom('Articles', $value, $trad->t('Article'), $this->pdo, false);
                    $article = true;
                    if (!in_array($value, $allArticles)) {
                        $allArticles[] = $value;
                    } else {
                        $validator->setError($trad->t("Un article a été rentré plusieurs fois : " . $value));
                    }
                } elseif ($key === "pourcentage" . ($correspondingNumber[$count] ?? '')) {
                    $result = $validator->isFloat($trad->t('Pourcentage'), $value, Constante::formatMontant, true, '100.00', '0.01');
                    $pourcentage = true;
                    if ($result && !strpos(strval($value), '.')) {
                        $value = strval($value) . '.00';
                    }
                    if ($result && strpos(strval($value), ',')) {
                        $value = str_replace(',', '.', strval($value));
                    }
                    if ($result && strpos(strval($value), '.') && (strlen(strval($value)) !== 5)) {
                        $value = strlen(strval($value)) < 5 ? strval($value) . '0' : str_split(strval($value), 5)[0];
                    }
                    $sumPourcentage[] = $value;
                }

                if (!$fournisseur && !$article && !$pourcentage) {
                    $validator->setError($trad->t("Vous devez renseigner un fournisseur, un article et un pourcentage sur la ligne " . ($count + 1)));
                }

                if (array_key_last($post) !== $key && $fournisseur && $article && $pourcentage) {
                    $count++;
                    $fournisseur = $article = $pourcentage = false;
                }
            }

            if (array_sum($sumPourcentage) !== 100.00) {
                $validator->setError($trad->t("La somme des pourcentages doit valoir 100%"));
            }

            if (!$validator->isValid()) {
                $erreur = $validator->getError();
                return new Response(400, [], $erreur);
            }
            $filtragePost = [];

            $secondCount = 0;
            $fournisseur = $article = $pourcentage = false;

            foreach ($post as $key => $value) {
                if (!isset($filtragePost[($secondCount + 1)])) {
                    $filtragePost[($secondCount + 1)] = [];
                }

                if ($key === "fournisseur" . ($correspondingNumber[$secondCount] ?? '')) {
                    $filtragePost[($secondCount + 1)]['fournisseur' . ($secondCount + 1)] = $value;
                    $fournisseur = true;
                }

                if ($key === "article" . ($correspondingNumber[$secondCount] ?? '')) {
                    $filtragePost[($secondCount + 1)]['article' . ($secondCount + 1)] = $value;
                    $article = true;
                }

                if ($key === "pourcentage" . ($correspondingNumber[$secondCount] ?? '')) {
                    $filtragePost[($secondCount + 1)]['pourcentage' . ($secondCount + 1)] = $value;
                    $pourcentage = true;
                }

                if ($fournisseur && $article && $pourcentage) {
                    $fournisseur = $article = $pourcentage = false;
                    $secondCount++;
                }

                if ($secondCount > $count) {
                    break;
                }
            }

            if ($type === "ajout") {
                $parametrageRepository->insertFournisseurArticlePourcentage($filtragePost);
            } elseif ($type === "modification") {
                $parametrageRepository->updateFournisseurArticlePourcentage($codeFournisseur, $filtragePost);
            }

            return new Response(
                200,
                [],
                $fromFicheFournisseur == "1" || $fromFicheFournisseur == "true"
                                    ? (json_encode(["path" => $this->router->generateUri('Fournisseur.Fournisseur.articlesAuto', ["id" => $codeFournisseur])]) ?: null)
                                    : (json_encode(["path" => $this->router->generateUri('Parametrage.ParametrageLAD.fournisseur')]) ?: null)
            );
        }

        if ($codeFournisseur && $type === "modification") {
            $RSetCodeFourni = $articles[0]['RS'] . ' (' . $articles[0]['CODE'] . ')';
            $raisonSociale = $articles[0]['RS'];
        } elseif ($codeFournisseur && $type === "ajout") {
            $fourniss = new Fourniss($this->pdo);
            $fournisseur = $fourniss->find($codeFournisseur);
            $raisonSociale = $fournisseur['RS'];
        } else {
            $articles = $parametrageRepository->listeArticlesAutoFournisseur();
            $raisonSociale = '';
        }

        $RSetCodeFourni =   $raisonSociale && $codeFournisseur
                            ? $raisonSociale . ' (' . $codeFournisseur . ')'
                            : '';

        $texteOnglet = $trad->t('Article pour facture sans commande');

        if ($fromFicheFournisseur != 1) {
            Ariane::generate($this->indexAriane, $trad->t('Gestion des paramétrages LAD'), []);
            ArianeSub::generate(0, 3, $trad->t('Paramétrage fournisseur'), $this->router->generateUri('Parametrage.ParametrageLAD.fournisseur'), 0);
        }
        ArianeSub::generate(1, 0, $texteOnglet . ' - ' . $RSetCodeFourni, $this->router->generateUri('Parametrage.ParametrageLAD.creationParamLADfournisseur'), 1);

        return $this->renderer->render('@ParamFac/formFournisseurArticle', [
            'menuActive' => $this->menuActive,
            'menuLeft' => $this->menuLeft,
            'post' => $post,
            'erreur' => $erreur,
            'type' => $type,
            // @phpstan-ignore-next-line
            'articles' => $articles ?? false,
            'fournisseurAjout' => $fournisseur ?? false,
            'RSetCodeFourni' => $RSetCodeFourni,
            'raisonSociale' => $raisonSociale,
            'societe' => $codeSociete,
            'codeFournisseur' => $codeFournisseur,
            'fromFicheFournisseur' => $fromFicheFournisseur ?? '0'
        ]);
    }

    public function exportFournisseurArticleAction(): string
    {
        $post = $this->request->getParsedBody();
        $parametrageRepository = new ParametrageLAD($this->pdo);
        $listeFourniss = $parametrageRepository->listeFournisseurExport($post);

        \Helpers\ExportTo\Outils::gestionEmailAsync2(
            'export_fournisseurs_article_',
            $listeFourniss,
            $this->JWTKEY,
            $this->router,
            $this->getTranslationService()
        );

        return 'ok';
    }

    public function createOrModifyRedirectAction(): Response
    {
        $codeFournisseur = $this->request->getAttribute('codeFournisseur');
        $codeSte = $this->request->getAttribute('codeSte');

        $post['societe'] = $codeSte === 'none' ? '' : $codeSte;

        $parametrageRepository = new ParametrageLAD($this->pdo);
        $listes = $parametrageRepository->listeArticlesAutoFournisseur($codeFournisseur, $post);

        if (isset($listes[0]['ART_SANS_CMD']) && count($listes[0]['ART_SANS_CMD']) > 0) {
            return new Response(200, [], (json_encode([
                'path' => $this->router->generateUri('Parametrage.ParametrageLAD.creationParamLADFournisseur', [
                    "type"              => "modification",
                ]) . $codeFournisseur . '/' . $codeSte . '/1'
            ]) ?: null));
        } else {
            return new Response(200, [], (json_encode(['path' => $this->router->generateUri('Parametrage.ParametrageLAD.creationParamLADFournisseur', [
                "type"              => "ajout",
                ]) . $codeFournisseur . '/' . $codeSte . '/1'
            ]) ?: null));
        }
    }

    public function deleteAllArticlesAction(): Response
    {
        $codeFournisseur = $this->request->getAttribute('codeFournisseur');

        $parametrageRepository = new ParametrageLAD($this->pdo);
        if ($parametrageRepository->deleteFournisseurArticlePourcentage([
            "COD_FRS" => $codeFournisseur
        ]) !== true) {
            LogSysteme::prefixErrorLog('Erreur: la requête de deleteFournisseurArticlePourcentage n\'a pas fonctionné');
            $trad = $this->getTranslationService();
            return new Response(400, [], (json_encode(
                ['error' => $trad->t('Une erreur est survenue.')
                ]
            ) ?: null));
        }
            
        return new Response(200, [], (json_encode(['path' => $this->router->generateUri('Fournisseur.Fournisseur.articlesAuto', [
                "id" => $codeFournisseur,
                ])
            ]) ?: null));
    }
}
