<?php

declare(strict_types=1);

namespace App\Scolarite\Domain\Model\Competency;

use App\Shared\Domain\Tenant\TenantId;
use DomainException;

use function preg_match;

/**
 * Niveau de compétence personnalisé par établissement.
 *
 * Permet à chaque établissement de définir ses propres niveaux
 * au lieu d'utiliser les niveaux standards (CompetencyLevel enum).
 */
final class CustomCompetencyLevel
{
    private function __construct(
        public private(set) CustomCompetencyLevelId $id,
        public private(set) TenantId $tenantId,
        public private(set) string $code,
        public private(set) string $name,
        public private(set) ?string $color,
        public private(set) int $sortOrder,
    ) {
    }

    public static function creer(
        TenantId $tenantId,
        string $code,
        string $name,
        ?string $color,
        int $sortOrder,
    ): self {
        if ($color !== null && preg_match('/^#[0-9a-fA-F]{6}$/', $color) !== 1) {
            throw new DomainException('La couleur doit être au format hexadécimal (#rrggbb).');
        }

        return new self(
            id: CustomCompetencyLevelId::generate(),
            tenantId: $tenantId,
            code: $code,
            name: $name,
            color: $color,
            sortOrder: $sortOrder,
        );
    }

    /**
     * @internal Pour usage Infrastructure uniquement
     */
    public static function reconstitute(
        CustomCompetencyLevelId $id,
        TenantId $tenantId,
        string $code,
        string $name,
        ?string $color,
        int $sortOrder,
    ): self {
        return new self(
            id: $id,
            tenantId: $tenantId,
            code: $code,
            name: $name,
            color: $color,
            sortOrder: $sortOrder,
        );
    }
}
