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

// User feedback against the mock transport (no backend). The mock profile is a
// durable (non-guest) account, so the Settings → Info "Feedback" entry is shown.

async function loginLobby(page: Page): Promise<void> {
  await page.goto('/');
  await page.getByRole('button', { name: /guest/i }).click();
  await expect(page.getByText('Your turn')).toBeVisible();
}

// openFeedback navigates lobby ⚙️ → Info tab → the Feedback screen.
async function openFeedback(page: Page): Promise<void> {
  await page.getByRole('button', { name: /Settings/ }).click();
  await expect(page.locator('.pane')).toHaveCount(1);
  await page.getByRole('button', { name: 'Info', exact: true }).click();
  // The About "Feedback" button: its accessible name gains the "1" badge once a reply
  // is waiting, so match by substring rather than exact.
  await page.getByRole('button', { name: /Feedback/ }).click();
}

test('feedback: submit a message, then resend is blocked', async ({ page }) => {
  await loginLobby(page);
  await openFeedback(page);

  await expect(page.getByPlaceholder(/Describe the problem/)).toBeVisible();
  await page.locator('textarea').fill('The board does not render on my phone.');
  await page.getByRole('button', { name: 'Send', exact: true }).click();

  await expect(page.getByText('Your message has been sent.')).toBeVisible();
  await expect(page.getByRole('button', { name: 'Send', exact: true })).toBeDisabled();
});

test('feedback: an operator reply raises the badge and shows on the screen', async ({ page }) => {
  await loginLobby(page);

  // Simulate the operator answering: clears any pending message, sets the reply and
  // pushes the admin_reply live event.
  await page.evaluate(() => (window as unknown as { __mock: { adminReply(): void } }).__mock.adminReply());

  // The lobby ⚙️ badge folds the awaiting reply into its count.
  await expect(page.getByRole('button', { name: /Settings/ }).locator('.badge')).toBeVisible();

  await openFeedback(page);
  await expect(page.getByText('Reply to your last message')).toBeVisible();
  // A URL in the reply renders as a link that opens in a new tab.
  const link = page.getByRole('link', { name: 'https://example.com/help' });
  await expect(link).toBeVisible();
  await expect(link).toHaveAttribute('target', '_blank');
  await expect(link).toHaveAttribute('rel', /noopener/);
});

test('feedback: sending a new message clears the previous reply', async ({ page }) => {
  await loginLobby(page);
  await page.evaluate(() => (window as unknown as { __mock: { adminReply(): void } }).__mock.adminReply());
  await openFeedback(page);
  await expect(page.getByText('Reply to your last message')).toBeVisible();

  // A new message has no reply yet, so the previous reply must stop showing at once.
  await page.locator('textarea').fill('a follow-up question');
  await page.getByRole('button', { name: 'Send', exact: true }).click();
  await expect(page.getByText('Your message has been sent.')).toBeVisible();
  await expect(page.getByText('Reply to your last message')).toBeHidden();
});
