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

const prisma = new PrismaClient();

/**
 * 钉钉同步任务种子数据
 */
export const DINGTALK_TASK_SEEDS = [
  {
    code: 'DINGTALK_BUSINESS_TRIP',
    name: '出差同步',
    description: '将宜搭出差申请及变更同步到钉钉考勤',
    scheduleType: 'CRON',
    scheduleConfig: { cron: '0 15,45 * * * *', timezone: 'Asia/Shanghai' },
  },
  {
    code: 'DINGTALK_FIELD_APPLICATION',
    name: '外勤同步',
    description: '将宜搭外勤申请同步到钉钉考勤',
    scheduleType: 'CRON',
    scheduleConfig: { cron: '0 15,45 * * * *', timezone: 'Asia/Shanghai' },
  },
  {
    code: 'DINGTALK_OVERTIME',
    name: '加班同步',
    description: '将宜搭加班确认同步到钉钉考勤（加班转调休）',
    scheduleType: 'CRON',
    scheduleConfig: { cron: '0 15,45 * * * *', timezone: 'Asia/Shanghai' },
  },
  {
    code: 'DINGTALK_EMPLOYEE_INFO',
    name: '员工信息同步',
    description: '钉钉HR员工信息同步到宜搭表单（每周更新）',
    scheduleType: 'CRON',
    scheduleConfig: { cron: '0 11 1 * * *', timezone: 'Asia/Shanghai' },
  },
  {
    code: 'DINGTALK_EMPLOYEE_INFO_OLD',
    name: '员工信息同步(旧表)',
    description: '钉钉HR员工信息同步到宜搭旧表',
    scheduleType: 'CRON',
    scheduleConfig: { cron: '0 11 2 * * *', timezone: 'Asia/Shanghai' },
  },
  {
    code: 'DINGTALK_ANNUAL_LEAVE',
    name: '年假释放',
    description: '根据工龄/司龄计算并释放年假到钉钉',
    scheduleType: 'CRON',
    scheduleConfig: { cron: '0 11 3 * * *', timezone: 'Asia/Shanghai' },
  },
  {
    code: 'DINGTALK_LEAVE_EXTENSION',
    name: '假期延期',
    description: '处理宜搭假期延期申请并更新钉钉假期额度',
    scheduleType: 'CRON',
    scheduleConfig: { cron: '0 15,45 * * * *', timezone: 'Asia/Shanghai' },
  },
  {
    code: 'DINGTALK_LEAVE_REMINDER',
    name: '假期到期提醒',
    description: '每周五通知即将到期的假期延期',
    scheduleType: 'CRON',
    scheduleConfig: { cron: '0 1 0 * * 5', timezone: 'Asia/Shanghai' },
  },
];

/**
 * 钉钉假期代码种子数据
 */
export const DINGTALK_LEAVE_CODE_SEEDS = [
  { code: 'c9c787fa-fa50-4939-80a5-6cdd0c581363', name: '事假', category: 'personal' },
  { code: '7fd33167-f7f6-4b0f-8cbb-de16b0532c54', name: '婚假', category: 'personal' },
  { code: '8f8906c6-a25f-4585-bbc6-6a8188e02bd4', name: '2022年年假', year: 2022, category: 'annual' },
  { code: '013d5813-397b-465b-8ae3-898986ab8ca9', name: '2023年年假', year: 2023, category: 'annual' },
  { code: '7f12966b-3171-46aa-95fa-ea8947f0676e', name: '2024年年假', year: 2024, category: 'annual' },
  { code: '22f7226b-9aa2-4e14-a30d-8edee7064168', name: '2025年年假', year: 2025, category: 'annual' },
  { code: '1aee43b7-e9be-4d96-91a4-8782207588f5', name: '调休(旧)', category: 'comp' },
  { code: '3346746d-bfb4-4ffe-8f87-0e09e6d50ccd', name: '调休假', category: 'comp' },
  { code: 'af2b528c-5882-4a88-b684-fcf0f95080b5', name: '病假', category: 'medical' },
  { code: '2dbc4cf9-d2d3-4c47-b34e-ca0598cecfd5', name: '产假', category: 'maternity' },
  { code: '94c39863-d073-451a-8568-79f3875c8c31', name: '产检假', category: 'maternity' },
  { code: '43f6b454-e04b-4be3-9fa1-ed950d6f644e', name: '难产假', category: 'maternity' },
  { code: '9d59773b-6654-415a-b341-c37352162ea4', name: '陪产假', category: 'maternity' },
  { code: 'f79fe2af-a50e-482e-973f-f7775fbfa087', name: '育儿假', category: 'maternity' },
  { code: '1e3c9463-83f8-41c0-bde0-ff2b79674d5b', name: '丧假', category: 'personal' },
  { code: '369a6b68-47a1-4b1e-8845-c2faf979854c', name: '独生子女护理假', category: 'personal' },
];

/**
 * 种子函数：初始化钉钉同步任务和假期代码
 */
export async function seedDingtalkSync() {
  console.log('🔄 Seeding DingTalk sync tasks...');

  for (const task of DINGTALK_TASK_SEEDS) {
    await prisma.automationTask.upsert({
      where: { code: task.code },
      update: {
        name: task.name,
        description: task.description,
        scheduleType: task.scheduleType,
        scheduleConfig: task.scheduleConfig,
      },
      create: {
        code: task.code,
        name: task.name,
        description: task.description,
        type: 'DINGTALK_SYNC',
        scheduleType: task.scheduleType,
        scheduleConfig: task.scheduleConfig,
      },
    });
  }
  console.log(`  ✅ ${DINGTALK_TASK_SEEDS.length} automation tasks`);

  console.log('🔄 Seeding DingTalk leave codes...');
  for (const leave of DINGTALK_LEAVE_CODE_SEEDS) {
    await prisma.dingtalkLeaveCode.upsert({
      where: { code: leave.code },
      update: {
        name: leave.name,
        year: leave.year ?? null,
        category: leave.category,
      },
      create: {
        code: leave.code,
        name: leave.name,
        year: leave.year ?? null,
        category: leave.category,
      },
    });
  }
  console.log(`  ✅ ${DINGTALK_LEAVE_CODE_SEEDS.length} leave codes`);
}

if (require.main === module) {
  seedDingtalkSync()
    .then(() => { console.log('✅ DingTalk sync seed completed'); process.exit(0); })
    .catch((e) => { console.error('❌ Error seeding dingtalk sync:', e); process.exit(1); })
    .finally(async () => { await prisma.$disconnect(); });
}
