/**
 * 议程模块 demo 数据 seed（dev/test 环境手测用）
 *
 * 跑法：
 *   cd backend && set -a && source .env && set +a
 *   npx ts-node --transpile-only -r tsconfig-paths/register prisma/seed/demo-meetings.ts
 *
 * 幂等：先按 demo_ 前缀清，再插入。重复跑安全。
 *
 * 复刻 `工作簿2.xlsx` (FFAI EC Meeting 05/18/2026) 完整议程作为唯一 demo 会议
 */

import { PrismaClient } from '@prisma/client';
import * as bcrypt from 'bcrypt';

const prisma = new PrismaClient();

async function main() {
  const org = await prisma.organization.findFirst({ where: { code: 'FF' } });
  if (!org) throw new Error('Organization FF not found — run init:itadmin first');
  const itadmin = await prisma.user.findFirst({ where: { username: 'itadmin' } });
  if (!itadmin) throw new Error('itadmin not found — run init:itadmin first');
  const employeeRole = await prisma.role.findFirst({ where: { code: 'Employee' } });
  if (!employeeRole) throw new Error('Employee role not found — run db:seed first');

  // 1. cleanup
  await prisma.meetingAgendaItemAttachment.deleteMany({
    where: { uploadedBy: { username: { startsWith: 'demo_' } } },
  });
  await prisma.meetingAttachment.deleteMany({
    where: { uploadedBy: { username: { startsWith: 'demo_' } } },
  });
  await prisma.meetingAgendaItemUploadTask.deleteMany({
    where: { agendaItem: { section: { meeting: { title: { startsWith: '[DEMO]' } } } } },
  });
  await prisma.meetingAgendaItem.deleteMany({
    where: { section: { meeting: { title: { startsWith: '[DEMO]' } } } },
  });
  await prisma.meetingAgendaSection.deleteMany({
    where: { meeting: { title: { startsWith: '[DEMO]' } } },
  });
  await prisma.meeting.deleteMany({ where: { title: { startsWith: '[DEMO]' } } });
  await prisma.userRole.deleteMany({ where: { user: { username: { startsWith: 'demo_' } } } });
  await prisma.user.deleteMany({ where: { username: { startsWith: 'demo_' } } });

  // 2. employees (复刻 Excel presenters)
  const passwordHash = await bcrypt.hash('Demo@2024', 10);
  async function createEmployee(username: string, displayName: string, employeeId: string) {
    const user = await prisma.user.create({
      data: {
        username,
        email: `${username}@ff.com`,
        passwordHash,
        displayName,
        employeeId,
        status: 'ACTIVE',
        source: 'LOCAL',
      },
    });
    await prisma.userRole.create({
      data: { userId: user.id, roleId: employeeRole.id, organizationId: org.id },
    });
    return user;
  }
  const tracy = await createEmployee('demo_tracy', 'Tracy S.', 'DEMO001');
  const yt = await createEmployee('demo_yt', 'YT, Jerry', 'DEMO002');
  const rao = await createEmployee('demo_rao', 'Rao', 'DEMO003');
  const terry = await createEmployee('demo_terry', 'Terry', 'DEMO004');
  const chris = await createEmployee('demo_chris', 'Chris', 'DEMO005');
  const jevy = await createEmployee('demo_jevy', 'Jevy, Terry', 'DEMO006');
  const opsHr = await createEmployee('demo_ops_hr', 'Ops/HR', 'DEMO007');
  const eng = await createEmployee('demo_eng', '张工程师', 'DEMO008');
  const sales = await createEmployee('demo_sales', '李销售', 'DEMO009');

  // 3. meeting (Excel: 05/18/2026 FFAI EC Meeting)
  const start = new Date('2026-05-18T20:35:00.000Z');
  const end = new Date('2026-05-18T22:35:00.000Z');
  const meeting = await prisma.meeting.create({
    data: {
      title: '[DEMO] FFAI EC Meeting',
      description: '复刻 工作簿2.xlsx — FFAI EC Meeting 议程范例',
      startTime: start,
      endTime: end,
      timezone: 'America/Los_Angeles',
      type: 'HYBRID',
      status: 'SCHEDULED',
      city: 'Los Angeles',
      creatorId: itadmin.id,
    },
  });

  // 4. 段 helper
  async function mkSection(title: string, order: number, columnLabels: string[] = []) {
    return prisma.meetingAgendaSection.create({
      data: {
        meetingId: meeting.id,
        title,
        order,
        columnLabels,
        createdById: itadmin.id,
        organizationId: org.id,
      },
    });
  }
  async function mkItem(
    sectionId: string,
    order: number,
    fields: {
      title: string;
      code?: string;
      description?: string;
      columnDescriptions?: string[];
      timeMinutes?: number;
      presenter?: string;
    },
  ) {
    return prisma.meetingAgendaItem.create({
      data: {
        sectionId,
        order,
        title: fields.title,
        code: fields.code ?? null,
        description: fields.description ?? null,
        columnDescriptions: fields.columnDescriptions ?? [],
        timeMinutes: fields.timeMinutes ?? null,
        presenterUserId: fields.presenter ?? null,
        createdById: itadmin.id,
        organizationId: org.id,
      },
    });
  }

  // ─── 段 0: Attendance Check ───────────────────────────
  // Excel 模式：段头本身就是议程项，item.title 留空，内容放 description
  const sec0 = await mkSection('0. Attendance Check', 0);
  await mkItem(sec0.id, 0, {
    title: '',
    description: 'Automated System Attendance Check/Attendance Report',
    timeMinutes: 5,
    presenter: opsHr.id,
  });

  // ─── 段 1: Announcement ───────────────────────────────
  const sec1 = await mkSection('1. Announcement', 1);
  // 空 item 让段头跟它合并渲染一行（不然 row 上字段不能编辑）
  await mkItem(sec1.id, 0, { title: '' });

  // ─── 段 2: Action Item Tracking ───────────────────────
  const sec2 = await mkSection('2. Action Item Tracking', 2);
  await mkItem(sec2.id, 0, {
    title: '',
    description: 'Action Items Review (Smart Sheet)',
    timeMinutes: 5,
    presenter: tracy.id,
  });

  // ─── 段 3: Leadership Comments ────────────────────────
  const sec3 = await mkSection('3. Leadership Comments', 3);
  await mkItem(sec3.id, 0, {
    title: '',
    description: 'Future Directions/Planning',
    timeMinutes: 10,
    presenter: yt.id,
  });

  // ─── 段 4: Special Topics (3) ─────────────────────────
  // row 0 跟段头合并；row 1/2 独立显示（title 列空）
  const sec4 = await mkSection('4. Special Topics (3)', 4);
  await mkItem(sec4.id, 0, {
    title: '',
    code: 'All',
    description: 'FF AI Transformation',
    timeMinutes: 10,
    presenter: rao.id,
  });
  await mkItem(sec4.id, 1, {
    title: '',
    code: 'All',
    description: 'AI-Robotics End to End Operations System',
    timeMinutes: 5,
    presenter: terry.id,
  });
  await mkItem(sec4.id, 2, {
    title: '',
    code: 'All',
    description: 'NYC Site Strategic Planning',
    timeMinutes: 10,
    presenter: terry.id,
  });

  // ─── 段 5: Routine Strategic Topics (双栏 FFAI/EAI-EV vs EAI-Robotics) ──
  const sec5 = await mkSection('5. Routine Strategic Topics (3)', 5, [
    'FFAI/EAI-EV',
    'EAI-Robotics',
  ]);
  // S1: 总览跨双栏 + 双栏分述
  await mkItem(sec5.id, 0, {
    title: 'S1: EAI R&D (EAI 5X4 Technology Architecture + Open Developer Platform)',
    code: 'S1-ECAI051826-1:',
    description: 'EAI Brain, Open Developer Updates, Could, Skills, HW & Mechanical Platforms',
    columnDescriptions: ['EAI-EV 4 Technology System', ' EAI-Robotics 4 Technology System'],
    timeMinutes: 5,
    presenter: opsHr.id,
  });
  await mkItem(sec5.id, 1, {
    title: 'S2: UES/User Acquisition, Co-Creation & Operations',
    code: 'S2-ECAI051826-1:',
    description:
      'May/June/July User Delivery Planning, User Acquisition & Operations Update, Mentor Mentee, GTM',
    timeMinutes: 10,
    presenter: chris.id,
  });
  await mkItem(sec5.id, 2, {
    title: 'S3: Product Execution and Product Delivery',
    code: 'S3-ECAI051826-1:',
    description: ' Delivery Tracking, RLE EDU Product Readiness, "Made in USA" Strategic Planning',
  });
  await mkItem(sec5.id, 3, {
    title: 'S4: Value Chain Business',
    code: 'S4-ECAI051826-1: ',
    columnDescriptions: ['AIHER (Bi-Weekly)', 'Data Factory Updates'],
  });
  await mkItem(sec5.id, 4, {
    title: 'S5: Capital and Finance Mgmt.',
    code: 'S5-ECAI051826-1:',
    description: 'May Group Fundraising Plannings, Net Equity Status, Finance System Build Up',
    timeMinutes: 10,
    presenter: jevy.id,
  });
  await mkItem(sec5.id, 5, {
    title: 'S6: Dual-home & 3rd Poles Market',
    code: 'S6-ECAI051826-1: ',
    description: 'UAE Business Update',
  });
  await mkItem(sec5.id, 6, {
    title: 'S7: Capability Build-up and OPS Mgmt. System',
    code: 'S7-ECAI051826-1:',
    description: '10-Q Summary/Next Q Outlook, AI System Build Up, Organizational Upgrade',
    timeMinutes: 5,
    presenter: jevy.id,
  });

  // 5. 再 seed 2 个简单 demo 会议（覆盖不同状态 + 上传任务测试）
  // ─── 会议 B: 历史会议（5 天前，已完成）单栏 ───
  const past = new Date(Date.now() - 5 * 24 * 3600 * 1000);
  const pastEnd = new Date(past.getTime() + 2 * 3600 * 1000);
  const meetingPast = await prisma.meeting.create({
    data: {
      title: '[DEMO] 简单 demo 会议（已完成）',
      description: '历史会议，单栏议程示例',
      startTime: past,
      endTime: pastEnd,
      timezone: 'Asia/Shanghai',
      type: 'OFFLINE',
      status: 'COMPLETED',
      city: '上海',
      creatorId: itadmin.id,
    },
  });
  const pastSec = await prisma.meetingAgendaSection.create({
    data: {
      meetingId: meetingPast.id,
      title: '会议议程',
      order: 0,
      columnLabels: [],
      createdById: itadmin.id,
      organizationId: org.id,
    },
  });
  for (const [i, it] of [
    { title: '出席统计 + 上次纪要回顾', time: 10, who: itadmin.id, desc: '快速过一遍出席情况' },
    { title: '关键 Action Item 进度跟踪', time: 15, who: eng.id, desc: '工程团队进度' },
    { title: 'AOB & Next Steps', time: 5, who: itadmin.id, desc: '' },
  ].entries()) {
    await prisma.meetingAgendaItem.create({
      data: {
        sectionId: pastSec.id,
        title: it.title,
        description: it.desc,
        timeMinutes: it.time,
        presenterUserId: it.who,
        order: i,
        columnDescriptions: [],
        createdById: itadmin.id,
        organizationId: org.id,
      },
    });
  }

  // ─── 会议 C: 未来会议（3 天后）+ 上传任务（让 eng/sales 有"我的待办"）───
  const future = new Date(Date.now() + 3 * 24 * 3600 * 1000);
  const futureEnd = new Date(future.getTime() + 2 * 3600 * 1000);
  const meetingFuture = await prisma.meeting.create({
    data: {
      title: '[DEMO] 即将召开（双栏 + 待办任务）',
      description: '未来会议，含上传任务',
      startTime: future,
      endTime: futureEnd,
      timezone: 'Asia/Shanghai',
      type: 'HYBRID',
      status: 'SCHEDULED',
      city: '北京',
      creatorId: itadmin.id,
    },
  });
  const futSec = await prisma.meetingAgendaSection.create({
    data: {
      meetingId: meetingFuture.id,
      title: 'Strategic Topics',
      order: 0,
      columnLabels: ['FFAI/EAI-EV', 'EAI-Robotics'],
      createdById: itadmin.id,
      organizationId: org.id,
    },
  });
  const engItem = await prisma.meetingAgendaItem.create({
    data: {
      sectionId: futSec.id,
      title: 'S1: 北美市场 Q3 战略',
      code: 'S1-FUT-1',
      columnDescriptions: ['EV 北美交付计划', 'Robotics 试点合作'],
      timeMinutes: 30,
      presenterUserId: sales.id,
      order: 0,
      createdById: itadmin.id,
      organizationId: org.id,
    },
  });
  const robItem = await prisma.meetingAgendaItem.create({
    data: {
      sectionId: futSec.id,
      title: 'S2: 机器人产品路线图',
      code: 'S2-FUT-1',
      columnDescriptions: ['EV 平台适配方案', '机器人 Q4 量产计划'],
      timeMinutes: 25,
      presenterUserId: eng.id,
      order: 1,
      createdById: itadmin.id,
      organizationId: org.id,
    },
  });
  // 上传任务：sales 负责 S1，eng 负责 S2
  await prisma.meetingAgendaItemUploadTask.create({
    data: {
      agendaItemId: engItem.id,
      assigneeUserId: sales.id,
      status: 'PENDING',
      assignedById: itadmin.id,
      createdById: itadmin.id,
      organizationId: org.id,
    },
  });
  await prisma.meetingAgendaItemUploadTask.create({
    data: {
      agendaItemId: robItem.id,
      assigneeUserId: eng.id,
      status: 'PENDING',
      assignedById: itadmin.id,
      createdById: itadmin.id,
      organizationId: org.id,
    },
  });

  console.log('\n✅ Demo data seeded:');
  console.log(`   [A] ${meeting.title} — Excel 1:1 镜像，6 段，S1–S7 双栏`);
  console.log(`   [B] ${meetingPast.title} — 历史 (COMPLETED)，单栏 3 项`);
  console.log(`   [C] ${meetingFuture.title} — 未来 (SCHEDULED)，双栏 + 2 个 PENDING 上传任务`);
  console.log('   员工:  itadmin (Admin@2024)');
  console.log('        Excel 复刻角色: demo_tracy / demo_yt / demo_rao / demo_terry / demo_chris / demo_jevy / demo_ops_hr');
  console.log('        通用员工: demo_eng (张工程师, 有待办) / demo_sales (李销售, 有待办)');
  console.log('        密码统一: Demo@2024');
}

main()
  .then(() => prisma.$disconnect())
  .catch(async (e) => {
    console.error(e);
    await prisma.$disconnect();
    process.exit(1);
  });
