<?php

declare(strict_types=1);

namespace App\Administration\Domain\Model\User;

use function in_array;

/**
 * Enum représentant les rôles utilisateur dans Classeo.
 *
 * Hiérarchie RBAC :
 * - ROLE_SUPER_ADMIN → Accès à tous les établissements
 * - ROLE_ADMIN → Direction d'un établissement
 * - ROLE_PROF → Enseignant
 * - ROLE_VIE_SCOLAIRE → Personnel vie scolaire
 * - ROLE_SECRETARIAT → Personnel administratif
 * - ROLE_PARENT → Parent d'élève
 * - ROLE_ELEVE → Élève
 */
enum Role: string
{
    case SUPER_ADMIN = 'ROLE_SUPER_ADMIN';
    case ADMIN = 'ROLE_ADMIN';
    case PROF = 'ROLE_PROF';
    case VIE_SCOLAIRE = 'ROLE_VIE_SCOLAIRE';
    case SECRETARIAT = 'ROLE_SECRETARIAT';
    case PARENT = 'ROLE_PARENT';
    case ELEVE = 'ROLE_ELEVE';

    /**
     * Vérifie si ce rôle inclut implicitement un autre rôle (hiérarchie).
     */
    public function inclut(Role $autre): bool
    {
        $hierarchie = [
            self::SUPER_ADMIN->value => [
                self::ADMIN, self::PROF, self::VIE_SCOLAIRE,
                self::SECRETARIAT, self::PARENT, self::ELEVE,
            ],
            self::ADMIN->value => [
                self::PROF, self::VIE_SCOLAIRE, self::SECRETARIAT,
            ],
        ];

        $rolesInclus = $hierarchie[$this->value] ?? [];

        return in_array($autre, $rolesInclus, true);
    }

    /**
     * Retourne le libellé français du rôle.
     */
    public function label(): string
    {
        return match ($this) {
            self::SUPER_ADMIN => 'Super Administrateur',
            self::ADMIN => 'Directeur',
            self::PROF => 'Enseignant',
            self::VIE_SCOLAIRE => 'Vie Scolaire',
            self::SECRETARIAT => 'Secrétariat',
            self::PARENT => 'Parent',
            self::ELEVE => 'Élève',
        };
    }

    /**
     * Vérifie si ce rôle nécessite un consentement parental potentiel.
     */
    public function peutEtreMineur(): bool
    {
        return $this === self::ELEVE;
    }
}
