<?php

declare(strict_types=1);

namespace App\Administration\Domain\Model\GradingConfiguration;

/**
 * Mode de notation de l'établissement.
 *
 * Chaque établissement choisit un mode unique qui détermine comment
 * les enseignants saisissent les évaluations et comment les moyennes
 * sont calculées (ou non).
 *
 * @see FR24: Supporter différentes pédagogies
 */
enum GradingMode: string
{
    case NUMERIC_20 = 'numeric_20';
    case NUMERIC_10 = 'numeric_10';
    case LETTERS = 'letters';
    case COMPETENCIES = 'competencies';
    case NO_GRADES = 'no_grades';

    /**
     * Échelle maximale pour les modes numériques.
     */
    public function scaleMax(): ?int
    {
        return match ($this) {
            self::NUMERIC_20 => 20,
            self::NUMERIC_10 => 10,
            self::LETTERS, self::COMPETENCIES, self::NO_GRADES => null,
        };
    }

    /**
     * Détermine si le mode utilise une notation numérique.
     */
    public function estNumerique(): bool
    {
        return match ($this) {
            self::NUMERIC_20, self::NUMERIC_10 => true,
            self::LETTERS, self::COMPETENCIES, self::NO_GRADES => false,
        };
    }

    /**
     * Détermine si le mode nécessite un calcul de moyenne.
     *
     * Les compétences et le mode sans notes ne calculent pas de moyenne.
     */
    public function calculeMoyenne(): bool
    {
        return match ($this) {
            self::NUMERIC_20, self::NUMERIC_10, self::LETTERS => true,
            self::COMPETENCIES, self::NO_GRADES => false,
        };
    }

    /**
     * Libellé utilisateur en français.
     */
    public function label(): string
    {
        return match ($this) {
            self::NUMERIC_20 => 'Notes /20',
            self::NUMERIC_10 => 'Notes /10',
            self::LETTERS => 'Lettres (A-E)',
            self::COMPETENCIES => 'Compétences',
            self::NO_GRADES => 'Sans notes',
        };
    }
}
