import type {
  ExamPaperView,
  ExamScoreDetail,
  ExamScoreDetailRow,
  ExamScorePageQuery,
  ExamScoreSummaryItem,
} from './types';

function delay<T>(data: T, ms = 220): Promise<T> {
  return new Promise((resolve) => setTimeout(() => resolve(data), ms));
}

const store: ExamScoreSummaryItem[] = [
  {
    id: 'es1',
    taskSubject: 'BQA0002 记录要求，Rev 02',
    taskNo: 'TT2020060534',
    paperId: 'p1',
    paperName: '(已失效)BQA0002 记录要求，Rev 02',
    paperInvalid: true,
    participantCount: 1,
    failCount: 0,
    maxScore: 100,
    minScore: 100,
    avgScore: 100,
    passScore: 80,
    totalScore: 100,
  },
  {
    id: 'es2',
    taskSubject: 'BAL0003 留样管理程序，Rev 03',
    taskNo: 'TT2020060535',
    paperId: 'p2',
    paperName: '(已失效)BAL0003 留样管理程序，Rev 03',
    paperInvalid: true,
    participantCount: 1,
    failCount: 1,
    maxScore: 70,
    minScore: 70,
    avgScore: 70,
    passScore: 80,
    totalScore: 100,
  },
  {
    id: 'es3',
    taskSubject: 'SOP-QA-012 偏差管理；SOP-QA-015 变更控制',
    taskNo: 'TT2020070102',
    paperId: 'p3',
    paperName: '(已失效)偏差与变更综合考核',
    paperInvalid: true,
    participantCount: 12,
    failCount: 2,
    maxScore: 98,
    minScore: 55,
    avgScore: 82.5,
    passScore: 80,
    totalScore: 100,
  },
  {
    id: 'es4',
    taskSubject: '2026-药物警戒年度培训',
    taskNo: 'TT2026090101',
    paperId: 'p4',
    paperName: '2026-药物警戒年度培训试题',
    paperInvalid: false,
    participantCount: 28,
    failCount: 3,
    maxScore: 100,
    minScore: 48,
    avgScore: 86.2,
    passScore: 60,
    totalScore: 100,
  },
  {
    id: 'es5',
    taskSubject: 'GMP基础知识培训及案例分析',
    taskNo: 'TT2026060155',
    paperId: 'p5',
    paperName: 'GMP基础知识培训（QC、分析）',
    paperInvalid: false,
    participantCount: 15,
    failCount: 1,
    maxScore: 100,
    minScore: 72,
    avgScore: 91,
    passScore: 100,
    totalScore: 100,
  },
  {
    id: 'es6',
    taskSubject: '再确认测试',
    taskNo: 'TT2025120575',
    paperId: 'p6',
    paperName: '再确认测试',
    paperInvalid: false,
    participantCount: 2,
    failCount: 0,
    maxScore: 100,
    minScore: 80,
    avgScore: 90,
    passScore: 100,
    totalScore: 100,
  },
];

function makeRow(
  partial: Omit<ExamScoreDetailRow, 'taskSubject' | 'taskNo' | 'passScore'> & { summaryId: string },
): ExamScoreDetailRow {
  const summary = store.find((x) => x.id === partial.summaryId)!;
  return {
    ...partial,
    taskSubject: summary.taskSubject,
    taskNo: summary.taskNo,
    passScore: summary.passScore,
  };
}

const detailRows: Record<string, ExamScoreDetailRow[]> = {
  es1: [
    makeRow({
      id: 'r1',
      summaryId: 'es1',
      userId: 'chensj',
      userName: '陈思佳',
      deptName: '质量保证部',
      examStart: '2020-07-15 09:00:00',
      examEnd: '2020-07-15 09:35:00',
      score: 100,
      passFlag: '1',
      sourceIp: '192.168.1.56',
    }),
  ],
  es2: [
    makeRow({
      id: 'r2',
      summaryId: 'es2',
      userId: 'lisi',
      userName: '李四',
      deptName: '分析实验室',
      examStart: '2020-06-12 09:30:00',
      examEnd: '2020-06-12 10:05:00',
      score: 70,
      passFlag: '0',
      sourceIp: '192.168.1.88',
    }),
  ],
  es4: [
    makeRow({
      id: 'r3',
      summaryId: 'es4',
      userId: 'zhouba',
      userName: '周八',
      deptName: '药物警戒',
      examStart: '2026-09-10 16:00:00',
      examEnd: '2026-09-10 16:40:00',
      score: 70,
      passFlag: '1',
      sourceIp: '10.0.12.21',
    }),
    makeRow({
      id: 'r4',
      summaryId: 'es4',
      userId: 'wujiu',
      userName: '吴九',
      deptName: '药物警戒',
      examStart: '2026-09-12 08:40:00',
      examEnd: '2026-09-12 09:15:00',
      score: 48,
      passFlag: '0',
      sourceIp: '10.0.12.33',
    }),
    makeRow({
      id: 'r5',
      summaryId: 'es4',
      userId: 'zhengshi',
      userName: '郑十',
      deptName: '药物警戒',
      examStart: '2026-09-11 13:20:00',
      examEnd: '2026-09-11 14:00:00',
      score: 100,
      passFlag: '1',
      sourceIp: '10.0.12.45',
    }),
  ],
  es6: [
    makeRow({
      id: 'r6',
      summaryId: 'es6',
      userId: 'zhangsan',
      userName: '张三',
      deptName: '质量管理部',
      examStart: '2025-12-22 09:00:00',
      examEnd: '2025-12-22 09:25:00',
      score: 80,
      passFlag: '0',
      sourceIp: '192.168.110.20',
    }),
    makeRow({
      id: 'r7',
      summaryId: 'es6',
      userId: 'lisi',
      userName: '李四',
      deptName: '生产部',
      examStart: '2025-12-22 09:00:00',
      examEnd: '2025-12-22 09:28:00',
      score: 100,
      passFlag: '1',
      sourceIp: '192.168.110.21',
    }),
  ],
};

function findRow(examId: string): ExamScoreDetailRow | undefined {
  for (const list of Object.values(detailRows)) {
    const hit = list.find((x) => x.id === examId);
    if (hit) return hit;
  }
  // 动态兜底行（如 es3_demo）
  const m = /^(.+)_demo$/.exec(examId);
  if (m) {
    const summary = store.find((x) => x.id === m[1]);
    if (summary) {
      return {
        id: examId,
        summaryId: summary.id,
        taskSubject: summary.taskSubject,
        taskNo: summary.taskNo,
        userId: 'demo',
        userName: '示例考生',
        deptName: '示例部门',
        examStart: '2026-01-01 09:00:00',
        examEnd: '2026-01-01 10:00:00',
        score: summary.avgScore,
        passScore: summary.passScore,
        passFlag: summary.avgScore >= summary.passScore ? '1' : '0',
        sourceIp: '127.0.0.1',
      };
    }
  }
  return undefined;
}

export function mockQueryExamScores(params: ExamScorePageQuery) {
  let list = [...store];
  if (params.taskNo && params.taskNo !== 'null') {
    const kw = params.taskNo.trim().toLowerCase();
    list = list.filter((x) => x.taskNo.toLowerCase().includes(kw));
  }
  if (params.keyword && params.keyword !== 'null') {
    const kw = params.keyword.trim().toLowerCase();
    list = list.filter(
      (x) =>
        x.taskSubject.toLowerCase().includes(kw) ||
        x.paperName.toLowerCase().includes(kw) ||
        x.taskNo.toLowerCase().includes(kw),
    );
  }
  const currentPage = Number(params.currentPage || 1);
  const pageSize = Number(params.pageSize || 20);
  const start = (currentPage - 1) * pageSize;
  return delay({
    list: list.slice(start, start + pageSize),
    pagination: { total: list.length, currentPage, pageSize },
  });
}

export function mockGetExamScoreDetail(id: string): Promise<ExamScoreDetail> {
  const row = store.find((x) => x.id === id);
  if (!row) return Promise.reject(new Error('成绩记录不存在'));
  const rows = detailRows[id] || [
    makeRow({
      id: `${id}_demo`,
      summaryId: id,
      userId: 'demo',
      userName: '示例考生',
      deptName: '示例部门',
      examStart: '2026-01-01 09:00:00',
      examEnd: '2026-01-01 10:00:00',
      score: row.avgScore,
      passFlag: row.avgScore >= row.passScore ? '1' : '0',
      sourceIp: '127.0.0.1',
    }),
  ];
  return delay({ ...row, rows });
}

function buildPaperItems(examId: string, score: number): ExamPaperView['items'] {
  return [
    {
      id: `${examId}_q1`,
      questionType: 'single',
      stem: 'GMP 的全称是？',
      options: [
        { optionLabel: 'A', optionContent: '药品生产质量管理规范' },
        { optionLabel: 'B', optionContent: '药品经营质量管理规范' },
        { optionLabel: 'C', optionContent: '实验室管理规范' },
      ],
      correctAnswer: 'A',
      userAnswer: score >= 60 ? 'A' : 'B',
      score: 30,
      gotScore: score >= 60 ? 30 : 0,
      isCorrect: score >= 60,
      isSubjective: '0',
    },
    {
      id: `${examId}_q2`,
      questionType: 'multi',
      stem: '下列哪些属于特种设备？',
      options: [
        { optionLabel: 'A', optionContent: '电梯' },
        { optionLabel: 'B', optionContent: '压力容器' },
        { optionLabel: 'C', optionContent: '普通办公桌' },
        { optionLabel: 'D', optionContent: '锅炉' },
      ],
      correctAnswer: 'A,B,D',
      userAnswer: score >= 80 ? 'A,B,D' : 'A,B',
      score: 30,
      gotScore: score >= 80 ? 30 : 15,
      isCorrect: score >= 80,
      isSubjective: '0',
    },
    {
      id: `${examId}_q3`,
      questionType: 'judge',
      stem: '特种作业人员必须取得有效资格证书后方可上岗作业。',
      correctAnswer: '正确',
      userAnswer: '正确',
      score: 20,
      gotScore: 20,
      isCorrect: true,
      isSubjective: '0',
    },
    {
      id: `${examId}_q4`,
      questionType: 'essay',
      stem: '请简述本次培训的核心要点。',
      userAnswer: '按 SOP 执行，做好记录，异常及时上报。',
      correctAnswer: '参考：覆盖制度要点、操作规范与记录要求。',
      score: 20,
      gotScore: Math.max(0, Math.min(20, score - 80)),
      isSubjective: '1',
    },
  ];
}

export function mockGetExamPaperView(examId: string): Promise<ExamPaperView> {
  let exam = findRow(examId);
  // 再兜底：任意 id 也能打开模拟答卷，避免“没有模拟试卷”
  if (!exam) {
    const summary = store[0];
    exam = {
      id: examId,
      summaryId: summary.id,
      taskSubject: summary.taskSubject,
      taskNo: summary.taskNo,
      userId: 'mock_user',
      userName: '模拟考生',
      deptName: '模拟部门',
      examStart: '2026-09-01 09:00:00',
      examEnd: '2026-09-01 09:45:00',
      score: 85,
      passScore: summary.passScore,
      passFlag: '1',
      sourceIp: '192.168.0.1',
    };
  }
  const summary = store.find((x) => x.id === exam!.summaryId) || store[0];
  return delay({
    examId: exam.id,
    summaryId: exam.summaryId,
    taskSubject: exam.taskSubject,
    taskNo: exam.taskNo,
    paperName: summary.paperName || exam.taskSubject,
    userId: exam.userId,
    userName: exam.userName,
    deptName: exam.deptName,
    examStart: exam.examStart,
    examEnd: exam.examEnd,
    score: exam.score,
    passScore: exam.passScore,
    totalScore: summary.totalScore || 100,
    passFlag: exam.passFlag,
    sourceIp: exam.sourceIp,
    items: buildPaperItems(exam.id, exam.score),
  });
}
