<?php

declare(strict_types=1);

namespace App\Module\Core\Application\Rbac;

use App\Module\Core\Domain\Entity\Role;
use App\Module\Core\Domain\Repository\RoleRepositoryInterface;
use App\Module\Core\Domain\Security\SystemRoles;
use Doctrine\ORM\EntityManagerInterface;

final readonly class RbacSeeder
{
    public function __construct(
        private EntityManagerInterface $em,
        private RoleRepositoryInterface $roles,
    ) {}

    /**
     * Crée les rôles système s'ils sont absents. Idempotent.
     */
    public function ensureSystemRoles(): void
    {
        $this->ensureRole(SystemRoles::ADMIN_CODE, 'Administrateur', 'Accès complet (bypass RBAC).');
        $this->ensureRole(SystemRoles::USER_CODE, 'Utilisateur', 'Rôle de base sans permission spécifique.');
        $this->em->flush();
    }

    private function ensureRole(string $code, string $label, string $description): void
    {
        if (null !== $this->roles->findByCode($code)) {
            return;
        }
        $this->roles->save(new Role($code, $label, $description, true));
    }
}
