// Helper condivisi per gli E2E.
// Nota: lo stato di gioco è UNICO e persistente sul server, quindi ogni test
// deve riportarlo a zero (resetGame) e gestire eventuali dialog rimasti aperti
// dal test precedente.

const CONTROLLER_URL = 'http://localhost:3000/controller';
const DISPLAY_URL = 'http://localhost:3000';

// Apre il controller in viewport portrait (layout "mobile", su cui si basano i
// selettori dei test) e attende la connessione WebSocket.
async function openController(context) {
    const page = await context.newPage();
    await page.setViewportSize({ width: 390, height: 844 });
    await page.goto(CONTROLLER_URL);
    await page.waitForSelector('.conn-bar.connected');
    return page;
}

// Apre il display.
async function openDisplay(context) {
    const page = await context.newPage();
    await page.goto(DISPLAY_URL);
    return page;
}

// Chiude l'eventuale dialog di fine set / fine partita (può essersi aperto in
// automatico al caricamento se lo stato persistito era già "vinto").
async function chiudiDialogVittoria(page) {
    if (await page.locator('.dialog-winner').isVisible().catch(() => false)) {
        const chiudi = page.getByRole('button', { name: 'CHIUDI' });
        if (await chiudi.isVisible().catch(() => false)) {
            await chiudi.click();
        } else {
            await page.getByText('INDIETRO').click();
        }
        await page.waitForTimeout(150);
    }
}

// Reset completo dello stato dal controller:
// 1) chiude un eventuale dialog di vittoria, 2) azzera, 3) nel dialog di
// configurazione che doReset riapre, reimposta nomi di default e conferma.
// Reimpostare i nomi rende lo stato deterministico (lo stato è condiviso e
// persistente: senza questo i nomi di un test precedente "sporcano" gli altri,
// in particolare gli screenshot di visual-regression).
async function resetGame(page) {
    await chiudiDialogVittoria(page);
    await page.getByText(/Reset/i).first().click();
    const btnConfirm = page.locator('.dialog .btn-confirm');
    if (await btnConfirm.isVisible().catch(() => false)) {
        await btnConfirm.click();
    }
    const cfg = page.locator('.dialog-config');
    if (await cfg.isVisible().catch(() => false)) {
        const inputs = page.locator('.dialog-config .input-field');
        await inputs.first().fill('Antoniana');
        await inputs.nth(1).fill('Guest');
        await page.locator('.dialog-config .btn-confirm').click();
    }
    await page.waitForTimeout(300);
}

// Incrementa N punti per una squadra cliccando il punteggio.
async function addPoints(page, team, count) {
    const selector = team === 'home' ? '.team-score.home-bg' : '.team-score.guest-bg';
    for (let i = 0; i < count; i++) {
        await page.locator(selector).click();
        await page.waitForTimeout(30);
    }
    await page.waitForTimeout(100);
}

module.exports = {
    CONTROLLER_URL,
    DISPLAY_URL,
    openController,
    openDisplay,
    chiudiDialogVittoria,
    resetGame,
    addPoints,
};
