<?php

declare(strict_types=1);

namespace App\Administration\Domain\Model\SchoolClass;

/**
 * Niveau scolaire selon le référentiel Éducation Nationale.
 *
 * Primaire : CP, CE1, CE2, CM1, CM2
 * Collège : 6ème, 5ème, 4ème, 3ème
 * Lycée : 2nde, 1ère, Terminale
 */
enum SchoolLevel: string
{
    // Primaire
    case CP = 'CP';
    case CE1 = 'CE1';
    case CE2 = 'CE2';
    case CM1 = 'CM1';
    case CM2 = 'CM2';

    // Collège
    case SIXIEME = '6ème';
    case CINQUIEME = '5ème';
    case QUATRIEME = '4ème';
    case TROISIEME = '3ème';

    // Lycée
    case SECONDE = '2nde';
    case PREMIERE = '1ère';
    case TERMINALE = 'Terminale';

    /**
     * Retourne le libellé du niveau pour affichage.
     */
    public function label(): string
    {
        return $this->value;
    }

    /**
     * Détermine si le niveau appartient au cycle primaire.
     */
    public function estPrimaire(): bool
    {
        return match ($this) {
            self::CP, self::CE1, self::CE2, self::CM1, self::CM2 => true,
            default => false,
        };
    }

    /**
     * Détermine si le niveau appartient au cycle collège.
     */
    public function estCollege(): bool
    {
        return match ($this) {
            self::SIXIEME, self::CINQUIEME, self::QUATRIEME, self::TROISIEME => true,
            default => false,
        };
    }

    /**
     * Détermine si le niveau appartient au cycle lycée.
     */
    public function estLycee(): bool
    {
        return match ($this) {
            self::SECONDE, self::PREMIERE, self::TERMINALE => true,
            default => false,
        };
    }

    /**
     * Retourne le cycle d'enseignement.
     */
    public function cycle(): string
    {
        return match ($this) {
            self::CP, self::CE1, self::CE2, self::CM1, self::CM2 => 'Primaire',
            self::SIXIEME, self::CINQUIEME, self::QUATRIEME, self::TROISIEME => 'Collège',
            self::SECONDE, self::PREMIERE, self::TERMINALE => 'Lycée',
        };
    }
}
