import { test, expect } from '../../utils/test-setup';
import { readFileSync } from 'fs';
import { join, dirname } from 'path';
import { fileURLToPath } from 'url';

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

// 超时配置常量
const TIMEOUTS = {
  SHORT: 300,
  MEDIUM: 500,
  LONG: 1000,
  DIALOG: 5000,
} as const;

/**
 * 生成唯一的测试数据（使用更大范围的随机值提高唯一性）
 */
function generateUniqueTestData(suffix: string) {
  const randomPart = Math.floor(Math.random() * Number.MAX_SAFE_INTEGER);
  const timestamp = Date.now();
  return {
    name: `银行卡${suffix}_${timestamp}_${randomPart}`,
    gender: randomPart % 2 === 0 ? '男' : '女',
    idCard: `42010119900101${String(randomPart % 10000).padStart(4, '0')}`,
    disabilityId: `511001199001${String(randomPart % 10000).padStart(4, '0')}`,
    disabilityType: ['视力残疾', '听力残疾', '言语残疾', '肢体残疾', '智力残疾', '精神残疾'][randomPart % 6],
    disabilityLevel: ['一级', '二级', '三级', '四级'][randomPart % 4],
    phone: `138${String(randomPart % 100000000).padStart(8, '0')}`,
    idAddress: `湖北省武汉市测试街道${randomPart % 100}号`,
    province: '湖北省',
    city: '武汉市'
  };
}

test.describe('残疾人管理 - 银行卡管理功能', () => {
  // 测试级别的时间戳，用于生成唯一数据
  const TEST_TIMESTAMP = Date.now();
  const TEST_PREFIX = `bankcard_${TEST_TIMESTAMP}`;

  // 用于跟踪已创建的测试数据，便于清理
  const createdTestData: Array<{ name: string; idCard: string }> = [];

  test.beforeEach(async ({ adminLoginPage, disabilityPersonPage }) => {
    // 每次测试前重置数据存储
    createdTestData.length = 0;

    // 以管理员身份登录后台
    await adminLoginPage.goto();
    await adminLoginPage.login(testUsers.admin.username, testUsers.admin.password);
    await adminLoginPage.expectLoginSuccess();
    await disabilityPersonPage.goto();
  });

  test.afterEach(async ({ disabilityPersonPage, page }) => {
    // 清理测试数据（添加超时保护以避免 afterEach 超过 60 秒）
    for (const data of createdTestData) {
      try {
        await disabilityPersonPage.goto().catch(() => {});
        await disabilityPersonPage.searchByName(data.name);
        // 为每个清理操作设置较短的超时时间
        const deleteButton = page.getByRole('button', { name: '删除' }).first();
        if (await deleteButton.count({ timeout: TIMEOUTS.VERY_LONG }) > 0) {
          await deleteButton.click({ timeout: TIMEOUTS.DIALOG });
          await page.getByRole('button', { name: '确认' }).click({ timeout: TIMEOUTS.DIALOG }).catch(() => {});
          await page.waitForTimeout(TIMEOUTS.MEDIUM);
        }
      } catch (error) {
        console.debug(`  ⚠ 清理数据失败: ${data.name}`, error);
      }
    }
    createdTestData.length = 0;
  });

  test('应该成功添加单张银行卡', async ({ disabilityPersonPage, page }) => {
    const testData = generateUniqueTestData('单张银行卡');
    createdTestData.push({ name: testData.name, idCard: testData.idCard });

    console.debug('\n========== 单张银行卡添加测试 ==========');

    // 打开对话框并填写基本信息
    await disabilityPersonPage.openCreateDialog();
    await disabilityPersonPage.fillBasicForm(testData);

    // 滚动到银行卡管理区域
    await disabilityPersonPage.scrollToSection('银行卡管理');

    // 添加银行卡
    const bankCard = {
      bankName: '中国工商银行',
      subBankName: '北京分行朝阳支行',
      cardNumber: '6222021234567890123',
      cardholderName: testData.name,
      isDefault: true,
    };
    await disabilityPersonPage.addBankCard(bankCard);

    // 验证银行卡已添加
    const bankCardList = await disabilityPersonPage.getBankCardList();
    expect(bankCardList).toHaveLength(1);
    console.debug('  ✓ 银行卡列表数量: 1');

    // 验证默认银行卡
    const defaultIndex = await disabilityPersonPage.getDefaultBankCardIndex();
    expect(defaultIndex).toBe(0);
    console.debug('  ✓ 默认银行卡索引: 0');

    console.debug('✅ 单张银行卡添加测试通过');
  });

  test('应该成功编辑银行卡信息', async ({ disabilityPersonPage, page }) => {
    const testData = generateUniqueTestData('编辑银行卡');
    createdTestData.push({ name: testData.name, idCard: testData.idCard });

    console.debug('\n========== 银行卡编辑测试 ==========');

    // 打开对话框并填写基本信息
    await disabilityPersonPage.openCreateDialog();
    await disabilityPersonPage.fillBasicForm(testData);

    // 添加原始银行卡
    const originalCard = {
      bankName: '中国工商银行',
      subBankName: '北京分行朝阳支行',
      cardNumber: '6222021234567890123',
      cardholderName: testData.name,
    };
    await disabilityPersonPage.addBankCard(originalCard);

    // 编辑银行卡
    const updatedCard = {
      bankName: '中国建设银行',
      subBankName: '上海分行浦东支行',
      cardNumber: '6227001234567890123',
    };
    await disabilityPersonPage.editBankCard(0, updatedCard);

    // 验证更新后的信息
    const bankCardList = await disabilityPersonPage.getBankCardList();
    expect(bankCardList).toHaveLength(1);

    // 验证银行卡号已更新（格式化后可能包含空格）
    const cardNumberInput = page.locator('[data-testid="card-number-input-0"]');
    const cardNumberValue = await cardNumberInput.inputValue();
    expect(cardNumberValue).toContain('6227');
    console.debug('  ✓ 银行卡号已更新');

    console.debug('✅ 银行卡编辑测试通过');
  });

  test('应该成功删除银行卡', async ({ disabilityPersonPage, page }) => {
    const testData = generateUniqueTestData('删除银行卡');
    createdTestData.push({ name: testData.name, idCard: testData.idCard });

    console.debug('\n========== 银行卡删除测试 ==========');

    // 打开对话框并填写基本信息
    await disabilityPersonPage.openCreateDialog();
    await disabilityPersonPage.fillBasicForm(testData);

    // 添加银行卡
    const bankCard = {
      bankName: '中国工商银行',
      subBankName: '北京分行朝阳支行',
      cardNumber: '6222021234567890123',
      cardholderName: testData.name,
    };
    await disabilityPersonPage.addBankCard(bankCard);

    // 验证银行卡存在
    let bankCardList = await disabilityPersonPage.getBankCardList();
    expect(bankCardList).toHaveLength(1);
    console.debug('  ✓ 银行卡已添加');

    // 删除银行卡
    await disabilityPersonPage.deleteBankCard(0);

    // 验证银行卡已被删除
    bankCardList = await disabilityPersonPage.getBankCardList();
    expect(bankCardList).toHaveLength(0);
    console.debug('  ✓ 银行卡已删除');

    console.debug('✅ 银行卡删除测试通过');
  });

  test('应该支持添加多张银行卡', async ({ disabilityPersonPage, page }) => {
    const testData = generateUniqueTestData('多张银行卡');
    createdTestData.push({ name: testData.name, idCard: testData.idCard });

    console.debug('\n========== 多张银行卡管理测试 ==========');

    // 打开对话框并填写基本信息
    await disabilityPersonPage.openCreateDialog();
    await disabilityPersonPage.fillBasicForm(testData);

    // 滚动到银行卡管理区域
    await disabilityPersonPage.scrollToSection('银行卡管理');

    // 添加三张银行卡
    await disabilityPersonPage.addBankCard({
      bankName: '中国工商银行',
      subBankName: '北京分行朝阳支行',
      cardNumber: '6222021234567890123',
      cardholderName: testData.name,
    });

    await disabilityPersonPage.addBankCard({
      bankName: '中国建设银行',
      subBankName: '上海分行浦东支行',
      cardNumber: '6227001234567890123',
      cardholderName: testData.name,
    });

    await disabilityPersonPage.addBankCard({
      bankName: '中国农业银行',
      subBankName: '广州分行天河支行',
      cardNumber: '6228481234567890123',
      cardholderName: testData.name,
    });

    // 验证所有银行卡都显示
    const bankCardList = await disabilityPersonPage.getBankCardList();
    expect(bankCardList).toHaveLength(3);
    console.debug('  ✓ 银行卡数量: 3');

    console.debug('✅ 多张银行卡管理测试通过');
  });

  test('应该能够设置默认银行卡', async ({ disabilityPersonPage, page }) => {
    const testData = generateUniqueTestData('默认银行卡');
    createdTestData.push({ name: testData.name, idCard: testData.idCard });

    console.debug('\n========== 默认银行卡设置测试 ==========');

    // 打开对话框并填写基本信息
    await disabilityPersonPage.openCreateDialog();
    await disabilityPersonPage.fillBasicForm(testData);

    // 滚动到银行卡管理区域
    await disabilityPersonPage.scrollToSection('银行卡管理');

    // 添加第一张银行卡（设为默认）
    await disabilityPersonPage.addBankCard({
      bankName: '中国工商银行',
      subBankName: '北京分行朝阳支行',
      cardNumber: '6222021234567890123',
      cardholderName: testData.name,
      isDefault: true,
    });

    // 添加第二张银行卡（不设为默认）
    await disabilityPersonPage.addBankCard({
      bankName: '中国建设银行',
      subBankName: '上海分行浦东支行',
      cardNumber: '6227001234567890123',
      cardholderName: testData.name,
      isDefault: false,
    });

    // 验证默认银行卡是第一张（索引0）
    const defaultIndex = await disabilityPersonPage.getDefaultBankCardIndex();
    expect(defaultIndex).toBe(0);
    console.debug('  ✓ 默认银行卡是第一张');

    // 将第二张设为默认
    await disabilityPersonPage.editBankCard(1, { isDefault: true });
    await page.waitForTimeout(TIMEOUTS.SHORT);

    // 验证默认银行卡变为第二张，第一张不再是默认
    const defaultSwitch0 = page.locator('[data-testid="default-card-switch-0"]');
    const defaultSwitch1 = page.locator('[data-testid="default-card-switch-1"]');
    const isDefault0 = await defaultSwitch0.isChecked();
    const isDefault1 = await defaultSwitch1.isChecked();

    expect(isDefault0).toBe(false);
    expect(isDefault1).toBe(true);
    console.debug('  ✓ 默认银行卡已切换到第二张');

    console.debug('✅ 默认银行卡设置测试通过');
  });

  test('应该支持选择银行卡类型', async ({ disabilityPersonPage, page }) => {
    const testData = generateUniqueTestData('银行卡类型');
    createdTestData.push({ name: testData.name, idCard: testData.idCard });

    console.debug('\n========== 银行卡类型选择测试 ==========');

    // 打开对话框并填写基本信息
    await disabilityPersonPage.openCreateDialog();
    await disabilityPersonPage.fillBasicForm(testData);

    // 添加一类卡
    await disabilityPersonPage.addBankCard({
      bankName: '中国工商银行',
      subBankName: '北京分行朝阳支行',
      cardNumber: '6222021234567890123',
      cardholderName: testData.name,
      cardType: '一类卡',
    });

    // 验证银行卡类型
    const cardTypeTrigger = page.locator('[data-testid="card-type-select-0"]');
    const selectedText = await cardTypeTrigger.textContent();
    expect(selectedText).toContain('一类卡');
    console.debug('  ✓ 银行卡类型: 一类卡');

    console.debug('✅ 银行卡类型选择测试通过');
  });

  test('应该限制最多添加5张银行卡', async ({ disabilityPersonPage, page }) => {
    const testData = generateUniqueTestData('银行卡数量限制');
    createdTestData.push({ name: testData.name, idCard: testData.idCard });

    console.debug('\n========== 银行卡数量限制测试 ==========');

    // 打开对话框并填写基本信息
    await disabilityPersonPage.openCreateDialog();
    await disabilityPersonPage.fillBasicForm(testData);

    // 滚动到银行卡管理区域
    await disabilityPersonPage.scrollToSection('银行卡管理');

    // 尝试添加5张银行卡
    const banks = ['中国工商银行', '中国建设银行', '中国农业银行', '中国银行', '交通银行'];
    for (let i = 0; i < 5; i++) {
      await disabilityPersonPage.addBankCard({
        bankName: banks[i],
        subBankName: `${i}分行`,
        cardNumber: `622202123456789${String(i).padStart(3, '0')}`,
        cardholderName: testData.name,
      });
    }

    // 验证有5张银行卡
    let bankCardCount = await disabilityPersonPage.getBankCardCount();
    expect(bankCardCount).toBe(5);
    console.debug('  ✓ 已添加 5 张银行卡');

    // 尝试添加第6张银行卡
    const isDisabled = await disabilityPersonPage.isAddBankCardButtonDisabled();
    expect(isDisabled).toBe(true);
    console.debug('  ✓ 添加按钮已禁用（达到最大数量）');

    console.debug('✅ 银行卡数量限制测试通过');
  });

  test('完整流程：添加多张银行卡并提交', async ({ disabilityPersonPage, page }) => {
    const testData = generateUniqueTestData('完整流程');
    createdTestData.push({ name: testData.name, idCard: testData.idCard });

    console.debug('\n========== 银行卡完整流程测试 ==========');

    // 打开对话框并填写基本信息
    await disabilityPersonPage.openCreateDialog();
    await disabilityPersonPage.fillBasicForm(testData);

    // 滚动到银行卡管理区域
    await disabilityPersonPage.scrollToSection('银行卡管理');

    // 添加多张银行卡
    await disabilityPersonPage.addBankCard({
      bankName: '中国工商银行',
      subBankName: '北京分行朝阳支行',
      cardNumber: '6222021234567890123',
      cardholderName: testData.name,
      cardType: '一类卡',
      isDefault: true,
    });

    await disabilityPersonPage.addBankCard({
      bankName: '中国建设银行',
      subBankName: '上海分行浦东支行',
      cardNumber: '6227001234567890123',
      cardholderName: testData.name,
      cardType: '二类卡',
    });

    // 验证银行卡数量
    const bankCardList = await disabilityPersonPage.getBankCardList();
    expect(bankCardList).toHaveLength(2);

    // 提交表单
    const result = await disabilityPersonPage.submitForm();

    console.debug('\n========== 测试结果 ==========');
    console.debug('有错误提示:', result.hasError);
    console.debug('有成功提示:', result.hasSuccess);

    if (result.hasError) {
      console.debug('错误消息:', result.errorMessage);
    }

    if (result.hasSuccess) {
      console.debug('成功消息:', result.successMessage);
    }

    // 验证对话框关闭
    await disabilityPersonPage.waitForDialogClosed();

    // 刷新页面并验证数据创建成功（修复稳定性问题）
    await page.reload();
    await page.waitForLoadState('networkidle');
    await disabilityPersonPage.goto();
    await disabilityPersonPage.searchByName(testData.name);
    // 增加等待时间以确保数据已持久化
    await page.waitForTimeout(TIMEOUTS.EXTENDED);

    const personExists = await disabilityPersonPage.personExists(testData.name);
    console.debug('数据创建成功:', personExists);
    expect(personExists).toBe(true);

    console.debug('✅ 银行卡完整流程测试完成');
  });
});
