import { test, expect } from '@playwright/test';

test.describe('核心业务流程', () => {
  test.beforeEach(async ({ page }) => {
    // 每个测试前导航到登录页
    await page.goto('/login');
  });

  test('采购商登录并查看仪表盘', async ({ page }) => {
    // 验证登录页面加载
    await expect(page).toHaveURL(/.*login/);
    await expect(page.locator('h1')).toContainText('登录');

    // 由于需要真实账号，这里只验证页面结构
    await expect(page.locator('input[name="username"]')).toBeVisible();
    await expect(page.locator('input[name="password"]')).toBeVisible();
    await expect(page.locator('button[type="submit"]')).toBeVisible();
  });

  test('角色选择页面', async ({ page }) => {
    await page.goto('/role-select');
    
    // 验证角色选择页面
    await expect(page.locator('h1')).toContainText('选择角色');
    await expect(page.locator('text=采购商/布行')).toBeVisible();
    await expect(page.locator('text=纺织厂')).toBeVisible();
    await expect(page.locator('text=水洗厂')).toBeVisible();
  });

  test('注册页面表单验证', async ({ page }) => {
    await page.goto('/register');
    
    // 验证注册页面
    await expect(page.locator('h1')).toContainText('注册');
    
    // 尝试提交空表单
    await page.click('button[type="submit"]');
    
    // 验证表单验证（假设有必填验证）
    await expect(page.locator('input[name="username"]')).toBeVisible();
    await expect(page.locator('input[name="password"]')).toBeVisible();
    await expect(page.locator('input[name="confirmPassword"]')).toBeVisible();
  });

  test('页面导航和路由', async ({ page }) => {
    // 测试路由导航
    await page.goto('/login');
    await expect(page).toHaveURL(/.*login/);

    // 测试 404 回退
    await page.goto('/non-existent-page');
    // 应该显示登录页或 404
    await expect(page.locator('body')).toBeVisible();
  });

  test('响应式布局 - 移动端适配', async ({ page }) => {
    // 设置移动端视口
    await page.setViewportSize({ width: 375, height: 667 });
    await page.goto('/login');

    // 验证移动端布局
    await expect(page.locator('body')).toBeVisible();
    
    // 检查是否有移动端特定的样式或元素
    const body = page.locator('body');
    await expect(body).toBeVisible();
  });

  test('网络状态提示组件', async ({ page }) => {
    await page.goto('/login');

    // 模拟离线状态
    await page.context().setOffline(true);
    
    // 等待离线提示出现
    await page.waitForTimeout(500);
    
    // 恢复网络
    await page.context().setOffline(false);
  });
});

test.describe('页面加载性能', () => {
  test('首页加载时间', async ({ page }) => {
    const startTime = Date.now();
    await page.goto('/login');
    const loadTime = Date.now() - startTime;
    
    // 验证页面在合理时间内加载
    expect(loadTime).toBeLessThan(5000);
    
    // 验证关键元素渲染
    await expect(page.locator('h1')).toBeVisible();
  });

  test('资源加载无错误', async ({ page }) => {
    const errors: string[] = [];
    
    page.on('console', (msg) => {
      if (msg.type() === 'error') {
        errors.push(msg.text());
      }
    });

    page.on('pageerror', (error) => {
      errors.push(error.message);
    });

    await page.goto('/login');
    await page.waitForLoadState('networkidle');

    // 允许一些预期的错误（如 API 调用）
    const unexpectedErrors = errors.filter(e => 
      !e.includes('supabase') && 
      !e.includes('api') &&
      !e.includes('favicon')
    );
    
    expect(unexpectedErrors).toHaveLength(0);
  });
});

test.describe('无障碍测试', () => {
  test('登录页表单可访问性', async ({ page }) => {
    await page.goto('/login');

    // 检查表单元素是否有正确的标签
    const usernameInput = page.locator('input[name="username"]');
    const passwordInput = page.locator('input[name="password"]');
    
    await expect(usernameInput).toHaveAttribute('placeholder');
    await expect(passwordInput).toHaveAttribute('placeholder');

    // 检查按钮可点击
    const submitButton = page.locator('button[type="submit"]');
    await expect(submitButton).toBeEnabled();
  });

  test('键盘导航', async ({ page }) => {
    await page.goto('/login');

    // 使用 Tab 键导航
    await page.keyboard.press('Tab');
    await expect(page.locator('input[name="username"]"]')).toBeFocused();

    await page.keyboard.press('Tab');
    await expect(page.locator('input[name="password"]"]')).toBeFocused();
  });
});
