<?php

namespace Modules\Stock\MenuContextuel;

use Exception;
use Helpers\Outil\MenuContextuel;
use Helpers\Outil\Roles;
use Helpers\Trad\ITrad;
use Helpers\Trad\Trad;
use Modules\Stock\Enum\EmptyEnum;
use Modules\Stock\Enum\MouvementBloqueEnum;
use Modules\Stock\Enum\InventaireMouvementBloqueEnum;
use Modules\Stock\Interface\MenuContextuelInterface;
use Modules\Stock\Repository\ArticleInventorieRepo;
use Modules\Stock\Repository\CahierInventaireRepo;
use Modules\Stock\Service\InventaireService;
use Modules\Stock\Trait\MenuContextuelTrait;
use PDO;
use Skeleton\Router;

class InventaireContextuel extends MenuContextuel implements MenuContextuelInterface
{
    use MenuContextuelTrait;

    /**
     * @var array<string,mixed>
     */
    public array $droit = [];

    public function __construct(PDO $pdo, Router $router, ITrad $trad)
    {
        parent::__construct($pdo, $router, $trad);
    }

    /**
     * @param array<string,string|int> $entity
     * @return array<string, array<int,array<string, mixed>>>
     * @throws Exception
     */
    public function generate(array $entity): array
    {
        $menuContextuel = [
            'listePrincipal' => [
                [
                    'icone' => 'visualiser_v2',
                    'libelle' => $this->trad->t('Visualiser'),
                    'lien' => $this->router->generateUri('Stock.Inventaire.visualiser', ['noInv' => $entity['NO_INV']]),
                ],
            ],
            'listeSecondaire' => [
                [
                    'libelle' => $this->trad->t('Dupliquer'),
                    'lien' => $this->router->generateUri('Stock.Inventaire.dupliquerForm', ['noInv' => $entity['NO_INV']]),
                ],
            ]
        ];

        if (Roles::droitsUtilisateur($this->pdo, 'ST_IN_IMP')) {
            if ($entity['DTE_VAL'] === '00000000') {
                $menuContextuel['listeSecondaire'][] = [
                    'target' => '_blank',
                    'libelle' => $this->trad->t('Imprimer les articles à inventorier'),
                    'lien' => $this->router->generateUri('Stock.Inventaire.imprimer', ['noInv' => $entity['NO_INV'], 'typeEdition' => EmptyEnum::EMPTY_PARAM->value])
                ];
            }

            if ($entity['DTE_VAL'] !== '00000000') {
                $menuContextuel['listeSecondaire'][] = [
                    'target' => '_blank',
                    'libelle' => $this->trad->t('Imprimer l\'inventaire valorisé'),
                    'lien' => $this->router->generateUri('Stock.Inventaire.imprimer', ['noInv' => $entity['NO_INV'], 'typeEdition' => 'V'])
                ];
                $menuContextuel['listeSecondaire'][] = [
                    'target' => '_blank',
                    'libelle' => $this->trad->t('Imprimer les écarts d\'inventaire'),
                    'lien' => $this->router->generateUri('Stock.Inventaire.imprimer', ['noInv' => $entity['NO_INV'], 'typeEdition' => 'E'])
                ];
            }
        }

        if ($entity['MVT_BLOQ'] === MouvementBloqueEnum::N->name && $entity['DTE_PRET'] == '00000000') {
            $menuContextuel['listePrincipal'][] = [
                'icone' => 'modifier_v2',
                'libelle' => $this->trad->t('Modifier'),
                'lien' => $this->router->generateUri('Stock.Inventaire.modifierForm', ['noInv' => $entity['NO_INV']]),
            ];
        }

        if (Roles::droitsUtilisateur($this->pdo, 'ST_IN_RES')
            && ($entity['MVT_BLOQ'] === MouvementBloqueEnum::O->name || $entity['MVT_BLOQ'] === MouvementBloqueEnum::R->name)
            && $entity['DTE_VAL'] === '00000000'
        ) {
            $menuContextuel['listeSecondaire'][] =  [
                'libelle' => $this->trad->t('Saisir les résultats'),
                'lienJs' => $this->getChoixSiteLienJS($entity, 'saisirResultats', 'Choix du site de saisie des résultats de l\'inventaire')
            ];
        }

        if (Roles::droitsUtilisateur($this->pdo, 'ST_IN_IMEX') && $entity['DTE_PRET'] !== '00000000') {
            if ($entity['DTE_VAL'] === '00000000') {
                $menuContextuel['listeSecondaire'][] = [
                    'libelle' => $this->trad->t('Exporter'),
                    'lienJs' => $this->getChoixSiteLienJS($entity, 'exporter', 'Choix du site de l\'export de l\'inventaire'),
                ];
            }

            if (($entity['MVT_BLOQ'] === MouvementBloqueEnum::O->name || $entity['MVT_BLOQ'] === MouvementBloqueEnum::R->name) && $entity['DTE_VAL'] === '00000000') {
                $menuContextuel['listeSecondaire'][] = [
                    'libelle' => $this->trad->t('Importer'),
                    'lienJs' => 'ajaxPopup('
                        . json_encode($this->router->generateUri('Stock.CahierInventaire.importerForm', ['noInv' => $entity['NO_INV']])) . ','
                        . json_encode(Trad::strBuild($this->trad->t('Importer les données de l\'inventaire n°@1@'), $entity['NO_INV']))
                        . ')'
                ];
            }
        }

        if (($entity['MVT_BLOQ'] === MouvementBloqueEnum::O->name || $entity['MVT_BLOQ'] === MouvementBloqueEnum::R->name) && $entity['DTE_VAL'] !== '00000000') {
            $menuContextuel['listeSecondaire'][] =  [
                'libelle' => $this->trad->t('Voir les résultats'),
                'lienJs' => $this->getChoixSiteLienJS($entity, 'voirResultats', 'Choix du site des résultats de l\'inventaire'),
            ];
        }

        if (Roles::droitsUtilisateur($this->pdo, 'ST_IN_SUP') && $entity['DTE_PRET'] === '00000000' && $entity['MVT_BLOQ'] !== InventaireMouvementBloqueEnum::O->name) {
            $menuContextuel['listeSecondaire'][] = [
                'libelle' => $this->trad->t('Supprimer'),
                'lienJs' => 'popupConfirmSimple('
                    . join(',', [
                        json_encode(Trad::strBuild($this->trad->t('Suppression de l\'inventaire N° @1@'), $entity['NO_INV'])),
                        json_encode(Trad::strBuild($this->trad->t('Etes-vous sûr de vouloir supprimer l\'inventaire N°@1@ ?'), $entity['NO_INV'])),
                        json_encode($this->router->generateUri('Stock.Inventaire.supprimer', ['noInv' => $entity['NO_INV']])),
                        '{}',
                        '() => {window.action.arianeReload()}'
                    ]) . ');',
            ];
        }

        if (Roles::droitsUtilisateur($this->pdo, 'ST_IN_MVT') && $entity['DTE_PRET'] !== '00000000' && $entity['MVT_BLOQ'] === MouvementBloqueEnum::N->name) {
            $menuContextuel['listeSecondaire'][] = [
                'libelle' => $this->trad->t('Arrêt des mouvements'),
                'lienJs' => 'popupConfirmValiderEntete('
                    . join(',', [
                        json_encode($this->trad->t('Arrêt des mouvements de l\'inventaire n°' . $entity['NO_INV'])),
                        json_encode(Trad::strBuild($this->trad->t('Etes-vous sûr de vouloir arrêter les mouvements de l\'inventaire N°@1@ ?'), $entity['NO_INV'])),
                        json_encode($this->router->generateUri('Stock.Inventaire.arretMouvements', ['noInv' => $entity['NO_INV']]))
                    ]) . ');',
            ];
        }

        if (Roles::droitsUtilisateur($this->pdo, 'ST_IN_MVT') && $entity['MVT_BLOQ'] === MouvementBloqueEnum::O->name) {
            $menuContextuel['listeSecondaire'][] = [
                'libelle' => $this->trad->t('Reprise des mouvements'),
                'lienJs' => 'popupConfirmSimple('
                    . join(',', [
                        json_encode($this->trad->t('Reprise des mouvements de l\'inventaire N°' . $entity['NO_INV'])),
                        json_encode(Trad::strBuild($this->trad->t('Etes-vous sûr de vouloir reprendre les mouvements de l\'inventaire N°@1@ ?'), $entity['NO_INV'])),
                        json_encode($this->router->generateUri('Stock.Inventaire.repriseMouvements', ['noInv' => $entity['NO_INV']])),
                        '{}',
                        '() => {window.action.arianeReload()}'
                    ]) . ');',
            ];
        }

        if (Roles::droitsUtilisateur($this->pdo, 'ST_IN_VAL') && $entity['DTE_PRET'] === '00000000') {
            $countCahiersInventaires = (new CahierInventaireRepo($this->pdo))->countCahiersInventairesForInv($entity['NO_INV']);
            $countArticlesInventories = (new ArticleInventorieRepo($this->pdo))->countArticlesInventoriesForInv($entity['NO_INV']);

            if ($countCahiersInventaires > 0 && $countArticlesInventories > 0) {
                $menuContextuel['listeSecondaire'][] = [
                    'libelle' => $this->trad->t('Valider les critères'),
                    'lienJs' => 'popupConfirmValiderEntete('
                        . join(',', [
                            json_encode($this->trad->t('Valider les critères de l\'inventaire N°' . $entity['NO_INV'])),
                            json_encode(Trad::strBuild($this->trad->t('Etes-vous sûr de vouloir valider les critères de l\'inventaire N°@1@ ?'), $entity['NO_INV'])),
                            json_encode($this->router->generateUri('Stock.Inventaire.validerCriteres', ['noInv' => $entity['NO_INV']])),
                        ]) . ');'
                ];
            }
        }

        if (Roles::droitsUtilisateur($this->pdo, 'ST_IN_VAL') && $entity['DTE_PRET'] !== '00000000' && $entity['MVT_BLOQ'] === MouvementBloqueEnum::N->name) {
            $menuContextuel['listeSecondaire'][] = [
                'libelle' => $this->trad->t('Dévalider les critères'),
                'lienJs' => 'popupConfirmSimple('
                    . join(',', [
                        json_encode($this->trad->t('Dévalider les critères de l\'inventaire N°' . $entity['NO_INV'])),
                        json_encode(Trad::strBuild($this->trad->t('Etes-vous sûr de vouloir dévalider les critères de l\'inventaire N°@1@ ?'), $entity['NO_INV'])),
                        json_encode($this->router->generateUri('Stock.Inventaire.devaliderCriteres', ['noInv' => $entity['NO_INV']])),
                        '{}',
                        '() => {window.action.arianeReload()}'
                    ]) . ');',
            ];
        }

        if ($entity['DTE_PRET'] !== '00000000' && $entity['MVT_BLOQ'] !== InventaireMouvementBloqueEnum::N->name && $entity['DTE_VAL'] === '00000000') {
            $menuContextuel['listeSecondaire'][] = [
                'libelle' => $this->trad->t('Valider les résultats'),
                'lien' => false,
                'lienJs' => 'popupConfirmValiderEntete('
                    . join(',', [
                        json_encode($this->trad->t('Validation des résultats de l\'inventaire N° ' . $entity['NO_INV'])),
                        json_encode(Trad::strBuild($this->trad->t('Etes-vous sûr de vouloir valider les résultats de l\'inventaire N°@1@ ?'), $entity['NO_INV'])),
                        json_encode($this->router->generateUri('Stock.Inventaire.validerResultats', ['noInv' => $entity['NO_INV']])),
                    ]) . ');',
            ];
        }

        return $menuContextuel;
    }

    /**
     * @param array<string,mixed> $entity
     * @param string $action
     * @param string $popupTitle
     * @return string
     * @throws Exception
     */
    private function getChoixSiteLienJS(array $entity, string $action, string $popupTitle): string
    {
        if ($entity['UNIQUE_SITE'] !== "") {
            $formAction = (new InventaireService($this->router))->getFormAction($action, $entity['NO_INV']);

            return 'executeInventaireAction('
                . json_encode($action) . ','
                . json_encode($formAction) . ','
                . json_encode($entity['NO_INV']) . ','
                . json_encode($this->router->generateUri('Stock.CahierInventaire.exporter', ['noInv' => $entity['NO_INV']]))
            . ');';
        }

        return 'ajaxPopup('
            . json_encode($this->router->generateUri('Stock.LigneCahierInventaire.choixSitePopup', ['noInv' => $entity['NO_INV'], 'action' => $action])) . ','
            . json_encode(Trad::strBuild($this->trad->t('@1@ n°@2@'), $popupTitle, $entity['NO_INV']))
        . ')';
    }
}
