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,
  VERY_SHORT: 200,
} 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 = `visit_${TEST_TIMESTAMP}`;

  // 测试级别的数据存储，避免可变全局状态
  let createdTestData: Array<{ name: string; idCard: string }> = [];

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

    // 以管理员身份登录后台
    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.SHORT);
        }
      } catch (error) {
        console.debug(`  ⚠ 清理数据失败: ${data.name}`, error);
      }
    }
    createdTestData.length = 0;
  });

  test('应该成功创建电话回访记录', async ({ disabilityPersonPage }) => {
    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 today = new Date().toISOString().split('T')[0];
    await disabilityPersonPage.addVisit({
      visitDate: today,
      visitType: '电话回访',
      visitContent: `电话回访测试内容_${testData.name}`,
      visitResult: '良好',
    });

    // 验证回访记录出现在列表中
    const visitCount = await disabilityPersonPage.getVisitCount();
    expect(visitCount).toBe(1);
    console.debug('  ✓ 电话回访记录已添加');

    console.debug('✅ 电话回访记录测试通过');
  });

  test('应该成功创建上门回访记录', async ({ disabilityPersonPage }) => {
    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 today = new Date().toISOString().split('T')[0];
    await disabilityPersonPage.addVisit({
      visitDate: today,
      visitType: '上门回访',
      visitContent: `上门回访测试内容_${testData.name}`,
      visitResult: '需要跟进',
    });

    // 验证回访记录出现在列表中
    const visitCount = await disabilityPersonPage.getVisitCount();
    expect(visitCount).toBe(1);
    console.debug('  ✓ 上门回访记录已添加');

    console.debug('✅ 上门回访记录测试通过');
  });

  test('应该成功创建视频回访记录', async ({ disabilityPersonPage }) => {
    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 today = new Date().toISOString().split('T')[0];
    await disabilityPersonPage.addVisit({
      visitDate: today,
      visitType: '视频回访',
      visitContent: `视频回访测试内容_${testData.name}`,
      visitResult: '正常',
    });

    // 验证回访记录出现在列表中
    const visitCount = await disabilityPersonPage.getVisitCount();
    expect(visitCount).toBe(1);
    console.debug('  ✓ 视频回访记录已添加');

    console.debug('✅ 视频回访记录测试通过');
  });

  test('应该成功编辑回访记录内容', async ({ disabilityPersonPage }) => {
    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 today = new Date().toISOString().split('T')[0];
    await disabilityPersonPage.addVisit({
      visitDate: today,
      visitType: '电话回访',
      visitContent: `原始内容_${testData.name}`,
    });

    // 编辑回访内容
    const updatedContent = `更新后的回访内容_${testData.name}`;
    await disabilityPersonPage.editVisit(0, { visitContent: updatedContent });

    // 验证更新后的内容 - 确保旧文本完全被替换
    const visitList = await disabilityPersonPage.getVisitList();
    expect(visitList[0].visitContent).toContain('更新后的回访内容');
    expect(visitList[0].visitContent).not.toContain('原始内容');
    console.debug('  ✓ 回访内容已编辑');

    console.debug('✅ 编辑回访记录内容测试通过');
  });

  test('应该成功编辑回访类型', async ({ disabilityPersonPage }) => {
    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 today = new Date().toISOString().split('T')[0];
    await disabilityPersonPage.addVisit({
      visitDate: today,
      visitType: '电话回访',
      visitContent: `测试内容_${testData.name}`,
    });

    // 编辑回访类型
    await disabilityPersonPage.editVisit(0, { visitType: '上门回访' });

    // 验证更新后的类型
    const visitList = await disabilityPersonPage.getVisitList();
    expect(visitList[0].visitType).toBe('上门回访');
    console.debug('  ✓ 回访类型已编辑');

    console.debug('✅ 编辑回访类型测试通过');
  });

  test('应该成功编辑回访日期', async ({ disabilityPersonPage }) => {
    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 today = new Date().toISOString().split('T')[0];
    await disabilityPersonPage.addVisit({
      visitDate: today,
      visitType: '电话回访',
      visitContent: `测试内容_${testData.name}`,
    });

    // 编辑回访日期为昨天
    const yesterday = new Date(Date.now() - 86400000).toISOString().split('T')[0];
    await disabilityPersonPage.editVisit(0, { visitDate: yesterday });

    // 验证更新后的日期
    const visitList = await disabilityPersonPage.getVisitList();
    expect(visitList[0].visitDate).toBe(yesterday);
    console.debug('  ✓ 回访日期已编辑');

    console.debug('✅ 编辑回访日期测试通过');
  });

  test('应该成功删除回访记录', async ({ disabilityPersonPage }) => {
    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 today = new Date().toISOString().split('T')[0];
    await disabilityPersonPage.addVisit({
      visitDate: today,
      visitType: '电话回访',
      visitContent: `待删除内容_${testData.name}`,
    });

    // 验证回访存在
    let visitCount = await disabilityPersonPage.getVisitCount();
    expect(visitCount).toBe(1);
    console.debug('  ✓ 回访记录已添加');

    // 删除回访
    await disabilityPersonPage.deleteVisit(0);

    // 验证回访已被删除
    visitCount = await disabilityPersonPage.getVisitCount();
    expect(visitCount).toBe(0);
    console.debug('  ✓ 回访记录已删除');

    console.debug('✅ 删除回访记录测试通过');
  });

  test('应该支持添加多条回访记录', async ({ disabilityPersonPage }) => {
    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 today = new Date().toISOString().split('T')[0];
    await disabilityPersonPage.addVisit({
      visitDate: today,
      visitType: '电话回访',
      visitContent: `回访1_${testData.name}`,
    });
    await disabilityPersonPage.addVisit({
      visitDate: today,
      visitType: '上门回访',
      visitContent: `回访2_${testData.name}`,
    });
    await disabilityPersonPage.addVisit({
      visitDate: today,
      visitType: '视频回访',
      visitContent: `回访3_${testData.name}`,
    });

    // 验证所有回访都显示
    const visitCount = await disabilityPersonPage.getVisitCount();
    expect(visitCount).toBe(3);
    console.debug('  ✓ 已添加 3 条回访记录');

    console.debug('✅ 添加多条回访记录测试通过');
  });

  test('应该限制最多添加10条回访记录', async ({ disabilityPersonPage }) => {
    const testData = generateUniqueTestData('回访限制');
    createdTestData.push({ name: testData.name, idCard: testData.idCard });

    console.debug('\n========== 回访记录数量限制测试 ==========');

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

    // 滚动到回访管理区域
    await disabilityPersonPage.scrollToSection('回访记录管理');

    // 添加10条回访记录
    const today = new Date().toISOString().split('T')[0];
    for (let i = 0; i < 10; i++) {
      await disabilityPersonPage.addVisit({
        visitDate: today,
        visitType: '电话回访',
        visitContent: `回访${i + 1}_${testData.name}`,
      });
    }

    // 验证有10条回访
    const visitCount = await disabilityPersonPage.getVisitCount();
    expect(visitCount).toBe(10);
    console.debug('  ✓ 已添加 10 条回访记录');

    // 验证添加按钮被禁用
    const isDisabled = await disabilityPersonPage.isAddVisitButtonDisabled();
    expect(isDisabled).toBe(true);
    console.debug('  ✓ 添加按钮已禁用（达到最大数量）');

    console.debug('✅ 回访记录数量限制测试通过');
  });

  test('应该正确显示回访记录历史', async ({ disabilityPersonPage }) => {
    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 today = new Date().toISOString().split('T')[0];
    await disabilityPersonPage.addVisit({
      visitDate: today,
      visitType: '电话回访',
      visitContent: `第一次回访_${testData.name}`,
      visitResult: '良好',
    });
    await disabilityPersonPage.addVisit({
      visitDate: today,
      visitType: '上门回访',
      visitContent: `第二次回访_${testData.name}`,
      visitResult: '需要跟进',
    });

    // 验证回访列表
    const visitList = await disabilityPersonPage.getVisitList();
    expect(visitList).toHaveLength(2);
    expect(visitList[0].visitContent).toContain('第一次回访');
    expect(visitList[1].visitContent).toContain('第二次回访');
    console.debug('  ✓ 回访记录历史正确显示');

    console.debug('✅ 回访记录历史测试通过');
  });

  test('应该正确获取回访记录详情', async ({ disabilityPersonPage }) => {
    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 today = new Date().toISOString().split('T')[0];
    const testVisit = {
      visitDate: today,
      visitType: '微信回访',
      visitContent: `完整测试_${testData.name}`,
      visitResult: '已完成',
    };

    await disabilityPersonPage.addVisit(testVisit);

    // 验证回访详情
    const visitList = await disabilityPersonPage.getVisitList();
    expect(visitList).toHaveLength(1);
    expect(visitList[0].visitType).toBe('微信回访');
    expect(visitList[0].visitResult).toBe('已完成');
    console.debug('  ✓ 回访记录详情正确');

    console.debug('✅ 回访记录详情测试通过');
  });

  test('应该支持设置下次回访日期', async ({ disabilityPersonPage }) => {
    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 today = new Date().toISOString().split('T')[0];
    const nextWeek = new Date(Date.now() + 7 * 86400000).toISOString().split('T')[0];

    await disabilityPersonPage.addVisit({
      visitDate: today,
      visitType: '电话回访',
      visitContent: `测试内容_${testData.name}`,
      nextVisitDate: nextWeek,
    });

    // 验证下次回访日期
    const visitList = await disabilityPersonPage.getVisitList();
    expect(visitList[0].nextVisitDate).toBe(nextWeek);
    console.debug('  ✓ 下次回访日期已设置');

    console.debug('✅ 下次回访日期测试通过');
  });

  test('应该成功编辑回访结果（状态管理）', async ({ disabilityPersonPage }) => {
    const testData = generateUniqueTestData('回访状态管理');
    createdTestData.push({ name: testData.name, idCard: testData.idCard });

    console.debug('\n========== 回访状态管理测试（AC #4） ==========');

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

    // 滚动到回访管理区域
    await disabilityPersonPage.scrollToSection('回访记录管理');

    // 添加回访，初始状态为"需要跟进"
    const today = new Date().toISOString().split('T')[0];
    await disabilityPersonPage.addVisit({
      visitDate: today,
      visitType: '电话回访',
      visitContent: `测试内容_${testData.name}`,
      visitResult: '需要跟进',
    });

    // 验证初始状态
    const visitListBefore = await disabilityPersonPage.getVisitList();
    expect(visitListBefore[0].visitResult).toBe('需要跟进');
    console.debug('  ✓ 初始回访结果: 需要跟进');

    // 编辑回访结果为"已完成"（标记回访为已完成）
    await disabilityPersonPage.editVisit(0, { visitResult: '已完成' });

    // 验证状态已更新
    const visitListAfter = await disabilityPersonPage.getVisitList();
    expect(visitListAfter[0].visitResult).toBe('已完成');
    console.debug('  ✓ 回访结果已更新为: 已完成');

    console.debug('✅ 回访状态管理测试通过（AC #4）');
  });
});
