import type { BrowserContext, Page } from '@playwright/test'
import { type PersonaKey, getPersona } from '../_fixtures/personas'

/**
 * Login programmatique : pose le cookie BEARER via l'API sans passer par le
 * formulaire de login.
 *
 * Utilise ce helper dans TOUS les tests qui ne testent pas le flow login
 * lui-meme (sidebar visibility, route guards, etc.). Ca evite de payer 2s
 * par test sur le form HTML et ca isole les tests : si le form login casse,
 * seul `login.spec.ts` est rouge, pas toute la suite.
 *
 * Impl : on issue une requete POST /api/login_check avec les creds du persona.
 * Nginx reecrit vers /login_check, Symfony pose le cookie BEARER sur le
 * context du browser. Apres ca, n'importe quelle navigation est authentifiee.
 */
export async function loginAs(context: BrowserContext, persona: PersonaKey, baseURL?: string): Promise<void> {
    const { username, password } = getPersona(persona)
    const base = baseURL ?? 'http://localhost:3004'

    const response = await context.request.post(`${base}/api/login_check`, {
        data: { username, password },
    })

    if (!response.ok()) {
        const body = await response.text()
        throw new Error(
            `loginAs(${persona}) a echoue : ${response.status()} ${body}. `
            + 'Verifier que le backend tourne et que `make seed-e2e` a ete lance.',
        )
    }
}

/**
 * Helper d'appoint quand on veut tester VIA l'UI (login.spec.ts uniquement).
 * Passe par le formulaire rendu, clique sur le bouton. A ne PAS utiliser
 * dans les autres tests — preferer `loginAs()`.
 */
export async function loginViaForm(page: Page, persona: PersonaKey): Promise<void> {
    const { username, password } = getPersona(persona)
    await page.goto('/login')
    await page.getByLabel("Nom d'utilisateur").fill(username)
    await page.getByLabel('Mot de passe').fill(password)
    await page.getByRole('button', { name: 'Se connecter' }).click()
}
