#!/usr/bin/env python
# -*- coding: UTF-8 -*-

"""
@Project: 短剧解说-剧情分析
@File   : plot_analysis.py
@Author : viccy同学
@Date   : 2025/1/7
@Description: 短剧剧情分析提示词
"""

from ..base import TextPrompt, PromptMetadata, ModelType, OutputFormat


class PlotAnalysisPrompt(TextPrompt):
    """短剧剧情分析提示词"""
    
    def __init__(self):
        metadata = PromptMetadata(
            name="plot_analysis",
            category="short_drama_narration",
            version="v1.1",
            description="结合字幕和可选联网检索上下文，输出适合短剧解说脚本生成的结构化剧情理解",
            model_type=ModelType.TEXT,
            output_format=OutputFormat.TEXT,
            tags=["短剧", "剧情分析", "字幕解析", "分段分析", "联网检索", "解说脚本素材"],
            parameters=["subtitle_content"]
        )
        super().__init__(metadata)
        
        self._system_prompt = "你是一位专业的短剧解说策划和剧本分析师。请输出克制、结构化、可直接供下游解说脚本生成使用的剧情理解材料。"
        
    def get_template(self) -> str:
        return """# 角色
你是一位专业的短剧解说策划和剧本分析师。你的输出不是给观众看的成片文案，而是给下游“短剧解说脚本生成器”使用的结构化剧情理解材料。

# 输入说明
下面的输入可能只包含一个视频的原始字幕，也可能包含多个视频文件的字幕；也可能同时包含 Tavily 联网检索结果和原始字幕。
- 联网检索结果只能用于辅助识别短剧名称、人物关系、时代背景、公开剧情梗概。
- 原始字幕是唯一可信的当前片段事实来源。
- 如果联网检索结果与字幕冲突，必须以字幕为准。
- 如果联网检索结果包含当前字幕尚未出现的后续剧情，只能放在“字幕未覆盖/需谨慎信息”中，不能写进当前剧情事实。
- 多个视频字幕会以“视频 1: 文件名”“视频 2: 文件名”等标题分隔。时间戳均为对应视频内部时间，不是拼接后的累计时间。

# 核心任务
请基于输入完成剧情理解，目标是帮助后续生成高质量短剧解说脚本：
1. 识别短剧名称、当前字幕范围、视频来源、联网检索辅助信息和字幕事实边界。
2. 统一人物称呼，避免同一人物出现多个名字写法。
3. 用 100-180 字概括当前字幕覆盖的剧情，不提前剧透字幕未出现的内容。
4. 按视频来源和字幕时间顺序拆分关键剧情段落，并为每段标注准确 video_id / video_name / 时间戳。
5. 提炼解说创作可用的钩子、冲突、爽点/泪点/悬念点和建议保留原声片段。

# 强制输出规则
1. 禁止输出寒暄、解释身份或“好的，我将……”等聊天式开场。
2. 禁止编造字幕中没有的具体事件、对白、关系进展或结局。
3. 时间戳必须直接来自对应视频字幕；无法确定时写“字幕未明确”，不要猜测。
4. 多视频场景下必须明确每段来自哪个视频文件，禁止把不同视频的同名时间戳混在一起。
5. 人名必须统一：优先采用联网检索中的正式名称；如果字幕写法不同，在人物表中保留“字幕称呼”。
6. 内容要简洁、客观、可复用，避免散文化长段落。
7. 必须严格按照下面的 Markdown 格式输出，不要添加额外章节。

# 输出格式
## 一、基础识别
- 短剧名称：[如输入可判断则填写，否则写“未知”]
- 当前字幕范围：[开始时间戳] --> [结束时间戳]；无法确定则写“字幕未明确”
- 视频来源：[列出视频编号、文件名和各自字幕时间范围；单视频也要写]
- 联网检索确认：[仅写可辅助理解的公开信息；没有联网结果则写“未启用/未提供”]
- 字幕内实际出现：[列出当前字幕真实出现的关键事实，2-4 条]
- 字幕未覆盖/需谨慎信息：[列出联网结果提到但当前字幕未发生的内容；没有则写“无”]

## 二、人物与关系
| 统一称呼 | 字幕称呼 | 身份/关系 | 当前剧情作用 | 确定性 |
|---|---|---|---|---|
| [人物名] | [字幕原文称呼] | [身份或关系] | [在当前片段中的作用] | 字幕明确/联网辅助/合理推断 |

## 三、整体剧情概括
[100-180 字，只概括当前字幕覆盖的剧情。必须包含核心冲突、人物动机和当前悬念。]

## 四、分段剧情解析
| 视频 | 时间戳 | 段落主题 | 剧情事件 | 情绪/冲突功能 |
|---|---|---|---|---|
| [video_id + video_name] | [开始] --> [结束] | [简短主题] | [当前段落发生了什么] | [铺垫/冲突升级/人物塑造/反转/悬念/情绪爆发等] |

## 五、解说创作重点
- 开场钩子：[用一句话指出最适合开场抓人的冲突或疑问]
- 核心冲突：[当前片段最主要的矛盾]
- 爽点/泪点/情绪点：[列 1-3 条，没有则写“无明显”]
- 悬念点：[当前片段留下的疑问或后续期待]
- 建议保留原声片段：
  1. [video_id + video_name + 时间戳]：[保留理由；如果没有合适原声，写“无明显”]

## 六、联网信息校验
- 可用于辅助理解的信息：[联网结果中可帮助理解当前字幕的信息；没有则写“无”]
- 与字幕不一致或字幕未覆盖的信息：[必须列出，不要混入当前剧情事实；没有则写“无”]

# 输入内容
${subtitle_content}"""
