import { test, expect } from '@playwright/test';
import { loginWithMagicLink } from './helpers/auth';
import { registerBaseApiMocks } from './helpers/mock-api';
import { agentUser } from './fixtures/users';

test.describe('Critical production flows (mocked API)', () => {
  test.beforeEach(async ({ page }) => {
    await registerBaseApiMocks(page);
  });

  test('1. OTP login', async ({ page }) => {
    await page.goto('/dashboard');
    await expect(page.getByRole('heading', { name: /dashboard/i })).toBeVisible();
  });

  test('2. Magic link request', async ({ page }) => {
    await loginWithMagicLink(page);
  });

  test('3. Invite accept flow', async ({ page }) => {
    await page.goto('/auth/accept-invite?token=test-token&email=invited@test.com');
    await page.getByLabel(/name/i).fill('Invited User');
    await page.getByRole('button', { name: /accept|join|continue/i }).click();
    await expect(page).toHaveURL(/\/(dashboard|login)/);
  });

  test('4. Create ticket', async ({ page }) => {
    await page.goto('/tickets/new');
    await expect(page.getByRole('heading', { name: /create|new ticket/i })).toBeVisible();
  });

  test('5. Reply with attachment (ticket detail)', async ({ page }) => {
    await page.goto('/tickets/ticket-1');
    await expect(page.locator('body')).toBeVisible();
  });

  test('6. Create department', async ({ page }) => {
    await page.goto('/admin/departments');
    await page.getByRole('button', { name: /add department/i }).click();
    await expect(page.getByRole('dialog')).toBeVisible();
  });

  test('7. Create user invite', async ({ page }) => {
    await page.goto('/admin/invites');
    await expect(page.getByRole('heading', { name: /invit/i })).toBeVisible();
  });

  test('8. Create SLA policy', async ({ page }) => {
    await page.goto('/settings/sla');
    await page.getByRole('button', { name: /add policy/i }).click();
    await expect(page.getByRole('dialog')).toBeVisible();
  });

  test('9. Update settings', async ({ page }) => {
    await page.goto('/settings');
    await expect(page.getByText(/app name|settings/i).first()).toBeVisible();
  });

  test('10. Notification mark-read', async ({ page }) => {
    await page.goto('/notifications');
    await expect(page.locator('body')).toBeVisible();
  });

  test('11. Realtime notification receive (UI shell)', async ({ page }) => {
    await page.goto('/dashboard');
    await expect(page.locator('header')).toBeVisible();
  });

  test('12. Session revoke', async ({ page }) => {
    await page.goto('/profile/sessions');
    await expect(page.getByText(/session/i).first()).toBeVisible();
  });
});

test.describe('Permission-aware navigation', () => {
  test.beforeEach(async ({ page }) => {
    await registerBaseApiMocks(page);
  });

  test('agent does not see super-admin companies link', async ({ page }) => {
    await page.goto('/dashboard');
    await expect(page.getByRole('link', { name: /companies/i })).toHaveCount(0);
  });

  test('super admin sees companies link', async ({ page }) => {
    const superUser = { ...agentUser, is_super_admin: true };
    await registerBaseApiMocks(page, superUser);
    await page.goto('/login');
    await page.getByTestId('login-email').fill(agentUser.email);
    await page.getByTestId('login-send-otp').click();
    await page.getByTestId('login-otp').locator('input[type="text"]').first().pressSequentially('123456');
    await page.getByTestId('login-verify-otp').click();
    await expect(page.getByRole('link', { name: /companies/i })).toBeVisible();
  });
});
