<?php

declare(strict_types=1);

namespace App\Module\Catalog;

final class CatalogModule
{
    public const string ID    = 'catalog';
    public const string LABEL = 'Catalogue';
    // REQUIRED = true : Category sera FK NOT NULL cote futurs modules Tiers
    // (M-Clients, M-Fournisseurs, M-Prestataires). Desactiver Catalog casserait
    // tout le metier au boot Doctrine. Cf. review Tristan MR #12 + spec M0 § 2.1.
    public const bool REQUIRED = true;

    /**
     * Liste declarative des permissions RBAC exposees par le module Catalog.
     *
     * Consommee par la commande `app:sync-permissions` (SyncPermissionsCommand)
     * qui se charge d'upserter ces entrees dans la table `permission`, de
     * reactiver les codes precedemment marques orphelins et de marquer comme
     * orphelins ceux qui ont disparu du code source.
     *
     * La cle `module` est auto-injectee par le sync command a partir de
     * `self::ID`, il est donc inutile de la repeter dans chaque entree.
     *
     * Convention de nommage des codes : `module.resource[.sub].action` en
     * snake_case, le prefixe module devant correspondre exactement a
     * `self::ID` (verifie par la commande de synchronisation).
     *
     * Granularite alignee sur Core (view + manage), pas view/create/edit/delete
     * (cf. spec M0 § 2.7).
     *
     * @return array<int, array{code: string, label: string}>
     */
    public static function permissions(): array
    {
        return [
            ['code' => 'catalog.categories.view', 'label' => 'Voir les categories'],
            ['code' => 'catalog.categories.manage', 'label' => 'Gerer les categories (creer, editer, supprimer)'],
            // Lecture-referentiel transverse (ERP-102) : permet de LISTER les categories
            // pour alimenter les selects des modules Tiers (clients, fournisseurs...),
            // sans donner l'acces d'administration `.view` (qui ouvre la page Catalogue
            // dans la sidebar). Accordee aux roles metier via la matrice RBAC § 2.7.
            ['code' => 'catalog.categories.read_ref', 'label' => 'Lire le referentiel categories (transverse, lecture seule)'],
        ];
    }
}
