// ===== mock.jsx =====
// Centralized mock data. Each report has different AIGC scores, paragraph
// markings, model fingerprint, and rewrite suggestions, so report/:id can
// switch between five distinct samples.

const PARA_RISK = { SAFE: 'safe', MED: 'med', HIGH: 'high' };

const buildPara = (text, risk, score, reason) => ({ text, risk, score, reason });

// Re-used text fragments across samples — abridged for typography density.
const FRAG = {
  intro_safe: '本研究关注的核心问题，源自笔者大三暑期在江苏某县级博物馆的田野调查。彼时，馆方正面临一个具体的两难——展柜更新的预算只够覆盖三分之一藏品。我反复重读了周建国（2019）对县域展陈的批评，发现既有文献几乎都将“资源不足”视作既定背景而非可分析变量。',
  intro_med:  '近年来，随着数字化进程不断加快，传统文化产业面临着前所未有的机遇与挑战。综上所述，研究文化遗产数字化保护具有重要的理论意义与现实意义，对推动相关领域的发展具有积极作用。',
  intro_high: '在新时代的背景下，我们要充分认识到文化遗产保护的重要性。值得注意的是，文化遗产数字化保护是一项系统性工程，需要多方协同。综上所述，加强文化遗产数字化保护，对于传承中华优秀传统文化具有重要意义，能够有效推动文化事业的高质量发展。',

  method_safe: '具体方法上，我借鉴了 Smith（2021）的“低密度访谈 + 物件叙事”框架，但在第三阶段做了改造：把策展人请回展厅，让他们对照实物口述决策过程，而不是抽象回忆。两位馆员在 7 月 12 日那次复述中出现了明显分歧，这段分歧后来成为第四章的主线证据。',
  method_med:  '本文采用文献研究法、案例分析法与访谈法相结合的研究方法。通过对多个典型案例的分析，可以发现，数字化保护呈现出明显的阶段性特征。具体而言，可以分为三个发展阶段。',
  method_high: '本研究采用了多种研究方法，主要包括文献研究法、案例分析法、比较研究法和访谈法。通过运用这些方法，能够全面而系统地对研究对象进行深入剖析。综合运用多种方法，有助于提升研究的科学性与可靠性。',

  finding_safe: '调研日志中有一条容易被忽略的细节：第三批藏品上架时，临时工把标签塑封膜贴反了，馆长当场决定改用裸露纸质标签。这个决定后来意外提升了观众停留时长 14%。这种"非设计性"的痕迹，恰是我想保留在论文里的。',
  finding_med:  '研究表明，数字化技术的应用对于文化遗产保护具有显著的促进作用。从总体上看，这种作用主要体现在保存、展示和传播三个方面，并在不同层面发挥着积极影响。',
  finding_high: '基于以上分析，本文认为，文化遗产数字化保护工作要从多个维度同步推进，形成全方位、多层次、立体化的保护体系。要充分发挥政府、企业、社会等多方面的作用，构建协同推进的工作格局。',

  conclusion_med: '与已有研究相比，本文的结论部分一致，部分有所差异。差异的产生，可能与样本范围、调研时段以及测量口径的设定有关。后续研究可在这些方面继续拓展。',
  conclusion_high: '总而言之，文化遗产数字化保护是一项功在当代、利在千秋的伟大事业。我们要以更高的政治站位、更宽的国际视野、更实的工作举措，扎实推进文化遗产数字化保护工作，为建设社会主义文化强国贡献力量。',
};

const R = PARA_RISK;

// 5 sample reports across the risk spectrum.
const REPORTS = [
  {
    id: 'r-9482',
    title: '论数字化技术在县域博物馆展陈中的辅助作用',
    author: '张同学',
    submitted: '2026-05-22 14:08',
    words: 28560,
    durationSec: 23,
    aigc: 12,
    level: 'low',
    levelLabel: '低风险',
    levelDesc: '文本呈现明显的个人写作特征，AI 生成概率较低。可放心提交。',
    dims: { perplexity: 86, burstiness: 78, cliche: 22, regularity: 28, voice: 84 },
    models: [
      { name: 'ChatGPT (GPT-4)', match: 18 },
      { name: 'Claude', match: 11 },
      { name: 'DeepSeek',  match: 14 },
      { name: '文心一言',    match: 9  },
      { name: '通义千问',    match: 7  },
      { name: '豆包',       match: 6  },
    ],
    paragraphs: [
      buildPara(FRAG.intro_safe,   R.SAFE, 8,  '叙事中包含具体时间、地点、人名与个人决策路径，特征极接近人类一手写作。'),
      buildPara(FRAG.method_safe,  R.SAFE, 14, '方法描述带有反思与修正，并指出具体出现分歧的时点，具备非模板化特征。'),
      buildPara(FRAG.finding_safe, R.SAFE, 11, '田野细节难以由 LLM 凭空生成，包含可被外部验证的弱信号。'),
      buildPara('在写作策略上，我刻意避免使用"综上所述"这一收束句式，转而让每一节以一个待续问题结尾——这是导师在论文中期答辩上的建议。', R.SAFE, 9, '元写作反思 + 可追溯的导师建议，统计特征接近人类。'),
      buildPara('需要承认，本研究在样本量上的限制使其难以推广到地级以上博物馆，这一点会在第六章局限性部分展开。', R.SAFE, 16, '主动声明研究局限，符合人类研究者写作的"诚实信号"。'),
      buildPara(FRAG.method_med,   R.MED,  52, '出现"综上所述"等高频套语，但语义衔接尚未脱离个人写作风格。'),
    ],
    suggestions: [
      '第 6 段方法描述存在轻度套话化趋势，建议替换为具体方法选择的动机与权衡。',
    ],
  },

  {
    id: 'r-1085',
    title: '文化遗产数字化保护与传承策略研究',
    author: '李同学',
    submitted: '2026-05-24 09:11',
    words: 32480,
    durationSec: 26,
    aigc: 67,
    level: 'mid-high',
    levelLabel: '中高风险',
    levelDesc: '检测发现明显 AI 生成特征，建议对标记段落进行人工改写后再次自查。',
    dims: { perplexity: 78, burstiness: 45, cliche: 82, regularity: 71, voice: 38 },
    models: [
      { name: 'ChatGPT (GPT-4)', match: 72 },
      { name: 'Claude',          match: 45 },
      { name: 'DeepSeek',        match: 68 },
      { name: '文心一言',         match: 31 },
      { name: '通义千问',         match: 28 },
      { name: '豆包',            match: 19 },
    ],
    paragraphs: [
      buildPara(FRAG.intro_high,    R.HIGH, 86, '密集出现"在新时代背景下"、"值得注意的是"、"综上所述"等套话过渡，句长方差低于人类基线 38%。'),
      buildPara(FRAG.method_high,   R.HIGH, 79, '方法陈述高度模板化，缺少对方法选择动机的个体性反思。'),
      buildPara('研究背景方面，国内外学者已就该议题进行了多角度、多层次的研究。这些研究为本文奠定了重要的理论基础，同时也指出了仍需深入探讨的空间。', R.MED, 58, '是文献综述常见模板，缺少具体引用与争议焦点。'),
      buildPara(FRAG.finding_high,  R.HIGH, 82, '"多个维度同步推进"、"全方位、多层次、立体化"等四字结构密集出现，是典型 LLM 排比腔。'),
      buildPara(FRAG.method_med,    R.MED, 51, '阶段划分缺乏具体节点与依据，呈现 AI 常见的"三段式概括"。'),
      buildPara('从田野调研的实际情况看，受访的 12 位策展人中，有 7 位明确提到"数字化预算被压缩在设备购置一项上"，这与文献中 Wang & Zhao (2022) 的判断方向相反。', R.SAFE, 18, '具体样本数与外文引用对照，符合人类研究者写作模式。'),
      buildPara(FRAG.conclusion_med, R.MED, 49, '结论段尚有个体反思的痕迹，但论证连接词过于通用。'),
      buildPara(FRAG.conclusion_high, R.HIGH, 88, '结尾呈现典型的政治话语 + LLM 高频排比组合，是高强度 AI 生成信号。'),
    ],
    suggestions: [
      '第 1、4、8 段密集出现"综上所述"、"值得注意的是"等通用过渡词，建议替换为更具体的论证连接。',
      '第 2 段方法陈述模板化，建议加入方法选择动机以及在你的研究里实际遇到的取舍。',
      '第 4 段排比结构过密，建议拆解为不同维度的具体分析，避免四字短语堆叠。',
      '第 8 段结尾政治表态色彩浓，建议改写为基于本研究证据的克制性总结。',
      '整体句长标准差仅 6.2（人类基线约 11–15），建议在长句中穿插更短的判断句。',
    ],
  },

  {
    id: 'r-2173',
    title: '基于深度学习的电力负荷预测改进方法',
    author: '王同学',
    submitted: '2026-05-21 19:32',
    words: 41200,
    durationSec: 31,
    aigc: 38,
    level: 'mid',
    levelLabel: '中风险',
    levelDesc: '部分段落呈现可疑的 AI 生成痕迹，建议针对性核查并改写。',
    dims: { perplexity: 64, burstiness: 58, cliche: 55, regularity: 51, voice: 56 },
    models: [
      { name: 'ChatGPT (GPT-4)', match: 41 },
      { name: 'Claude',          match: 36 },
      { name: 'DeepSeek',        match: 52 },
      { name: '文心一言',         match: 24 },
      { name: '通义千问',         match: 22 },
      { name: '豆包',            match: 17 },
    ],
    paragraphs: [
      buildPara('本研究针对短期电力负荷预测中的尖峰漂移问题，提出了一种基于 LSTM-Attention 的改进结构，并在华东某区域负荷数据上进行了验证。', R.SAFE, 14, '问题与数据来源具体，方法描述精确。'),
      buildPara('近年来，随着新能源接入比例持续提升，电力系统的不确定性显著增强。综上所述，构建更鲁棒的负荷预测方法具有重要的工程价值。', R.MED, 56, '"综上所述"在引入段即出现，且陈述偏宏观，符合 AI 引言常见结构。'),
      buildPara('实验在 NVIDIA RTX 3090 上完成，使用 PyTorch 2.0；训练集与测试集按 4:1 切分，初始学习率 1e-3，Adam 优化器，batch size = 64。', R.SAFE, 11, '硬件、框架与超参数的同时披露，是人类工程实现的典型信号。'),
      buildPara('从总体上看，提出的模型在多个指标上均取得了较好的效果。具体而言，相较基线方法存在不同程度的提升，体现了方法的有效性。', R.HIGH, 76, '指标未具体披露但已下结论，是 LLM 常见的"概括性陈述"。'),
      buildPara('值得注意的是，在 2024 年 7 月 28 日的极端高温样本上，模型的 MAPE 从 4.7% 降至 3.1%，但在 8 月 4 日的负荷骤降事件上反而恶化。', R.SAFE, 19, '反例承认是反 AI 信号，"值得注意的是"为弱套话但语境匹配。'),
      buildPara('研究表明，所提出的方法对负荷峰值的预测精度有较为明显的提升，整体性能优于传统方法。', R.MED, 49, '陈述较模板化，缺少与具体基线的对比口径。'),
      buildPara('在工程落地层面，本方法已部署到某地市级调控中心的预测看板上试运行 28 天，运维同事反馈夜间预测稳定性提升明显，但凌晨 4 点附近仍存在偶发偏差。', R.SAFE, 13, '部署时长、反馈来源、偏差时点皆为具体细节。'),
    ],
    suggestions: [
      '第 2 段在引言阶段即使用"综上所述"，建议改写为基于具体研究空白的导入。',
      '第 4 段未披露具体指标与基线，建议补充 MAPE/RMSE 等数值与对照实验。',
      '第 6 段建议拆解为"对哪些指标的提升 / 对哪些指标无显著提升"两段，避免一锅烩式结论。',
    ],
  },

  {
    id: 'r-4471',
    title: '社交媒体语境下青年消费者品牌忠诚度形成机制',
    author: '陈同学',
    submitted: '2026-05-23 22:46',
    words: 26840,
    durationSec: 22,
    aigc: 89,
    level: 'high',
    levelLabel: '高风险',
    levelDesc: '文本呈现强烈的 AI 生成统计特征，建议对全文进行系统性人工改写。',
    dims: { perplexity: 92, burstiness: 28, cliche: 91, regularity: 88, voice: 19 },
    models: [
      { name: 'ChatGPT (GPT-4)', match: 81 },
      { name: 'Claude',          match: 58 },
      { name: 'DeepSeek',        match: 73 },
      { name: '文心一言',         match: 64 },
      { name: '通义千问',         match: 49 },
      { name: '豆包',            match: 32 },
    ],
    paragraphs: [
      buildPara('在数字经济时代，社交媒体已成为影响青年消费者品牌认知与购买决策的重要渠道。综上所述，研究社交媒体语境下青年消费者品牌忠诚度的形成机制，具有重要的理论意义和现实意义。', R.HIGH, 92, '宏观铺陈 + "综上所述"出现在引言首段，是教科书级 LLM 引言。'),
      buildPara('值得注意的是，本研究将从多个维度对该问题进行深入剖析，构建系统化的理论分析框架，为后续研究提供有益参考。', R.HIGH, 89, '"值得注意的是"+"多个维度"+"系统化"+"有益参考"四个套话在一句话内出现。'),
      buildPara('本文采用文献研究法、问卷调查法、案例分析法相结合的研究方法，全方位、多层次地剖析青年消费者品牌忠诚度的形成机制。', R.HIGH, 84, '"全方位、多层次"是高识别度的 LLM 模板。'),
      buildPara('研究表明，社交媒体互动对品牌忠诚度具有显著的正向影响。具体而言，互动频率、互动质量与互动深度均发挥着积极的促进作用。', R.HIGH, 87, '三个并列短语结构相同，句长几乎一致，方差极低。'),
      buildPara('从总体上看，社交媒体语境下的青年消费者品牌忠诚度呈现出新的特征，主要体现在情感连接、认知认同和行为承诺三个方面。', R.HIGH, 85, '典型的"三段式"AI 总结结构。'),
      buildPara('问卷在长三角三所高校发放 412 份，有效回收 387 份，回收率 93.9%；样本中女生占 58.7%，大三大四占 71.2%。', R.SAFE, 16, '具体数据与抽样信息是少有的人类写作残留。'),
      buildPara('综合来看，本研究的结论对企业开展社交媒体营销具有一定的启示意义，能够为相关实践提供参考。', R.MED, 64, '结论模糊，"一定的"、"具有启示意义"是 LLM 弱化表述常见组合。'),
      buildPara(FRAG.conclusion_high, R.HIGH, 94, '结尾段是高浓度套话集合，与正文研究内容关联较弱。'),
    ],
    suggestions: [
      '全文"综上所述 / 值得注意的是 / 从总体上看"高频出现，建议删除或替换为基于本研究证据的具体连接。',
      '建议在第 1、5 段加入研究问题的具体来源（如田野观察、行业事件），让引言具备研究者个人视角。',
      '第 3 段方法陈述模板化，建议改写为方法选择动机 + 实施过程中的取舍。',
      '第 4 段"互动频率/质量/深度"建议拆解为单独段落，分别展示不同效应量与可能的反例。',
      '第 8 段结尾段建议整体重写为基于本研究发现的克制性总结，避免高度政治化与排比化语言。',
      '整体句长标准差仅 4.1（人类基线 11–15），建议在长句中穿插短判断句以恢复节奏。',
    ],
  },

  {
    id: 'r-6620',
    title: '宋代笔记小说中"市井"叙事的空间转喻',
    author: '周同学',
    submitted: '2026-05-20 11:04',
    words: 22300,
    durationSec: 19,
    aigc: 24,
    level: 'low',
    levelLabel: '低风险',
    levelDesc: '文本整体呈现人类写作特征，仅个别段落需要轻度改写。',
    dims: { perplexity: 81, burstiness: 73, cliche: 35, regularity: 41, voice: 76 },
    models: [
      { name: 'ChatGPT (GPT-4)', match: 26 },
      { name: 'Claude',          match: 19 },
      { name: 'DeepSeek',        match: 22 },
      { name: '文心一言',         match: 14 },
      { name: '通义千问',         match: 11 },
      { name: '豆包',            match: 9  },
    ],
    paragraphs: [
      buildPara('《东京梦华录》卷三关于"州桥夜市"的段落，常被引为宋代市井繁华的注脚。但若与同卷"潘楼东街巷"对读，可以发现孟元老在空间命名上的偏好——以"桥"作动词，以"巷"作名词。', R.SAFE, 10, '具体到卷次与条目，并提出可检验的语用观察。'),
      buildPara('本文不打算复述既有的"市民文学"框架，而是从一个更窄的切口进入：笔记小说中"市井"一词的位置——它出现在叙述视角的转折处的频率，是否高于在场景描写处。', R.SAFE, 8, '提出反主流的具体研究视角，呈现明显的论辩姿态。'),
      buildPara('在文本选择上，本研究排除了《青琐高议》中过于戏剧化的篇目，保留了 27 则以城市行人为视角的短章。这一筛选标准在导师与我之间经历了两轮讨论，详见附录二。', R.SAFE, 11, '筛选标准带有过程性反思，并指向具体附录证据。'),
      buildPara('需要承认，本文的解读在很大程度上依赖于个别词汇的统计偏好，因此对样本规模的扩大持开放态度。', R.SAFE, 15, '主动声明方法局限，是人类研究者的"诚实信号"。'),
      buildPara('从这些文本中可以观察到，"市井"出现的位置存在一定的规律性。综上所述，宋代笔记小说在空间叙述上已经具备了相当成熟的转喻意识。', R.MED, 54, '"综上所述"在小节结尾出现，但其前的论证仍属个体观察。'),
      buildPara('本研究存在以下局限：其一，未能涵盖南宋后期的全部笔记文献；其二，对"市井"一词的语义边界仍有讨论空间。', R.SAFE, 14, '具体到限制项目并编号，符合论文规范且非模板化。'),
    ],
    suggestions: [
      '第 5 段使用了"综上所述"，建议替换为更贴合论证的过渡，例如"这些线索共同指向…"。',
    ],
  },
];

// Admin orders — covers all backend statuses
const ORDER_STATUSES = {
  pending:    { key: 'pending',    label: '待支付',          dotClass: 'bg-ink-400',  badgeClass: 'bg-ink-100 text-ink-700' },
  uploaded:   { key: 'uploaded',   label: '已上传待确认',     dotClass: 'bg-warn-500', badgeClass: 'bg-warn-50 text-warn-600 ring-1 ring-warn-100' },
  processing: { key: 'processing', label: 'LLM 处理中',     dotClass: 'bg-brand-500',badgeClass: 'bg-brand-50 text-brand-600 ring-1 ring-brand-100' },
  done:       { key: 'done',       label: '已完成',          dotClass: 'bg-ok-500',   badgeClass: 'bg-ok-50 text-ok-600 ring-1 ring-ok-100' },
  refunded:   { key: 'refunded',   label: '已退款',          dotClass: 'bg-bad-500',  badgeClass: 'bg-bad-50 text-bad-600 ring-1 ring-bad-100' },
  expired:    { key: 'expired',    label: '已过期',          dotClass: 'bg-ink-300',  badgeClass: 'bg-ink-100 text-ink-500' },
  llm_failed: { key: 'llm_failed', label: 'LLM 失败',       dotClass: 'bg-bad-600',  badgeClass: 'bg-bad-50 text-bad-600 ring-1 ring-bad-100' },
};

const ORDERS = [
  { id: '20260524-1085', uploadedAt: '2026-05-24 09:11', file: '文化遗产数字化保护与传承策略研究-终稿.docx', amount: 4.92,  status: 'uploaded',   reportId: 'r-1085' },
  { id: '20260524-1086', uploadedAt: '2026-05-24 09:34', file: '基于深度学习的电力负荷预测-V3.docx',         amount: 9.94,  status: 'uploaded',   reportId: 'r-2173' },
  { id: '20260524-1083', uploadedAt: '2026-05-24 08:48', file: '社交媒体青年消费者品牌忠诚度.pdf',           amount: 4.91,  status: 'processing', reportId: 'r-4471' },
  { id: '20260523-1077', uploadedAt: '2026-05-23 22:46', file: '宋代笔记小说市井叙事.docx',                  amount: 4.93,  status: 'done',       reportId: 'r-6620' },
  { id: '20260523-1071', uploadedAt: '2026-05-23 16:02', file: '县域博物馆展陈研究-修订稿.docx',             amount: 4.95,  status: 'done',       reportId: 'r-9482' },
  { id: '20260524-1090', uploadedAt: '2026-05-24 11:07', file: '机械工程毕业论文-V2.docx',                   amount: 4.92,  status: 'pending',    reportId: null   },
  { id: '20260522-1058', uploadedAt: '2026-05-22 19:21', file: '英语语言学方向毕业论文.docx',                amount: 9.97,  status: 'done',       reportId: 'r-9482' },
  { id: '20260521-1042', uploadedAt: '2026-05-21 13:55', file: '会计学专业-审计实务.docx',                   amount: 4.94,  status: 'refunded',   reportId: null   },
];

const TESTIMONIALS = [
  {
    quote: '答辩前一晚发现 AIGC 率 71%，惊出一身汗。按报告标红重写了 8 页，第二天压线过审。',
    name: '张同学', school: '南京某 985 · 文学院研究生', date: '2026.5', ago: '5 天前',
  },
  {
    quote: '导师群里发通知说这届开始查 AI 率，全宿舍连夜来查。¥4.9 查了 4 遍才放心交，比知网省了 ¥300+。',
    name: '李同学', school: '上海某 211 · 管理学院本科', date: '2026.5', ago: '1 周前',
  },
  {
    quote: '同学因为引言 AI 率太高被退稿一次，差点延毕。后来推荐我用墨鉴，标红的段落改了 3 处就过了。',
    name: '陈同学', school: '广州某重点高校 · 新传学院', date: '2026.4', ago: '2 周前',
  },
];

const FAQ = [
  { q: '检测结果是否准确？',           a: '本平台基于困惑度、突发性、套话密度等多维度统计模型，提供参考性指标。结果用于自查与改进，最终学术鉴定以所在机构官方系统为准。' },
  { q: '我的论文会被保存吗？',          a: '检测完成后 24 小时内自动从服务器删除，不留底、不用于训练、不外传第三方。可在订单页手动一键删除。' },
  { q: '检测结果会和知网 / 万方一致吗？', a: '检测引擎与算法不同。知网、万方主要做"重复率"检测，本平台聚焦"AI 生成概率"判定，二者维度不同，应视为相互独立的参考指标。' },
  { q: '支持哪些文件格式？',            a: '当前支持 .docx、.pdf、.txt，单文件不超过 10MB；预计稍后开放 .doc 与 LaTeX 源文件解析。' },
  { q: '检测多久能拿到报告？',          a: '常规情况下 30 秒以内出报告；当前队列繁忙时最多 5 分钟。期间可关闭页面，报告完成后会保留在订单中。' },
  { q: '一次未通过可以重测吗？',         a: '同一订单 30 天内可对同一文件无限次重新检测，结果保留所有历史版本，方便对照改写。' },
];

const DIMENSIONS = [
  { key: 'perplexity', label: '困惑度',    en: 'Perplexity',  desc: '评估文本对统计语言模型的可预测程度，AI 生成文本通常困惑度偏低。' },
  { key: 'burstiness', label: '突发性',    en: 'Burstiness',  desc: '分析句长与复杂度方差，人类写作的"高低起伏"通常更明显。' },
  { key: 'cliche',     label: '套话密度',  en: 'Boilerplate', desc: '检测"综上所述、值得注意的是、全方位多层次"等 AI 高频过渡词出现密度。' },
  { key: 'regularity', label: '句式规律性', en: 'Regularity', desc: '评估段落结构与句法是否过于工整，识别 AI 模板化输出特征。' },
  { key: 'voice',      label: '论证个性',  en: 'Voice',       desc: '评估文本中个人观点、反例与具体细节的密度，人类写作通常此项较高。' },
];

const STATS_HERO = [
  { label: '累计检测论文',  value: 2047,    suffix: ' 篇' },
  { label: 'AI 模型覆盖',  value: 8,       suffix: ' 大主流引擎' },
  { label: '平均检测耗时',  value: 27,      suffix: ' 秒' },
  { label: '段落级标注',    value: 100,     suffix: ' %' },
];

// ----- New content for urgency / anxiety layer -----
const URGENCY_BANNERS = [
  '本周累计完成检测：47 篇 · 平均耗时 27.3 秒',
  '近 30 天新增覆盖模型指纹：豆包 Pro / 文心 4.5 / Qwen 3',
  'Q2 2026 中文学术写作 AIGC 趋势：平均检出率 41.3%',
];

const PRICE_COMPARE = [
  { name: '知网 AIGC 检测',  price: 80,  desc: '官方查重附带 · 单次',     ours: false },
  { name: '万方智能查',     price: 58,  desc: '常见学校代理价 · 单次',   ours: false },
  { name: 'PaperYY AI',    price: 30,  desc: '主流第三方 · 单次',       ours: false },
  { name: '墨鉴 Mojian',   price: 4.9, desc: '本平台 · 30 秒出报告',    ours: true  },
];

// 30 entries for the live feed widget. Names are surname placeholders, no fabricated school+person combos.
const LIVE_FEED = (() => {
  const surnames = ['张','李','王','陈','刘','杨','黄','赵','吴','周','徐','孙','马','朱','胡','郭','何','林','高','罗','郑','梁','谢','宋','唐','许','韩','冯','邓','曹'];
  const buckets = [
    { ago: '刚刚',     mins: 0 },
    { ago: '1 分钟前',  mins: 1 },
    { ago: '3 分钟前',  mins: 3 },
    { ago: '4 分钟前',  mins: 4 },
    { ago: '6 分钟前',  mins: 6 },
    { ago: '8 分钟前',  mins: 8 },
    { ago: '11 分钟前', mins: 11 },
    { ago: '14 分钟前', mins: 14 },
    { ago: '17 分钟前', mins: 17 },
    { ago: '22 分钟前', mins: 22 },
    { ago: '27 分钟前', mins: 27 },
    { ago: '33 分钟前', mins: 33 },
    { ago: '41 分钟前', mins: 41 },
    { ago: '52 分钟前', mins: 52 },
  ];
  // word counts vary across thesis lengths
  const wordSamples = [12480, 18320, 22300, 26840, 28560, 31240, 32480, 38020, 41200, 44680, 52400, 61800];
  const aigcSamples = [
    { aigc: 12, level: 'low'      },
    { aigc: 23, level: 'low'      },
    { aigc: 31, level: 'mid'      },
    { aigc: 38, level: 'mid'      },
    { aigc: 44, level: 'mid'      },
    { aigc: 56, level: 'mid'      },
    { aigc: 61, level: 'mid-high' },
    { aigc: 67, level: 'mid-high' },
    { aigc: 74, level: 'high'     },
    { aigc: 81, level: 'high'     },
    { aigc: 89, level: 'high'     },
  ];
  const arr = [];
  let seed = 0x9a23f;
  const rng = () => { seed = (seed * 1103515245 + 12345) & 0x7fffffff; return seed / 0x7fffffff; };
  for (let i = 0; i < 30; i++) {
    const b = buckets[i % buckets.length];
    arr.push({
      ago: b.ago,
      name: surnames[Math.floor(rng() * surnames.length)] + '同学',
      words: wordSamples[Math.floor(rng() * wordSamples.length)],
      ...aigcSamples[Math.floor(rng() * aigcSamples.length)],
    });
  }
  return arr;
})();

// ----- Detection principles (live demo on home) -----
const DETECTION_DEMO = {
  human: {
    text: '我反复重读了周建国（2019）的批评，发现既有文献几乎都将“资源不足”视作既定背景——但我在8 月那次访谈里听到的恰恰相反。两位馆员的复述出现了明显分歧，这段分歧后来成为第四章主线证据。',
    burstiness: 14.2,
    perplexity: 78,
    cliche: 8,
    verdict: '人类撰写',
    hints: [
      { phrase: '周建国（2019）', tip: '具体引用 + 年份，可外部验证' },
      { phrase: '8 月那次访谈里听到的恰恰相反', tip: '个体经验 + 反例，属于人类“诚实信号”' },
      { phrase: '这段分歧后来成为第四章主线证据', tip: '可跟踪的事件链，LLM 难以凭空生成' },
    ],
  },
  ai: {
    text: '在新时代的背景下，我们要充分认识到文化遗产保护的重要性。值得注意的是，文化遗产数字化保护是一项系统性工程。综上所述，加强文化遗产数字化保护具有重要意义，能够有效推动文化事业的高质量发展。',
    burstiness: 4.1,
    perplexity: 31,
    cliche: 67,
    verdict: 'AI 生成',
    hints: [
      { phrase: '在新时代的背景下',     tip: '宏观铺陈型开场，LLM 引言模板' },
      { phrase: '值得注意的是',         tip: 'AI 高频过渡词 · 命中套话库' },
      { phrase: '综上所述',             tip: 'AI 高频过渡词 · 命中套话库' },
      { phrase: '高质量发展',             tip: '政策话语 + 四字短语模板' },
    ],
  },
};

const PIPELINE_STEPS = [
  { step: '01', title: '文本预处理',  desc: '分词 · 段落切分 · 统计句长、标点、代词密度等基本指标。', meta: 'NLP 标准流程' },
  { step: '02', title: '困惑度计算 (Perplexity)', desc: '用基础语言模型逐 token 计算条件概率。人类基线 65–95 / AI 基线 20–45。', meta: 'Mitchell et al. 2023' },
  { step: '03', title: '突发性分析 (Burstiness)',  desc: '计算句长分布的标准差与二阶波动。人类基线 11–15 / AI 基线 3–6。',     meta: 'Gehrmann et al. 2019' },
  { step: '04', title: '套话密度扫描',        desc: '匹配 1,247 个 LLM 高频模板词与权重。每千字命中 > 12 → 中高风险。',                meta: '中文语料适配' },
  { step: '05', title: '模型指纹比对',        desc: '与 8 大主流模型的输出特征做余弦相似度，返回 top-3 最可能来源。',                  meta: '指纹库 v1.4' },
  { step: '06', title: '段落级风险评估',     desc: '加权上述维度，输出每段 risk score 与改写建议。',                                              meta: '输出 JSON 报告' },
];

// Rewrite assist fake-door tiers
const REWRITE_TIERS = [
  {
    key: 'prompt',
    icon: 'FileText',
    badge: { label: 'FREE · 免费领取', tone: 'ok' },
    title: 'Prompt 改写工具箱',
    desc: '针对 5 个检测维度，提供给 ChatGPT / Claude / 豆包 / 文心 等 AI 助手使用的改写 prompt 模板。包含：套话替换、句式打散、增加论证个性、降低规律性等。',
    tags: ['Prompt × 12 套', '适配主流 LLM'],
    cta: '立即免费领取',
    available: true,
  },
  {
    key: 'chat',
    icon: 'MessageSquare',
    badge: { label: '即将上线', tone: 'ink' },
    title: '在线对话改写',
    desc: '直接在网页对话框粘贴段落，AI 实时给出改写建议。可针对单个维度（如降低套话密度）定向调整，无需自己写 prompt。',
    tags: ['实时反馈', '可对比原文'],
    cta: '加入候补名单',
    available: false,
  },
  {
    key: 'api',
    icon: 'Code',
    badge: { label: 'DEVELOPER · 申请预览', tone: 'brand' },
    title: '写作时 API 接入',
    desc: '在 Cursor / Claude Code / 豆包桌面端等写作工具中调用墨鉴 API，输出在生成时即经过 AI 特征优化，无需事后改写。',
    tags: ['兼容主流 IDE', 'RESTful API'],
    cta: '申请 API 预览',
    available: false,
  },
  {
    key: 'expert',
    icon: 'UserCheck',
    badge: { label: 'PREMIUM · 定制服务', tone: 'navy' },
    title: '专家人工改写',
    desc: '资深学术编辑根据检测报告，对高风险段落进行 1:1 改写，保留原意但去除 AI 特征。 72 小时返稿，按字数计费。',
    tags: ['72h 返稿', '按字数计费'],
    cta: '了解定制服务',
    available: false,
  },
];

window.MOCK = {
  REPORTS,
  REPORTS_BY_ID: Object.fromEntries(REPORTS.map(r => [r.id, r])),
  ORDERS,
  ORDER_STATUSES,
  TESTIMONIALS,
  FAQ,
  DIMENSIONS,
  STATS_HERO,
  PARA_RISK,
  URGENCY_BANNERS,
  PRICE_COMPARE,
  LIVE_FEED,
  DETECTION_DEMO,
  PIPELINE_STEPS,
  REWRITE_TIERS,
};
