/**
 * 数据迁移脚本：将拒绝操作导致的 TERMINATED 改为 REJECTED
 * 
 * 问题：
 * - 旧版本代码将拒绝操作最终设置为 TERMINATED 状态
 * - 新版本应该设置为 REJECTED 状态
 * 
 * 迁移逻辑：
 * - 查找所有 status = TERMINATED 且 有 REJECT 操作日志的记录
 * - 将这些记录的 status 更新为 REJECTED
 */

import { PrismaClient } from '@prisma/client';

const prisma = new PrismaClient();

async function main() {
  console.log('='.repeat(80));
  console.log('📊 数据迁移：TERMINATED (拒绝) → REJECTED');
  console.log('='.repeat(80));

  try {
    // 1️⃣ 查找需要迁移的记录
    console.log('\n1️⃣ 查找需要迁移的记录...');
    
    // 查找有 REJECT 操作的 TERMINATED 流程
    const rejectLogs = await prisma.approvalTaskLog.findMany({
      where: {
        action: 'REJECT',
      },
      select: {
        instanceId: true,
      },
      distinct: ['instanceId'],
    });

    const rejectInstanceIds = rejectLogs.map(log => log.instanceId);

    const instances = await prisma.approvalInstance.findMany({
      where: {
        status: 'TERMINATED',
        id: { in: rejectInstanceIds },
      },
      include: {
        initiator: {
          select: {
            displayName: true,
          },
        },
      },
    });

    // 获取拒绝日志
    const rejectLogsMap = new Map<string, Date>();
    const allRejectLogs = await prisma.approvalTaskLog.findMany({
      where: {
        instanceId: { in: instances.map(i => i.id) },
        action: 'REJECT',
      },
      select: {
        instanceId: true,
        actionTime: true,
      },
      orderBy: {
        actionTime: 'asc',
      },
    });

    allRejectLogs.forEach(log => {
      if (!rejectLogsMap.has(log.instanceId)) {
        rejectLogsMap.set(log.instanceId, log.actionTime);
      }
    });

    console.log(`\n   ✅ 共找到 ${instances.length} 条需要迁移的记录：\n`);

    if (instances.length === 0) {
      console.log('   没有需要迁移的记录，退出。');
      return;
    }

    // 显示详情
    instances.forEach((instance, index) => {
      console.log(`   ${index + 1}. [${instance.id.slice(0, 8)}] ${instance.title}`);
      console.log(`      发起人: ${instance.initiator?.displayName || '未知'}`);
      console.log(`      当前状态: ${instance.status}`);
      console.log(`      结束原因: ${instance.endReason || '无'}`);
      console.log(`      创建时间: ${instance.startTime.toLocaleString('zh-CN')}`);
      const rejectTime = rejectLogsMap.get(instance.id);
      if (rejectTime) {
        console.log(`      拒绝时间: ${rejectTime.toLocaleString('zh-CN')}`);
      }
      console.log('');
    });

    // 2️⃣ 执行迁移
    console.log('='.repeat(80));
    console.log('2️⃣ 开始迁移...\n');

    const result = await prisma.approvalInstance.updateMany({
      where: {
        id: { in: instances.map(i => i.id) },
      },
      data: {
        status: 'REJECTED',
      },
    });

    console.log(`   ✅ 成功更新 ${result.count} 条记录\n`);

    // 3️⃣ 验证结果
    console.log('='.repeat(80));
    console.log('3️⃣ 验证迁移结果...\n');

    const verifyInstances = await prisma.approvalInstance.findMany({
      where: {
        id: { in: instances.map(i => i.id) },
      },
      select: {
        id: true,
        title: true,
        status: true,
      },
    });

    const successCount = verifyInstances.filter(i => i.status === 'REJECTED').length;
    console.log(`   ✅ 验证通过：${successCount}/${verifyInstances.length} 条记录状态为 REJECTED\n`);

    if (successCount === verifyInstances.length) {
      console.log('='.repeat(80));
      console.log('✅ 迁移成功！');
      console.log('='.repeat(80));
    } else {
      console.error('❌ 部分记录迁移失败，请检查日志');
    }

  } catch (error) {
    console.error('\n❌ 迁移失败：', error);
    throw error;
  } finally {
    await prisma.$disconnect();
  }
}

main()
  .catch((error) => {
    console.error(error);
    process.exit(1);
  });

