<?php

declare(strict_types=1);

namespace App\Module\Core\Infrastructure\DataFixtures;

use App\Module\Core\Application\Rbac\RbacSeeder;
use App\Module\Sites\Infrastructure\DataFixtures\SitesFixtures;
use Doctrine\Bundle\FixturesBundle\Fixture;
use Doctrine\Common\DataFixtures\DependentFixtureInterface;
use Doctrine\Persistence\ObjectManager;

/**
 * Fixture dev/test des roles metier MALIO (bureau / compta / commerciale /
 * usine) + comptes demo associes. DRY : delegue au MEME service RbacSeeder que
 * la commande `app:seed-rbac`, de sorte que `make db-reset` reproduise l'etat
 * de recette.
 *
 * Depend de SitesFixtures : les comptes demo sont rattaches au site par defaut
 * (cf. RbacSeeder::DEFAULT_SITE_NAME).
 *
 * ⚠ N'attache PAS la matrice § 2.7 ici : `doctrine:fixtures:load` PURGE la table
 * `permission` avant de charger, donc les codes `commercial.clients.*` ne sont
 * pas encore en base au moment du load (cf. ordre du makefile : fixtures PUIS
 * `app:sync-permissions`). La matrice est attachee juste apres, par l'etape
 * `app:seed-rbac` du makefile (db-reset / test-db-setup), via le meme seeder.
 * Resultat final identique a la recette : roles + matrice + comptes demo.
 */
final class RbacDemoFixtures extends Fixture implements DependentFixtureInterface
{
    /**
     * Mot de passe DEV/TEST connu des comptes demo (bureau / compta /
     * commerciale / usine). Reference par les tests fonctionnels de matrice
     * RBAC. Sans rapport avec la prod : en recette/prod le mot de passe est
     * fourni explicitement a `app:seed-rbac --with-demo-users --password=...`.
     */
    public const string DEMO_PASSWORD = 'demo';

    public function __construct(private readonly RbacSeeder $seeder) {}

    /**
     * @return array<int, class-string>
     */
    public function getDependencies(): array
    {
        return [SitesFixtures::class];
    }

    public function load(ObjectManager $manager): void
    {
        // Idempotent : ensureRoles puis ensureDemoUsers (lookup par code /
        // username). La matrice est volontairement deferree (cf. docblock).
        $this->seeder->ensureRoles();
        $this->seeder->ensureDemoUsers(self::DEMO_PASSWORD);
    }
}
