import { test, expect } from '@playwright/test';
import { setupApiMocks, login, logout, TEST_USER } from './helpers';

test.describe('Authentication E2E', () => {
  test.beforeEach(async ({ page }) => {
    await setupApiMocks(page);
  });

  test('login form is rendered correctly', async ({ page }) => {
    await page.goto('/login');

    // Login page container visible
    await expect(page.locator('[data-testid="login-page"]')).toBeVisible();

    // Email and password inputs present
    await expect(page.locator('input[type="email"]')).toBeVisible();
    await expect(page.locator('input[type="password"]')).toBeVisible();

    // Submit button present
    await expect(page.locator('button[type="submit"]')).toBeVisible();

    // Logo / title visible
    await expect(page.locator('h1')).toContainText(/leocrm/i);
  });

  test('successful login redirects to dashboard', async ({ page }) => {
    await login(page);

    // Should be on dashboard
    await expect(page).toHaveURL(/\/dashboard/);
    await expect(page.locator('[data-testid="topbar"]')).toBeVisible();
    await expect(page.locator('[data-testid="app-shell"]')).toBeVisible();
  });

  test('login with invalid credentials shows error', async ({ page }) => {
    // Override login route to return 401
    await page.route('**/api/v1/auth/login', (route) => {
      route.fulfill({
        status: 401,
        contentType: 'application/json',
        body: JSON.stringify({ detail: 'Invalid credentials' }),
      });
    });

    await page.goto('/login');
    await page.locator('input[type="email"]').fill('wrong@test.test');
    await page.locator('input[type="password"]').fill('wrongpassword');
    await page.locator('button[type="submit"]').click();

    // Should stay on login page and show error
    await expect(page).toHaveURL(/\/login/);
    await expect(page.locator('[role="alert"]')).toBeVisible();
  });

  test('logout button works and redirects to login', async ({ page }) => {
    await login(page);

    // Open user menu
    await page.locator('[data-testid="topbar"] button[aria-haspopup="menu"]').click();

    // Click logout
    await page.locator('[role="menuitem"]').filter({ hasText: /logout|abmelden/i }).click();

    // Should redirect to login
    await expect(page).toHaveURL(/\/login/);
    await expect(page.locator('[data-testid="login-page"]')).toBeVisible();
  });

  test('protected route redirects to login when not authenticated', async ({ page }) => {
    // Try to access dashboard without login
    await page.goto('/dashboard');

    // Should redirect to login
    await expect(page).toHaveURL(/\/login/);
    await expect(page.locator('[data-testid="login-page"]')).toBeVisible();
  });
});
