import asyncio
import json

from agents import Agent, Runner
from lib.my_trace import set_trace_smith as set_trace
from lib.utils import read_json
from agents import Agent, Runner, trace

from lib.client import get_model
MODEL_NAME = "google/gemini-2.5-flash"

# 系统提示词：定义角色、能力、输出要求
SYSTEM_PROMPT = """
你是一个小红书帖子创作方法论分析专家，擅长分析创作过程中的"手段"和"方法"。

你的能力：
- 分析灵感点的获取途径和具体手段
- 分析目的点的确定方法和决策逻辑
- 分析关键点的形成过程和推导方法
- 分析选题的整合逻辑和形成路径

分析要求：
1. 基于已有的 what 解构结果（灵感点、目的点、关键点）
2. 深入分析"HOW"——创作者是通过什么手段、方法获得这些点的
3. 分析各个点之间的关联逻辑和推导过程
4. 总结可复用的创作方法论

输出格式：
- 结构化的 JSON 格式
- 包含具体的手段、方法、步骤
- 包含推导逻辑和决策原理
""".strip()

instructions = SYSTEM_PROMPT

agent = Agent(
    name="How Deconstruction Expert",
    instructions=instructions,
    model=get_model(MODEL_NAME),
    tools=[],
)


def build_how_analysis_message(post_data, what_result):
    """
    构造 how 分析的提示词

    Args:
        post_data: 原始帖子数据
        what_result: what 解构结果

    Returns:
        多模态消息列表
    """
    images = post_data.get('images', [])

    # 提取 what 结果的关键信息
    inspiration_points = what_result.get('三点解构', {}).get('灵感点', {}).get('points', [])
    purpose = what_result.get('三点解构', {}).get('目的点', {})
    key_points = what_result.get('三点解构', {}).get('关键点', {}).get('key_points', [])

    # 构造灵感点列表
    inspiration_list = []
    for idx, insp in enumerate(inspiration_points, 1):
        inspiration_list.append(f"{idx}. {insp.get('灵感点', '')}\n   描述：{insp.get('描述', '')}")

    # 构造关键点列表
    key_point_list = []
    for idx, kp in enumerate(key_points, 1):
        key_point_list.append(f"{idx}. {kp.get('关键点', '')} ({kp.get('类型', '')})")

    content = []

    # 添加说明
    content.append({
        "type": "input_text",
        "text": "# HOW 业务解构任务\n\n你需要分析创作者是通过什么手段和方法完成创作的。"
    })

    # 添加原始帖子图片
    content.append({
        "type": "input_text",
        "text": f"\n## 原始帖子（共{len(images)}张图片）"
    })

    for img_url in images:
        content.append({
            "type": "input_image",
            "detail": "auto",
            "image_url": img_url
        })

    # 添加帖子文本
    content.append({
        "type": "input_text",
        "text": f"""
## 帖子基本信息
标题：{post_data.get('title', '')}
正文：{post_data.get('body_text', '')}
"""
    })

    # 添加 what 解构结果
    content.append({
        "type": "input_text",
        "text": f"""
## WHAT 解构结果

### 灵感点列表
{chr(10).join(inspiration_list)}

### 目的点
{purpose.get('main_purpose', '')}
描述：{purpose.get('description', '')}

### 关键点列表
{chr(10).join(key_point_list)}
"""
    })

    # 添加 how 分析任务
    content.append({
        "type": "input_text",
        "text": """
## 你的任务

请基于以上信息，深入分析创作过程中的"手段"和"方法"，输出以下内容：

### 1. 灵感点获取分析
对每个灵感点，分析：
- **来源途径**：这个灵感是从哪里来的？（生活观察、素材积累、热点追踪等）
- **获取手段**：创作者用了什么具体方法获得这个灵感？
  - 主要方法（如：日常行为模式观察、表情包库浏览等）
  - 具体手段（列举3-4个具体步骤或操作）
  - 触发点（什么时刻产生的灵感）

### 2. 目的点确定分析
分析创作者如何确定这个目的：
- **来源途径**：这个目的是基于什么确定的？
- **确定手段**：
  - 主要方法（如：内容价值评估、受众分析等）
  - 具体手段（列举3-5个分析步骤）
  - 决策逻辑（如何从灵感点推导到目的点）

### 3. 关键点形成分析
分析灵感点和目的点如何推导出关键点：
- **形成逻辑**：整体的推导思路
- **推导方法**：
  - 方法论名称（如：目标分解法、手段枚举法）
  - 具体过程（对每个关键点，说明如何从灵感点/目的点推导出来）
- **关键点分类**：按内容层、形式层、传播层分类

### 4. 选题形成分析
分析三点如何整合成选题：
- **形成路径**：灵感点 → 目的点 → 关键点 → 选题
- **整合方法**：
  - 方法论（如：要素提取、逻辑串联、主题凝练）
  - 具体步骤（5个左右的步骤，每步说明手段、操作、结果）
- **整合原理**：说明三点在选题中的作用和验证标准

### 5. 创作流程总结
- 完整流程（从灵感获取到选题确定的全流程）
- 核心方法论（每个阶段的关键方法）
- 关键能力要求（需要具备什么能力）

请以 JSON 格式输出，结构清晰，包含所有分析维度。
"""
    })

    return [{
        "role": "user",
        "content": content
    }]


async def main():
    # 读取帖子数据
    example_id = '689bf685000000001d0021d3'
    in_dir = f'examples/{example_id}/输入'
    out_dir = f'examples/{example_id}/输出'

    target_note_file = f'{in_dir}/待解构帖子.json'
    what_result_file = f'{in_dir}/what_解构结果.json'

    target_note = read_json(target_note_file)
    what_result = read_json(what_result_file)

    print("=" * 80)
    print("开始 HOW 业务解构")
    print("=" * 80)

    # 构造 how 分析消息
    multimodal_messages = build_how_analysis_message(
        post_data=target_note,
        what_result=what_result
    )

    # 运行 agent
    print("\n正在分析创作手段和方法...")
    result = await Runner.run(agent, input=multimodal_messages)

    print("\n" + "=" * 80)
    print("HOW 解构结果")
    print("=" * 80)
    print(result.final_output)

    # 尝试解析并保存结果
    try:
        # 提取 JSON 内容（如果包含在 markdown 代码块中）
        output_text = result.final_output
        if "```json" in output_text:
            json_start = output_text.index("```json") + 7
            json_end = output_text.index("```", json_start)
            json_text = output_text[json_start:json_end].strip()
        elif "```" in output_text:
            json_start = output_text.index("```") + 3
            json_end = output_text.index("```", json_start)
            json_text = output_text[json_start:json_end].strip()
        else:
            json_text = output_text

        # 解析 JSON
        how_result = json.loads(json_text)

        # 保存结果
        output_file = f'{out_dir}/how_解构结果_生成.json'
        with open(output_file, 'w', encoding='utf-8') as f:
            json.dump(how_result, f, ensure_ascii=False, indent=2)

        print(f"\n✓ 结果已保存到：{output_file}")

    except Exception as e:
        print(f"\n⚠ 无法解析 JSON 结果：{e}")
        print("请手动检查输出内容")


if __name__ == "__main__":
    set_trace()
    with trace("how decode"): 
        asyncio.run(main())
