/**
 * Definition des 6 personas utilises dans les tests E2E.
 *
 * Source de verite unique partagee entre :
 *   - le seed backend (`bin/console app:seed-e2e`)
 *   - les tests Playwright (via `loginAs`)
 *
 * Regle : chaque persona cible une case precise de la matrice RBAC.
 * Si tu ajoutes une permission au domaine, tu NE crees pas un nouveau
 * persona par reflexe — tu ajustes un persona existant si possible.
 * L'objectif est de garder ce set petit et comprehensible a 6 mois.
 *
 * IMPORTANT : ces personas sont recrees a chaque `app:seed-e2e`. Ne jamais
 * reutiliser les users dev (admin/alice/bob) dans les tests : ils evoluent
 * au gre des fixtures de demo et casseraient la suite E2E.
 */

export type PersonaKey =
    | 'super-admin'
    | 'user-full'
    | 'user-readonly'
    | 'user-users-only'
    | 'user-audit-only'
    | 'user-nothing'

export interface Persona {
    key: PersonaKey
    username: string
    password: string
    isAdmin: boolean
    // Permissions directes attribuees en dur (on bypasse les roles pour
    // garder le seed simple et la correspondance test<->permission directe).
    permissions: string[]
    // Contenu attendu de la sidebar (admin links). Utilise par le test
    // sidebar-visibility pour driver la matrice. Les valeurs correspondent
    // aux slugs de route (`/admin/<slug>`), volontairement stables quand
    // la copie/i18n change.
    expectedAdminLinks: Array<'users' | 'roles' | 'sites' | 'audit-log' | 'categories'>
}

const SHARED_PASSWORD = 'e2e-secret'

export const personas: Record<PersonaKey, Persona> = {
    'super-admin': {
        key: 'super-admin',
        username: 'e2e.super-admin',
        password: SHARED_PASSWORD,
        isAdmin: true,
        permissions: [],
        expectedAdminLinks: ['users', 'roles', 'sites', 'categories', 'audit-log'],
    },
    'user-full': {
        key: 'user-full',
        username: 'e2e.user-full',
        password: SHARED_PASSWORD,
        isAdmin: false,
        permissions: [
            'core.users.view',
            'core.users.manage',
            'core.roles.view',
            'core.roles.manage',
            'core.audit_log.view',
            'sites.view',
            'sites.manage',
            'sites.bypass_scope',
            'catalog.categories.view',
            'catalog.categories.manage',
            // Commercial — Repertoire clients (M1). Mappe ici sur le persona
            // "tout" en attendant les vrais roles metier (bureau/compta/
            // commerciale/usine) seedes par ERP-74. Pas de nouveau persona
            // (regle ABSOLUE n°7). commercial.clients.view n'ajoute pas de lien
            // dans la section Administration, donc expectedAdminLinks reste inchange.
            'commercial.clients.view',
            'commercial.clients.manage',
            'commercial.clients.accounting.view',
            'commercial.clients.accounting.manage',
            'commercial.clients.archive',
            // Commercial — Repertoire fournisseurs (M2, ERP-90). Meme logique que
            // les clients : mappe sur le persona "tout", pas de nouveau persona
            // (regle ABSOLUE n°7). commercial.suppliers.view n'ajoute pas de lien
            // dans la section Administration, donc expectedAdminLinks reste inchange.
            'commercial.suppliers.view',
            'commercial.suppliers.manage',
            'commercial.suppliers.accounting.view',
            'commercial.suppliers.accounting.manage',
            'commercial.suppliers.archive',
            // Technique — Repertoire prestataires (M3, ERP-138). Meme logique que
            // clients/fournisseurs : mappe sur le persona "tout", pas de nouveau
            // persona (regle ABSOLUE n°7). user-full porte deja sites.bypass_scope,
            // donc il voit les prestataires de tous les sites (M3 § 2.13).
            // technique.providers.view n'ajoute pas de lien dans la section
            // Administration, donc expectedAdminLinks reste inchange.
            'technique.providers.view',
            'technique.providers.manage',
            'technique.providers.accounting.view',
            'technique.providers.accounting.manage',
            'technique.providers.archive',
            // Transport — Repertoire transporteurs (M4, ERP-164). Meme logique :
            // mappe sur le persona "tout", pas de nouveau persona (regle ABSOLUE
            // n°7). L'item transporteurs vit desormais dans la section Administration
            // (1er item, ERP-164) mais sur la route `/carriers` (hors `/admin/<slug>`),
            // donc il n'entre pas dans ALL_ADMIN_LINKS : expectedAdminLinks reste inchange.
            'transport.carriers.view',
            'transport.carriers.manage',
            'transport.carriers.archive',
        ],
        expectedAdminLinks: ['users', 'roles', 'sites', 'categories', 'audit-log'],
    },
    'user-readonly': {
        key: 'user-readonly',
        username: 'e2e.user-readonly',
        password: SHARED_PASSWORD,
        isAdmin: false,
        permissions: [
            'core.users.view',
            'core.roles.view',
            'core.audit_log.view',
            'sites.view',
        ],
        expectedAdminLinks: ['users', 'roles', 'sites', 'audit-log'],
    },
    'user-users-only': {
        key: 'user-users-only',
        username: 'e2e.user-users-only',
        password: SHARED_PASSWORD,
        isAdmin: false,
        permissions: ['core.users.view', 'core.users.manage'],
        expectedAdminLinks: ['users'],
    },
    'user-audit-only': {
        key: 'user-audit-only',
        username: 'e2e.user-audit-only',
        password: SHARED_PASSWORD,
        isAdmin: false,
        permissions: ['core.audit_log.view'],
        expectedAdminLinks: ['audit-log'],
    },
    'user-nothing': {
        key: 'user-nothing',
        username: 'e2e.user-nothing',
        password: SHARED_PASSWORD,
        isAdmin: false,
        permissions: [],
        expectedAdminLinks: [],
    },
}

export function getPersona(key: PersonaKey): Persona {
    return personas[key]
}

export const ALL_ADMIN_LINKS = ['users', 'roles', 'sites', 'categories', 'audit-log'] as const
