<?php

namespace Modules\Commande\Controller;

use Helpers\Outil\Sql;
use Skeleton\Controller\Controller;
use Helpers\Ariane\Ariane;
use Helpers\Trad\Trad;
use Modules\Commande\Repository\Solder;
use Helpers\Validator\Validator;
use Modules\Commande\WebService\Commande;

// phpcs:ignore
class solderCommandeController extends Controller
{
    public function physiquementAction(): string
    {
        $trad = $this->getTranslationService();
        /* **** */

        $idCommande = $this->request->getAttribute('idCommande');
        $post = $this->request->getParsedBody();

        $solder = new Solder($this->pdo);
        $liste = $solder->listeLigneCde($idCommande);

        $tabSelect = ['F' => $trad->t('Désoldée'), 'T' => $trad->t('Soldée')];
        $trad = $this->getTranslationService();
        Ariane::generate(1, $trad->t('(Dé)solder physiquement'), $post, count($liste));
        ariane::setFocus($idCommande);

        return $this->renderer->render('@Commande/Solder/solder', [
            'menuActive'    => 'CollecteBesoins',
            'menuLeft'      => 'Commande.GestionCommande.index',
            "idCommande"    => $idCommande,
            'listeLigne'    => $liste,
            'tabSelect'     => $tabSelect,
            
        ]);
    }

    public function validationPhysiqueAction(): string
    {
        $idCommande = $this->request->getAttribute('idCommande');
        $mode = $this->request->getAttribute('mode');

        $post = $this->request->getParsedBody();
        $solderWsdl = new Commande();
        $validator = $this->createValidator();
        $trad = $this->getTranslationService();

        $validator->isStringAvecEspace($trad->t('Incident global du solde'), $post['incidentGlobal'], ($post['CommentaireGlobal'] != '' ? 1 : 0), 60);
        $validator->isStringAvecEspace($trad->t('Commentaire global du solde'), $post['CommentaireGlobal'], 0, 3000);

        $array['DescriptionIncident'] = $post['incidentGlobal'];
        $array['CommentaireIncident'] = $post['CommentaireGlobal'];

        /** @var array<string> */
        $grep = preg_grep('/^NO_PO/', array_keys($post));
        /** @var array<string> */
        $matches  = str_replace("NO_PO", "", $grep);

        if ($mode == 'soldeComplet' || $mode == 'desoldeComplet') {
            if ($mode == 'soldeComplet') {
                $solde = true;
                $message = $trad->t('Votre commande a été soldée correctement.');
            } else {
                $solde = false;
                $message = $trad->t('Votre commande a été désoldée correctement.');

                $post['incidentGlobal'] = '';
                $post['CommentaireGlobal'] = '';
            }

            $complet = true;
            $array['listeLigne'] = array_map(function ($ligne) {
                return ['NO_PO' => $ligne];
            }, $matches);
        } else {
            $complet = false;
            $solde = false;
            $message = $trad->t('Vos lignes de commandes ont été (dé)soldées correctement.');

            foreach ($matches as $ligne) {
                $validator->isCheck($post['CREATINC_' . $ligne]);
                if (Sql::toBool($post['Operation' . $ligne]) && $post['CREATINC_' . $ligne]) {
                    $validator->isStringAvecEspace($ligne . ' : ' . $trad->t('Incident'), $post['incident' . $ligne], 1, 60);
                    $validator->isStringAvecEspace($ligne . ' : ' . $trad->t('Commentaire'), $post['Commentaire' . $ligne], 0, 3000);
                }

                if (Sql::toBool($post['Operation' . $ligne])) {
                    $operation = 'S';
                } else {
                    $operation = 'D';
                }

                $listeLigne[] = [
                    'NO_PO' => $ligne,
                    'Operation' => $operation,
                    'DescriptionIncident' => $post['incident' . $ligne] ?? '',
                    'CommentaireIncident' => $post['Commentaire' . $ligne] ?? '',
                ];

                $array['listeLigne'] = $listeLigne;
            }
        }

        if ($validator->isValid()) {
            $xmlResult = $solderWsdl->soldePhysiquementCommande($complet, $idCommande, $array, $solde);
            $reponse = new \SimpleXMLElement($xmlResult->responseData);

            $path = $this->router->generateUri('Commande.GestionCommande.index');
            // si on vient de la validation de BR, on redirige vers le menu de sélection des commandes à réceptionner
            if ($_SESSION['navigation']['menuActive'] == 'eproc') {
                $path = $this->router->generateUri('Reception.GestionBR.index');
            }

            if ($reponse->Statut == "O") {
                return $this->renderer->render('@DemandeAchat/Popup/popupConfirmation', [
                    'message'  => $message,
                    'redirect' => true,
                    'path'     => $path,
                    'titre'    => ''
                ]);
            } else {
                $Xml_erreur = str_replace('"', '\'', $xmlResult->responseData);
                $Xml_erreur = preg_replace("#\n|\t|\r#", "", $Xml_erreur);

                return $this->renderer->render('@popup-erreur/ErreurXml', [
                    'ErreurValid' => $reponse,
                ]);
            }
        } else {
            return $this->renderer->render('@popup-erreur/ErreurCreation', [
                'ErreurValid' => $validator->getError(),
            ]);
        }
    }
}
