<?php

declare(strict_types=1);

namespace App\Administration\Domain\Model\SchoolClass;

use App\Administration\Domain\Exception\ClassNameInvalideException;

use function assert;
use function mb_strlen;
use function trim;

/**
 * Value Object représentant le nom d'une classe.
 *
 * Contraintes :
 * - Entre 2 et 50 caractères
 * - Non vide après trim
 *
 * Note: Les property hooks PHP 8.5 ne sont pas compatibles avec readonly.
 * La validation reste dans le constructeur pour préserver l'immutabilité du Value Object.
 */
final readonly class ClassName
{
    private const int MIN_LENGTH = 2;
    private const int MAX_LENGTH = 50;

    /** @var non-empty-string */
    public string $value;

    public function __construct(string $value)
    {
        $trimmed = trim($value);
        $length = mb_strlen($trimmed);

        if ($length < self::MIN_LENGTH || $length > self::MAX_LENGTH) {
            throw ClassNameInvalideException::pourLongueur($value, self::MIN_LENGTH, self::MAX_LENGTH);
        }

        // After validation, $trimmed is guaranteed to be non-empty (MIN_LENGTH >= 2)
        assert($trimmed !== '');
        $this->value = $trimmed;
    }

    public function equals(self $other): bool
    {
        return $this->value === $other->value;
    }

    /**
     * @return non-empty-string
     */
    public function __toString(): string
    {
        return $this->value;
    }
}
