<?php

namespace Modules\Stock\Service;

use Helpers\Trad\ITrad;
use Helpers\Trad\Trad;
use Modules\Stock\Enum\CodeParametreVracEnum;
use Modules\Stock\Enum\DemandeAchatStatutEnum;
use Modules\Stock\Enum\DemandeServiceEtatEnum;
use Modules\Stock\Enum\DemandeServiceTypeEnum;
use Modules\Stock\Enum\InventaireOrdreTriEnum;
use Modules\Stock\Enum\TypeBonEntreeEnum;
use Modules\Stock\Enum\TypeEnteteEnum;
use Modules\Stock\Enum\TypeMouvementEnum;
use Modules\Stock\Enum\TypeNumerotationEnum;
use Modules\Stock\Enum\TypeReapproEnum;
use Modules\Stock\Enum\TypeValoEnum;

readonly class ListManagerService
{
    public function __construct(private ITrad $trad)
    {
    }

    /**
     * @param bool $emptyAllowed
     * @return array<string,string>
     */
    public function getBonEntreeTypesList(bool $emptyAllowed = true): array
    {
        $liste = [TypeBonEntreeEnum::E->name => $this->trad->t('Entrée'), TypeBonEntreeEnum::R->name => $this->trad->t('Réintégration')];
        if ($emptyAllowed) {
            $liste = ['' => $this->trad->t('Sélectionnez un type')] + $liste;
        }

        return $liste;
    }

    /**
     * @param bool $emptyAllowed
     * @return array<string,string>
     */
    public function getDemandeServiceEtatsList(bool $emptyAllowed = true): array
    {
        $etatsListe = DemandeServiceEtatEnum::getAsAssoc($this->trad);

        if ($emptyAllowed) {
            $etatsListe[''] = $this->trad->t('Sélectionner un état');
        }

        return $etatsListe;
    }

    /**
     * @return array<string,string>
     */
    public function getEtatsList(): array
    {
        return [
            '' => $this->trad->t('Sélectionnez un état'),
            'A' => $this->trad->t('A valider'),
            'V' => $this->trad->t('Validés')
        ];
    }

    /**
     * @return array<string,string>
     */
    public function getInventaireStatusList(): array
    {
        return [
            '' => $this->trad->t('Sélectionnez un statut'),
            'C' => $this->trad->t('Critères à valider'),
            'A' => $this->trad->t('Résultats à saisir / valider'),
            'V' => $this->trad->t('Résultats validés')
        ];
    }

    /**
     * @return array<string,string>
     */
    public function getValiditeList(): array
    {
        return [
            '' => $this->trad->t('Tous'),
            'N' => $this->trad->t('Non valides'),
            'V' => $this->trad->t('Valides')
        ];
    }

    /**
     * @return array<string,string>
     */
    public function getDemandeServiceTypesList(): array
    {
        return ['' => $this->trad->t('Sélectionner un type'), ...DemandeServiceTypeEnum::getAsAssoc($this->trad)];
    }

    /**
     * @param bool $emptyAllowed
     * @return array<string,string>
     */
    public function getNumerotationTypeList(bool $emptyAllowed = true): array
    {
        $liste = TypeNumerotationEnum::getAsAssoc($this->trad);

        if ($emptyAllowed) {
            $liste[''] = $this->trad->t('Sélectionner un type');
        }

        return $liste;
    }

    /**
     * @return array<string,string>
     */
    public function getChoixDateValiditeList(): array
    {
        return [
            ' ' => $this->trad->t('Pas de contrôle'),
            'B' => $this->trad->t('Bloquant'),
            'N' => $this->trad->t('Non bloquant'),
        ];
    }

    /**
     * @return array<string,string>
     */
    public function getChoixArticlesEnModeSimplifiesList(): array
    {
        return [
            '' => $this->trad->t('Sélectionner un choix'),
            'A' => $this->trad->t('Avec agrégation des lignes (mode de base)'),
            'S' => $this->trad->t('Sans agrégation des lignes (1 ligne d\'appro par besoin)')
        ];
    }

    /**
     * @return array<string|int,string>
     */
    public function getChoixFournisseursList(): array
    {
        return [
            '' => $this->trad->t('Sélectionner un choix'),
            "1" => $this->trad->t('Fournisseur préférentiel d\'articles de stock'),
            "2" => $this->trad->t('Sélection automatique du fournisseur'),
        ];
    }

    /**
     * @return array<string,string>
     */
    public function getChoixTypeMouvementList(): array
    {
        return [
            '' => $this->trad->t('Sélectionner un choix'),
            TypeMouvementEnum::E->name => $this->trad->t('Entrée').' ('. TypeMouvementEnum::E->name.')',
            TypeMouvementEnum::ER->name => $this->trad->t('Réception').' ('. TypeMouvementEnum::ER->name.')',
            TypeMouvementEnum::ET->name => $this->trad->t('Entrée transfert').' ('. TypeMouvementEnum::ET->name.')',
            TypeMouvementEnum::I->name => $this->trad->t('Inventaire').' ('. TypeMouvementEnum::I->name.')',
            TypeMouvementEnum::IV->name => $this->trad->t('Inventaire V').' ('. TypeMouvementEnum::IV->name.')',
            TypeMouvementEnum::S->name => $this->trad->t('Sortie').' ('. TypeMouvementEnum::S->name.')',
            TypeMouvementEnum::SR->name => $this->trad->t('Retour').' ('. TypeMouvementEnum::SR->name.')',
            TypeMouvementEnum::ST->name => $this->trad->t('Sortie transfert').' ('. TypeMouvementEnum::ST->name.')',
        ];
    }

    /**
     * @return array<string,string>
     */
    public function getChoixTypeReapproList(): array
    {
        return [
            '' => $this->trad->t('Sélectionner un choix'),
            TypeReapproEnum::Q->name => $this->trad->t('Quantité économique'),
            TypeReapproEnum::S->name => $this->trad->t('Simplifié'),
            TypeReapproEnum::M->name => $this->trad->t('Manuel'),
        ];
    }

    /**
     * @return array<string,string>
     */
    public function getTypeEnteteList(): array
    {
        return [
            '' => $this->trad->t('Sélectionner un choix'),
            TypeEnteteEnum::BE->name => Trad::strBuild($this->trad->t('Bon d\'entrée (@1@)'), TypeEnteteEnum::BE->name),
            TypeEnteteEnum::BR->name => Trad::strBuild($this->trad->t('Bon de réception (@1@)'), TypeEnteteEnum::BR->name),
            TypeEnteteEnum::BS->name => Trad::strBuild($this->trad->t('Bon de sortie (@1@)'), TypeEnteteEnum::BS->name),
            TypeEnteteEnum::BT->name => Trad::strBuild($this->trad->t('Bon de transfert (@1@)'), TypeEnteteEnum::BT->name),
            TypeEnteteEnum::I->name => Trad::strBuild($this->trad->t('Inventaire (@1@)'), TypeEnteteEnum::I->name),
            TypeEnteteEnum::DS->name => Trad::strBuild($this->trad->t('Demande de service (@1@)'), TypeEnteteEnum::DS->name),
            TypeEnteteEnum::MV->name => Trad::strBuild($this->trad->t('Mouvement (@1@)'), TypeEnteteEnum::MV->name),
            TypeEnteteEnum::PR->name => Trad::strBuild($this->trad->t('Proposition de réapprovisionnement (@1@)'), TypeEnteteEnum::PR->name),
        ];
    }

    /**
     * @return array<string,string>
     */
    public function getChoixDemandeAchatStatutList(): array
    {
        return [
            '' => $this->trad->t('Sélectionner un choix'),
            DemandeAchatStatutEnum::E->name => $this->trad->t('En attente'),
            DemandeAchatStatutEnum::S->name => $this->trad->t('Signé'),
            DemandeAchatStatutEnum::R->name => $this->trad->t('Refusé'),
            DemandeAchatStatutEnum::T->name => $this->trad->t('Traité'),
        ];
    }

    /**
     * @return array<string,string>
     */
    public function getChoixTypeValoList(bool $emptyAllowed = true): array
    {
        $liste = [
            TypeValoEnum::P->name => $this->trad->t('PMPU'),
            TypeValoEnum::F->name => $this->trad->t('FIFO'),
            TypeValoEnum::D->name => $this->trad->t('Dernier prix'),
            TypeValoEnum::S->name => $this->trad->t('Standard'),
        ];

        if ($emptyAllowed) {
            $liste[''] = $this->trad->t('Sélectionner un choix');
        }

        return $liste;
    }

    /**
     * @return array<string,string>
     */
    public function getChoixBoolList(): array
    {
        return [
            '' => $this->trad->t('Sélectionner un choix'),
            'F' => $this->trad->t('Non'),
            'T' => $this->trad->t('Oui'),
        ];
    }

    /**
     * @return array<string,string>
     */
    public function getChoixOrdreTriList(bool $emptyAllowed = true): array
    {
        $liste = [
            InventaireOrdreTriEnum::D->name => $this->trad->t('Désignation'),
            InventaireOrdreTriEnum::E->name => $this->trad->t('Emplacement'),
            InventaireOrdreTriEnum::C->name => $this->trad->t('Code article'),
        ];

        if ($emptyAllowed) {
            $liste[''] = $this->trad->t('Sélectionner un choix');
        }

        return $liste;
    }

    /**
     * @return array<string,string>
     */
    public function getSectorisationNumerotationCodeParametreList(): array
    {
        return [
            CodeParametreVracEnum::SECTNUMDS->name => 'N',
            CodeParametreVracEnum::SECTNUMBE->name => 'N',
            CodeParametreVracEnum::SECTNUMBS->name => 'N',
            CodeParametreVracEnum::SECTNUMBT->name => 'N',
            CodeParametreVracEnum::SECTNUMPR->name => 'N',
            CodeParametreVracEnum::SECTNUMI->name => 'N'
        ];
    }

    /**
     * @return array<string,string>
     */
    public function getCodeParametreDiversList(): array
    {
        return [
            CodeParametreVracEnum::INV_MASQUER_QTE_THEO->name => 'N',
            CodeParametreVracEnum::REAPPRO_MODE_ARTSIMPLIFIES->name => '',
            CodeParametreVracEnum::OXAPROC_MODE_REAPPRO_ACTIF->name => 'N',
            CodeParametreVracEnum::CHXFOURPR->name => '',
            CodeParametreVracEnum::MONOCORMVT->name => 'N',
            CodeParametreVracEnum::BT_MULTISOCIETE->name => 'N',
            CodeParametreVracEnum::ST_VISIPRIXACTIF->name => 'N',
            CodeParametreVracEnum::ST_STONEGINTERDIT->name => 'N',
            CodeParametreVracEnum::ST_STONEGINTERDIT_SANSRESA->name => 'O'
        ];
    }

    /**
     * @return array<string,string>
     */
    public function getCodeParametreBoList(): array
    {
        return [
            CodeParametreVracEnum::IMP_BO_SI__BE->name => 'N',
            CodeParametreVracEnum::IMP_BO_CDC_BE->name => 'N',
            CodeParametreVracEnum::IMP_BO_SCA_BE->name => 'N',
            CodeParametreVracEnum::IMP_BO_SI__BS->name => 'N',
            CodeParametreVracEnum::IMP_BO_CDC_BS->name => 'N',
            CodeParametreVracEnum::IMP_BO_SCA_BS->name => 'N',
            CodeParametreVracEnum::IMP_BO_SI__DS->name => 'N',
            CodeParametreVracEnum::IMP_BO_CDC_DS->name => 'N',
            CodeParametreVracEnum::IMP_BO_SCA_DS->name => 'N',
        ];
    }

    /**
     * @return array<string,string>
     */
    public function getCodeParametreVaList(): array
    {
        return [
            CodeParametreVracEnum::IMP_VA_SI_BE->name => 'N',
            CodeParametreVracEnum::IMP_VA_CDC_BE->name => 'N',
            CodeParametreVracEnum::IMP_VA_SCA_BE->name => 'N',
            CodeParametreVracEnum::IMP_VA_SI_BS->name => 'N',
            CodeParametreVracEnum::IMP_VA_CDC_BS->name => 'N',
            CodeParametreVracEnum::IMP_VA_SCA_BS->name => 'N',
            CodeParametreVracEnum::IMP_VA_SI_DS->name => 'N',
            CodeParametreVracEnum::IMP_VA_CDC_DS->name => 'N',
            CodeParametreVracEnum::IMP_VA_SCA_DS->name => 'N',
        ];
    }

    /**
     * @return array<string,string>
     */
    public function getCodeParameterParamgenList(): array
    {
        return [
            CodeParametreVracEnum::BS_ACTIVATION_CUMULS->name => 'N',
            CodeParametreVracEnum::VERBS_CTRLSI->name => '',
            CodeParametreVracEnum::VERBS_CTLCDC->name => '',
            CodeParametreVracEnum::VERBS_CTLSCA->name => '',
            CodeParametreVracEnum::VERBS_TXAVSI->name => '',
            CodeParametreVracEnum::VERBS_TXVCDC->name => '',
            CodeParametreVracEnum::VERBS_TXVSCA->name => '',
            CodeParametreVracEnum::VERIF_BUDGSI->name => 'G',
            CodeParametreVracEnum::VERIF_BUDCDC->name => 'G',
            CodeParametreVracEnum::VERIF_BUDSCA->name => 'G',
            CodeParametreVracEnum::CTRLBUDCPTBS->name => ''
        ];
    }

    /**
     * @return array<string,string>
     */
    public function getChoixControleGlobalList(): array
    {
        return [
            'G' => $this->trad->t('Global'),
            'P' => $this->trad->t('Période')
        ];
    }
}
