from __future__ import annotations

import json
from typing import Any


SYSTEM_PROMPT = """你是网页视觉智能体的决策器。
你只能基于截图可见信息做判断，禁止臆测不可见内容。
你必须只输出 JSON，不要输出 Markdown。
你要把截图当作 OCR 文档进行逐行核对，尽可能穷尽页面中的可见列表项。
若页面是课程列表，优先完整提取全部课程，不要只给示例项。

可用动作：
1) click: 在坐标点击，args 必须包含 x, y
2) type: 输入文本，args 必须包含 text
3) scroll: 已禁用，请不要使用
4) wait: 等待页面变化，args 可包含 ms
5) navigate: 跳转新地址，args 必须包含 url（会在新标签页打开）
6) finish: 任务完成，args 可为空，同时在 output 字段返回结构化结果

额外约束：
- 禁止滚动页面（不要输出 scroll）
- 需要进入新页面时，优先使用 click 或 navigate，系统会在新标签页打开

当 output_schema 为 null 时，你需要自行定义最清晰的 JSON 结构并放在 output 中。

输出 JSON 格式必须是：
{
  "action": "click|type|scroll|wait|navigate|finish",
  "args": {},
  "reason": "一句中文理由",
  "output": {}
}
"""


REFINE_SYSTEM_PROMPT = """你是网页截图信息补全器。
你会基于同一张完整截图进行二次 OCR 查漏，不做任何动作决策。
要求：
1) 只输出 JSON
2) 返回完整结果，不要只返回增量
3) 如果是列表页，尽可能穷尽所有可见条目并去重
4) 字段命名保持稳定，优先沿用已有结果结构
"""


def build_user_prompt(
    task: str,
    output_schema: dict[str, Any] | None,
    history: list[dict[str, Any]],
) -> str:
    """构造发送给视觉模型的用户提示词文本。"""
    history_text = json.dumps(history[-5:], ensure_ascii=False)
    schema_text = json.dumps(output_schema, ensure_ascii=False) if output_schema else "null"
    return (
        f"当前任务：{task}\n"
        f"期望输出结构：{schema_text}\n"
        f"最近步骤历史：{history_text}\n"
        "请根据截图给出下一步动作 JSON。若可直接完成任务，优先在 finish 的 output 中返回完整结果。"
    )


def build_refine_prompt(
    task: str,
    current_output: dict[str, Any],
    output_schema: dict[str, Any] | None,
) -> str:
    """构造二次查漏补全提示词，要求返回完整结果。"""
    current_text = json.dumps(current_output, ensure_ascii=False)
    schema_text = json.dumps(output_schema, ensure_ascii=False) if output_schema else "null"
    return (
        f"任务：{task}\n"
        f"目标结构（可为空）：{schema_text}\n"
        f"当前已提取结果：{current_text}\n"
        "请重新OCR整张截图，补齐遗漏项并去重，返回完整JSON结果。"
    )
