import { TIMEOUTS } from '../../utils/timeouts';
import { test, expect } from '../../utils/test-setup';
import { readFileSync } from 'fs';
import { join, dirname } from 'path';
import { fileURLToPath } from 'url';
import { selectRadixOptionAsync } from '@d8d/e2e-test-utils';

const __filename = fileURLToPath(import.meta.url);
const __dirname = dirname(__filename);
const testUsers = JSON.parse(readFileSync(join(__dirname, '../../fixtures/test-users.json'), 'utf-8'));

/**
 * 专门测试异步 Select 功能的简单测试
 * 用于验证 Story 2.3 的 selectRadixOptionAsync 实现
 */
test.describe.serial('异步 Select 测试 (Story 2.3)', () => {
  test.beforeEach(async ({ adminLoginPage, disabilityPersonPage }) => {
    // 以管理员身份登录后台
    await adminLoginPage.goto();
    await adminLoginPage.login(testUsers.admin.username, testUsers.admin.password);
    await adminLoginPage.expectLoginSuccess();
    await disabilityPersonPage.goto();
  });

  test('测试省份选择（异步加载）', async ({ disabilityPersonPage, page }) => {
    console.log('=== 开始测试省份选择 ===');

    // 点击新增按钮打开对话框
    await disabilityPersonPage.openCreateDialog();

    console.log('对话框已打开');

    // 使用 selectRadixOptionAsync 选择省份
    await selectRadixOptionAsync(page, '省份 *', '广东省');

    console.log('✓ 省份选择成功');

    // 验证城市选择器已启用（省份选择后城市应该可用了）
    const cityCombobox = page.getByRole('combobox', { name: '城市' });
    await expect(cityCombobox).not.toBeDisabled();

    console.log('✓ 城市选择器已启用');
  });

  test('测试城市选择（异步加载，依赖省份）', async ({ disabilityPersonPage, page }) => {
    console.log('=== 开始测试城市选择 ===');

    // 点击新增按钮打开对话框
    await disabilityPersonPage.openCreateDialog();

    // 先选择省份
    await selectRadixOptionAsync(page, '省份 *', '湖北省');
    console.log('✓ 省份选择成功');

    // 选择城市 - selectRadixOptionAsync 自动处理异步加载，无需 waitForTimeout hack
    await selectRadixOptionAsync(page, '城市', '武汉市');

    console.log('✓ 城市选择成功');
  });

  test('测试完整的省份+城市选择流程', async ({ disabilityPersonPage, page }) => {
    console.log('=== 开始完整流程测试 ===');

    // 点击新增按钮
    await disabilityPersonPage.openCreateDialog();

    // 填写一些基本信息以到达地址选择区域
    await page.getByLabel('姓名 *').fill('测试用户');
    await page.getByLabel('性别 *').selectOption('男');
    await page.getByLabel('身份证号 *').fill('110101199001011234');
    await page.getByLabel('残疾证号 *').fill('CJZ20240001');
    await page.getByLabel('联系电话 *').fill('13800138000');
    await page.getByLabel('身份证地址 *').fill('测试地址');

    console.log('✓ 基本信息已填写');

    // 测试省份选择（异步）
    const startTime1 = Date.now();
    await selectRadixOptionAsync(page, '省份 *', '广东省');
    const duration1 = Date.now() - startTime1;
    console.log(`✓ 省份选择成功，耗时: ${duration1}ms`);

    // 测试城市选择（异步，依赖省份）
    const startTime2 = Date.now();
    await selectRadixOptionAsync(page, '城市', '深圳市');
    const duration2 = Date.now() - startTime2;
    console.log(`✓ 城市选择成功，耗时: ${duration2}ms`);

    // 验证选择器性能（应该在合理时间内完成）
    // 根据 Dev Notes 规范：最大可接受时间为 5 秒
    expect(duration1).toBeLessThan(5000); // 省份选择应在 5 秒内完成
    expect(duration2).toBeLessThan(5000); // 城市选择应在 5 秒内完成

    console.log('✓ 性能验证通过');
  });

  test.describe('边界场景测试', () => {
    test('测试超时场景 - 无效的省份值', async ({ disabilityPersonPage, page }) => {
      console.log('=== 测试超时场景 ===');

      await disabilityPersonPage.openCreateDialog();

      // 尝试选择不存在的省份（应该触发超时或错误）
      let errorThrown = false;
      try {
        await selectRadixOptionAsync(page, '省份 *', '不存在的省份XYZ', { timeout: TIMEOUTS.ELEMENT_VISIBLE_SHORT });
      } catch (error: any) {
        errorThrown = true;
        console.log(`✓ 正确抛出错误: ${error.message}`);
        expect(error.message).toContain('selectRadixOptionAsync');
      }
      expect(errorThrown).toBe(true);
    });

    test('测试重复选择相同的省份', async ({ disabilityPersonPage, page }) => {
      console.log('=== 测试重复选择 ===');

      await disabilityPersonPage.openCreateDialog();

      // 第一次选择
      await selectRadixOptionAsync(page, '省份 *', '广东省');
      console.log('✓ 第一次选择成功');

      // 重复选择相同省份（应该正常工作）
      await selectRadixOptionAsync(page, '省份 *', '广东省');
      console.log('✓ 重复选择成功');
    });

    test('测试城市选择依赖 - 省份变化后城市可用性', async ({ disabilityPersonPage, page }) => {
      console.log('=== 测试省份变化场景 ===');

      await disabilityPersonPage.openCreateDialog();

      // 选择第一个省份
      await selectRadixOptionAsync(page, '省份 *', '广东省');
      await selectRadixOptionAsync(page, '城市', '广州市');
      console.log('✓ 广东省-广州市 选择成功');

      // 更换省份
      await selectRadixOptionAsync(page, '省份 *', '湖北省');
      await selectRadixOptionAsync(page, '城市', '武汉市');
      console.log('✓ 湖北省-武汉市 选择成功');
    });
  });
});
