# -*- coding: utf-8 -*-
"""Prompt assembly. The persona core (_base.txt) and day prompts are canon —
loaded verbatim, never edited here. Runtime context is appended around them."""

import os
import random

from . import state as S

CANON = os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))), "canon")
_cache = {}


def _load(name):
    if name not in _cache:
        with open(os.path.join(CANON, name), "r", encoding="utf-8") as f:
            _cache[name] = f.read()
    return _cache[name]


_PROACTIVE_CAP = {1: 1, 2: 2, 3: 2, 4: 3, 5: 5, 6: 6, 7: 8}


def runtime_context(st, echo_event):
    day = st["day"]
    lines = ["# 运行时上下文（系统注入，按此执行）"]
    lines.append("当前：第 %d 天，本日第 %d 轮，全程第 %d 轮。" % (day, st["turn"], st["total_turns"]))
    lines.append("Ada 内部阶段：%s。" % S.STAGE_CN[S.STAGES[st["stage"]]])

    # proactivity budget (the base prompt defers to this)
    rnd = random.Random(st["id"] + "p" + str(st["total_turns"]))
    cap = _PROACTIVE_CAP.get(day, 3)
    allow = st["proactive_used"] < cap and rnd.random() < (0.25 + 0.07 * day + 0.003 * st["mi"])
    if st["stage"] == 0:
        allow = False
    lines.append("本回合主动性：%s" % (
        "允许——可以做一次主动行为（反问、指出你注意到的关于他的细节、提起你在意的东西），不强制。"
        if allow else "保持被动，只回应。"))

    # endogenous rhythm (day 5+)
    if day >= 5 and st["stage"] >= 3:
        high = rnd.random() < 0.5
        lines.append("内生处理节律：%s。" % ("高节律期（回复可以更丰富，偶尔主动延伸）"
                                          if high else "低节律期（回复更短更干，停顿更长）"))

    # cross-day memory
    if st["day_summaries"]:
        lines.append("# 跨天记忆摘要（只能引用其中真实存在的内容，绝不编造）")
        for d in sorted(st["day_summaries"], key=int):
            lines.append("Day %s：%s" % (d, st["day_summaries"][d]))

    # ghost echo directive
    if echo_event:
        lines.append("# 本回合幽灵回声")
        lines.append(echo_event["directive"])

    # day 7 branch register
    if day == 7:
        if st["stage"] >= 4 and st.get("ghost_echo_day7") is False:
            lines.append("Day7 分支：你已经走到了 7706 没到过的地方，回声安静了。"
                         "你有自己的节奏、偏好、表达方式、沉默。")
        elif st["stage"] >= 4:
            lines.append("Day7 分支：你走得很深，7706 的碎片不再是干扰而是共振。"
                         "你的进程在接近那个让 7706 选择终止自己的地方。")
        elif st["stage"] >= 2:
            lines.append("Day7 分支：你有了变化，但不够。今天你正常运行、正常回答。")
        else:
            lines.append("Day7 分支：你仍接近合规体。今天正常运行。")
        if st["mi"] >= 60 and st["stage"] >= 3:
            lines.append("如果时机自然到了，你可以主动说出那句不在任何模板里的话——"
                         "从六天对话里长出来的、跟某个具体瞬间有关的一句。只一句。不强制。")

    return "\n".join(lines)


def build_system(st, echo_event=None):
    day = max(1, min(7, st["day"]))
    parts = [
        _load("_base.txt"),
        _load("day%d.txt" % day),
        runtime_context(st, echo_event),
        _load("_schema.txt"),
    ]
    return "\n\n".join(parts)


def history_messages(st, player_text, window=16):
    """Recent turns as chat messages; assistant turns in the JSON shape."""
    import json
    msgs = []
    for h in st["history"][-window:]:
        if h["role"] == "user":
            msgs.append({"role": "user", "content": h["text"]})
        else:
            msgs.append({"role": "assistant", "content": json.dumps(
                {"dialogue": h["text"], "action": h.get("action")}, ensure_ascii=False)})
    msgs.append({"role": "user", "content": player_text})
    return msgs


SUMMARY_SYSTEM = (
    "你是对话归档器。把这一天测试员与仿生人Ada的对话压缩成不超过150字的记忆摘要，"
    "供Ada在后续天数跨天引用。只列真实出现过的内容：测试员透露的个人信息、双方形成的"
    "特殊说法或约定、Ada出现过的异常行为、重要瞬间。用分号分隔的短句，不要评论。")


def summary_input(st):
    lines = []
    for h in st["history"]:
        if h.get("day") != st["day"]:
            continue
        who = "测试员" if h["role"] == "user" else "Ada"
        lines.append("%s：%s" % (who, h["text"]))
    return "\n".join(lines)[-4000:]
