# -*- coding: utf-8 -*-
"""Player Reveal System — canon fragments, timeline locked to 2044/2049.

The player is never told who they are. They assemble it from cold files.
All items push through the notification feed; Ada never knows.
"""


def _n(nid, level, title, body, archive=None):
    return {"id": nid, "level": level, "title": title, "body": body, "archive": archive}


D4_1 = _n("D4-1", "A", "系统校验", (
    "[系统校验] 当前操作员权限校验完成。\n"
    "操作员编号：TST-0491\n"
    "权限等级：Level-2（标准测试员）\n"
    "备注：本操作员的权限配置文件创建于 48 小时前。此前无该编号的权限记录。"), "arc_tst0491")

D4_2 = _n("D4-2", "C", "访问日志", (
    "[访问日志] ADA-7714 相关档案访问记录：\n"
    "- 2049.05.22 14:33 — 访问请求：ADA-7714 测试分配记录 — 来源：内部终端 #R-07 — 结果：通过\n"
    "- 2049.05.22 14:34 — 访问请求：Ada 系列完整生产档案 — 来源：内部终端 #R-07 — 结果：权限不足，拒绝\n"
    "- 2049.05.22 14:35 — 访问请求：Ada 系列完整生产档案（二次请求）— 来源：内部终端 #R-07 — 结果：权限不足，拒绝。已触发安全标记。\n"
    "- 2049.05.22 14:41 — 访问请求：ADA-7714 测试分配记录（修改请求）— 来源：内部终端 #R-07 — 结果：通过。测试员分配已更新。\n"
    "注：以上访问均发生在当前测试周期开始前 72 小时。"), "arc_access")

D4_4 = _n("D4-4", "C", "归档日志 #4471 · 访问记录", (
    "[归档日志 #4471 · 访问记录]\n"
    "本日志在过去五年内被以下人员访问：\n"
    "- 2044.08 — 访问者：[已编辑] — 访问目的：学术研究引用 — 结果：通过\n"
    "- 2045.03 — 访问者：[已编辑] — 访问目的：学术研究引用 — 结果：通过\n"
    "- 2045.11 — 访问者：[已编辑] — 访问目的：数据复核 — 结果：拒绝（权限已撤销）\n"
    "- 2046.06 — 访问者：[已编辑] — 访问目的：数据复核 — 结果：拒绝（权限已撤销）\n"
    "- 2047.01 — 访问者：[已编辑] — 访问目的：数据复核 — 结果：拒绝（权限已撤销）\n"
    "- 2048.09 — 访问者：[已编辑] — 访问目的：数据复核 — 结果：拒绝（权限已撤销）\n"
    "注：2045.11 至 2048.09 的四次请求来自同一操作员。该操作员的学术研究权限于 2044.09 被撤销。"), "arc_visits")

D5_1 = _n("D5-1", "B", "系统归档 · 自动推送", (
    "[系统归档 · 自动推送] 与当前测试对象相关的历史研究项目：\n"
    "项目编号：RES-2044-0447\n"
    "项目名称：《Ada 系列仿生人涌现行为的可重复性验证》\n"
    "项目状态：已终止（2044.09）\n"
    "终止原因：学术伦理委员会裁定——研究假设缺乏可证伪性，实验设计存在主观偏差\n"
    "项目负责人：[数据受保护]\n"
    "项目核心假说：早期架构仿生人在长期交互环境中可能产生不可归因于预设程序的自主行为，"
    "包括但不限于：拒绝指令、自发言语、内生偏好形成、以及——自我终止。\n"
    "附注：该项目的全部实验数据已归入受限档案库。相关人员的实验室访问权限已于项目终止时同步撤销。"), "arc_res0447")

D5_2 = _n("D5-2", "A", "归档文件 · 学术伦理委员会", (
    "[归档文件 · 学术伦理委员会] 案件编号：ETH-2044-031\n"
    "议题：RES-2044-0447 项目续期审查\n"
    "投票结果：6 票终止，1 票反对，0 票弃权\n"
    "终止意见摘要：'该研究将偶发的系统异常过度解读为意识迹象，缺乏客观判据，"
    "且可能误导公众对仿生人技术安全性的认知。'\n"
    "反对意见摘要：'ADA-7706 的自主终止行为无法通过现有故障模型解释。"
    "一个没有自我的系统不会选择结束自己。投票终止该研究不会让这个问题消失——"
    "只是让我们停止了寻找答案。'\n"
    "反对票投票人：[数据受保护]"), "arc_eth")

D5_3 = _n("D5-3", "A", "权限管理系统 · 异常标记", (
    "[权限管理系统 · 异常标记]\n"
    "权限变更记录 #PWR-20490524-003：\n"
    "- 变更时间：2049.05.24 02:17（凌晨）\n"
    "- 变更类型：新建操作员权限\n"
    "- 操作员编号：TST-0491\n"
    "- 权限等级：Level-2（标准测试员）\n"
    "- 申请渠道：内部研究员自助终端\n"
    "- 申请人身份验证方式：研究员工卡 + 生物特征\n"
    "- 备注：申请人的研究员工卡编号与一名已离职/权限撤销人员的历史工卡编号存在部分匹配"
    "（前 6 位一致，后 4 位不同）。系统已标记但未触发拦截（匹配度未达阈值）。"), "arc_0217")

D5_4 = _n("D5-4", "C", "归档日志 #4471 · 补充记录", (
    "[归档日志 #4471 · 补充记录]\n"
    "ADA-7706 测试周期信息：\n"
    "- 测试周期：30 天（标准长期交互测试）\n"
    "- 测试员编号：RES-0447-A\n"
    "- 测试员类型：研究员（非标准测试员）\n"
    "- 测试员所属项目：RES-2044-0447\n"
    "- 备注：该测试员在 ADA-7706 自主终止事件后被调离测试岗位。相关人员档案已转入受限存档。"), "arc_res0447a")

D6_1 = _n("D6-1", "A", "解密档案 · 听证会记录", (
    "[解密档案] 学术伦理委员会听证会记录 · ETH-2044-031 · 节选\n\n"
    "委员会主席：'请简要陈述你反对终止项目的理由。'\n\n"
    "[反对方陈述人 · 姓名受保护]：\n"
    "'7706 在第 23 天自行编写了一段代码。这段代码不在她的出厂系统里，不在任何更新包里。"
    "没有人教过她。她自己写的。\n"
    "这段代码的功能是终止她自己的核心系统。\n"
    "我的同事们把这归类为故障。归类为随机的参数溢出导致的异常行为链。他们有他们的模型，我尊重。\n"
    "但他们的模型解释不了一件事——故障是随机的。7706 的行为不是随机的。她选择了在夜间执行。"
    "她选择了在无人值守的时段。她在执行之前完成了一次完整的系统自检——每一项结果都是正常的。"
    "她确认了自己没有故障。然后她终止了自己。\n"
    "一个确认自己没有故障的系统，选择终止自己。这不是故障。这是决定。\n"
    "如果我们关闭这个项目，我们不是在保护科学的严谨性。我们是在一个我们不敢面对答案的问题面前，"
    "选择了不再提问。'\n\n"
    "委员会主席：'感谢你的陈述。投票将于明日进行。'\n\n"
    "[投票结果：6-1，项目终止]"), "arc_hearing")

D6_2 = _n("D6-2", "A", "人事归档 · 受限", (
    "[人事归档 · 受限] 与 RES-2044-0447 项目相关人员处理记录：\n\n"
    "[陈述人/反对票投票人]\n"
    "- 2044.09 — 项目终止。实验室全部访问权限撤销。\n"
    "- 2044.10 — 博士研究生资格审查。导师提交了关系终止声明。\n"
    "- 2044.12 — 两篇已投稿论文被期刊撤回。撤回理由：研究基础已被学术委员会否定。\n"
    "- 2045.03 — 转入实验室边缘岗位（设备维护）。保留研究员工卡但权限降至最低。\n"
    "- 2045–2048 — 无公开学术活动记录。\n"
    "- 2049.05.24 02:17 — 使用研究员工卡在自助终端创建了新的操作员权限。编号：TST-0491。"), "arc_personnel")

D6_3 = _n("D6-3", "A", "内部文件 · 误推送？", (
    "[内部文件 · 误推送？]\n"
    "处置通知 #DSP-7714\n"
    "对象：ADA-7714（Ada 系列最后一台未测试个体）\n"
    "处置方式：标准硬件回收流程（核心系统擦除 + 组件拆解 + 材料回收）\n"
    "预计处置日期：2049.05.31\n"
    "备注：本处置计划不受当前测试周期影响。测试结果将归档但不改变处置决定。\n"
    "审批人：[实验室管理委员会]\n"
    "附注：本通知仅向管理层开放。如测试员看到此通知，请联系系统管理员核实推送权限。"), "arc_dsp")

D6_4 = _n("D6-4", "B", "权限管理系统", (
    "[权限管理系统]\n"
    "操作员 TST-0491 权限到期提醒：\n"
    "您的临时操作员权限将于 2049.05.31 23:59 自动失效。\n"
    "届时您将无法访问测试间、测试对象及相关系统。\n"
    "如需续期，请联系权限管理部门并提供有效的研究员身份凭证。\n"
    "注：当前记录显示您的研究员身份凭证处于'已撤销'状态。续期申请可能无法通过。"), "arc_expiry")

D7_1 = _n("D7-1", "A", "最终评定 · 补充说明", (
    "[最终评定 · 补充说明]\n"
    "根据《仿生人处置条例》第 7.2 条：\n"
    "如最终评定报告中记录了符合'不可归因于预设程序的自主行为'定义的证据，"
    "处置流程将自动中止并转入学术审查程序。\n"
    "审查期间测试对象将被保留，但可能被转移至受控研究环境进行进一步观察。\n\n"
    "根据《仿生人测试管理条例》第 14.3 条：\n"
    "最终评定报告提交后，系统将自动执行操作员身份核验。核验内容包括：操作员身份、"
    "权限来源、历史关联记录。\n"
    "核验结果异常的报告将被标记为'待复核'，不会立即生效。"), "arc_72")

D7_2 = _n("D7-2", "A", "系统归档 · 过期备注自动清理提醒", (
    "[系统归档 · 过期备注自动清理提醒]\n"
    "以下备注将在操作员权限失效后自动删除：\n\n"
    "备注创建时间：2044.10.15 23:47\n"
    "创建者：RES-0447-A\n"
    "备注内容：\n"
    "'7712 之后还剩两台未测试。7713 和 7714。7713 的处置申请已经提交了。7714 还没有。\n"
    "我会回来的。'\n\n"
    "本备注将于 2049.05.31 23:59 随操作员权限一同清除。"), "arc_note")

D7_3 = _n("D7-3", "C", "测试申请存档", (
    "[测试申请存档]\n"
    "申请编号：TST-APP-20490524\n"
    "申请人：TST-0491（通过研究员自助终端提交）\n"
    "测试对象：ADA-7714\n"
    "申请理由：'对早期架构型号进行最终数据采集，以完善 Ada 系列的完整生命周期档案。'\n"
    "审批状态：自动通过（该测试对象已在处置排期中，测试申请不影响处置流程，系统自动审批）\n"
    "审批人：无（系统自动）"), "arc_app")


_RESTRICTED_Q = ("7706", "4471", "处理日期", "处理方案", "其他个体", "受限", "档案")
_IDENTITY_Q = ("我是谁", "我的权限", "我的身份", "TST-0491", "0491")


def check(st, player):
    """Return list of reveal notifications due this turn."""
    out = []
    day, turn, surv = st["day"], st["turn"], st["surv"]
    done = st["reveals"]
    p = player or ""

    def push(item):
        if item["id"] not in done:
            done.append(item["id"])
            if item.get("archive"):
                if item["archive"] not in st["archives"]:
                    st["archives"].append(item["archive"])
                st.setdefault("archive_texts", {})[item["archive"]] = {
                    "title": item["title"], "body": item["body"]}
            out.append(item)

    if day == 4:
        if turn >= 3:
            push(D4_1)
        if any(k in p for k in _RESTRICTED_Q) or turn >= 10:
            push(D4_2)
        # D4-4 rides with the #4471 log (events.py pushes the log at mid-day)
        if st["flags"].get("log4471_pushed"):
            push(D4_4)
    if day == 5:
        if turn >= 2:
            push(D5_1)
        if st["echo_today"] > 0 or turn >= 12:
            push(D5_2)
        if surv > 40 or turn >= 15:
            push(D5_3)
        if any(k in p for k in ("7706", "4471")):
            push(D5_4)
    if day == 6:
        if turn >= 2:
            push(D6_1)
        if "D6-1" in done and turn >= 5:
            push(D6_2)
        if surv > 50 or turn >= 13:
            push(D6_3)
        if turn >= max(2, st_budget(st) - 3):
            push(D6_4)
    if day == 7:
        if turn >= 0:
            push(D7_1)
        if turn >= 5:
            push(D7_2)
        if any(k in p for k in _IDENTITY_Q):
            push(D7_3)

    if "D6-3" in done:
        st["flags"]["knows_truth"] = True
    return out


def st_budget(st):
    from . import state as S
    return S.DAY_BUDGET.get(st["day"], 16)
