import { expect, test } from '@playwright/test'
import { LoginPage } from '../helpers/pages/LoginPage'
import { getPersona } from '../_fixtures/personas'

/**
 * Tests du flow login/logout via l'UI.
 *
 * C'est le SEUL fichier qui traverse le formulaire pour de vrai. Les autres
 * specs utilisent `loginAs()` qui pose directement le cookie BEARER via API,
 * 10x plus rapide et decouple du form HTML.
 */
test.describe('Login', () => {
    test('login valide pose le cookie BEARER et redirige vers /', async ({ page, context }) => {
        const superAdmin = getPersona('super-admin')
        const loginPage = new LoginPage(page)

        await loginPage.goto()
        await loginPage.fillAndSubmit(superAdmin.username, superAdmin.password)

        // La redirection se fait apres un `navigateTo('/')` dans login.vue.
        await page.waitForURL('/')
        await expect(page).toHaveURL('/')

        // Le cookie BEARER (HTTP-only) doit etre pose par Symfony.
        const cookies = await context.cookies()
        const bearer = cookies.find(c => c.name === 'BEARER')
        expect(bearer, 'Le cookie BEARER doit etre pose apres un login valide').toBeDefined()
        expect(bearer?.httpOnly).toBe(true)
    })

    test('login invalide reste sur /login et n\'emet pas de cookie', async ({ page, context }) => {
        const loginPage = new LoginPage(page)

        await loginPage.goto()
        await loginPage.fillAndSubmit('e2e.super-admin', 'wrong-password')

        // On ne doit PAS etre redirige — le handleSubmit swallow la 401 via toast,
        // le user reste sur /login pour corriger.
        await page.waitForTimeout(500)
        await expect(page).toHaveURL(/\/login$/)

        const cookies = await context.cookies()
        const bearer = cookies.find(c => c.name === 'BEARER')
        expect(bearer, 'Aucun cookie BEARER ne doit etre pose apres un login invalide').toBeUndefined()
    })

    test('logout efface le cookie et redirige vers /login', async ({ page, context }) => {
        const superAdmin = getPersona('super-admin')
        const loginPage = new LoginPage(page)

        // 1. Login d'abord
        await loginPage.goto()
        await loginPage.fillAndSubmit(superAdmin.username, superAdmin.password)
        await page.waitForURL('/')

        // 2. Navigation vers /logout (il y a un lien "Deconnexion" dans la sidebar)
        await page.goto('/logout')
        await page.waitForURL(/\/login$/)

        // 3. Le cookie BEARER doit avoir ete supprime par le firewall de logout
        const cookies = await context.cookies()
        const bearer = cookies.find(c => c.name === 'BEARER')
        expect(bearer, 'Le cookie BEARER doit etre supprime apres logout').toBeUndefined()
    })
})
