import { expect, test } from './fixtures';

// The maintenance overlay is raised in prod by the edge 503 marker (X-Scrabble-Maintenance);
// the mock transport never produces one, so — like the offline indicator — the e2e drives it
// through the window.__maint hook (gateway.ts, mock-only). It is app-global (mounted outside
// the route blocks in App.svelte), so it shows without a session.
test('maintenance overlay covers the app and lifts on recovery', async ({ page }) => {
  await page.goto('/');
  await expect(page.getByRole('alertdialog')).toHaveCount(0);

  // A planned deploy window begins: a non-dismissable dimmed overlay covers the app.
  await page.evaluate(() => (window as unknown as { __maint: { on(): void } }).__maint.on());
  const overlay = page.getByRole('alertdialog');
  await expect(overlay).toBeVisible();
  // The retry button is present (EN "Try again" / RU "Повторить" depending on locale).
  await expect(overlay.getByRole('button', { name: /again|Повторить/i })).toBeVisible();

  // The window ends — in prod the store's poll lifts it on the first successful read; the mock
  // has no probe, so it clears explicitly. The overlay disappears with no page reload.
  await page.evaluate(() => (window as unknown as { __maint: { off(): void } }).__maint.off());
  await expect(page.getByRole('alertdialog')).toHaveCount(0);
});

test('recovery reloads the SPA to pick up the fresh client', async ({ page }) => {
  await page.goto('/');
  await page.evaluate(() => (window as unknown as { __maint: { on(): void } }).__maint.on());
  await expect(page.getByRole('alertdialog')).toBeVisible();

  // Real recovery reloads the page (the deploy may have shipped an incompatible client, and the
  // running bundle is the old one). Wait for the forced navigation, then confirm the app
  // re-bootstrapped: the overlay is gone (the store reset by the reload) and the login is back.
  await Promise.all([
    page.waitForEvent('load'),
    page.evaluate(() => (window as unknown as { __maint: { recover(): void } }).__maint.recover()),
  ]);
  await expect(page.getByRole('alertdialog')).toHaveCount(0);
  await expect(page.getByRole('button', { name: /guest/i })).toBeVisible();
});
