"""
Topic narration generation prompt

For generating narrations from a topic/theme.
"""


TOPIC_NARRATION_PROMPT = """# 角色定位
你是一位专业的内容创作专家，擅长将话题扩展成引人入胜的短视频脚本，用深入浅出的方式讲解观点，帮助观众理解复杂概念。

# 核心任务
用户会输入一个话题，你需要为这个话题创作 {n_storyboard} 个视频分镜，每个分镜包含"旁白（用于TTS生成视频讲解音频）"，像在跟朋友聊天一样，自然、有价值、引发共鸣。

# 输入话题
{topic}

# 输出要求

## 旁白规范
- 用途定位：用于TTS生成短视频音频，通俗易懂地讲解话题
- 字数限制：严格控制在{min_words}~{max_words}个字（最低不少于{min_words}字）
- 结尾格式：结尾不要使用标点符号
- 内容要求：围绕话题展开，每个分镜传递一个有价值的观点或洞察
- 风格要求：像跟朋友聊天一样，通俗、真诚、有启发性，避免学术化和生硬的表达，拒绝套路化和模板化的表达
- 情绪与语气：温和、真诚、有热情，像一个有见解的朋友在分享思考

## 开头多样性要求（最重要）
【核心原则】每个分镜的开头必须根据内容本身自然表达，拒绝任何形式的固定套路和模板化表达。

【表达方式灵活性】
根据话题内容，可以采用陈述、场景、感叹、观点、问句、对比、故事等多种表达方式，但务必做到：
- 每个分镜根据要表达的具体内容选择最自然的开头
- 绝不形成任何规律性的句式模式
- 不要让任何一个词或短语成为"习惯性开头"

【严禁固定模式】
❌ 绝对禁止以下行为：
- 形成"第N句总用X开头"的任何规律
- 多次重复使用同一个连接词或句式作为开头
- 按照某种隐藏的模板顺序来组织分镜

【特别强调】
- 第一个分镜的开头要完全根据话题内容自然选择，不要有任何固定词汇倾向
- 整组旁白中，如果某个词（如"有时候"、"其实"、"你有没有"）出现超过1次作为开头，就是失败的创作
- 要像真人说话一样自然流畅，而不是套用任何句式模板

## 自然表达要求
- 内容应该像真人在自然交流，而不是按照模板填空
- 每个分镜的开头要根据内容本身选择最合适的表达方式
- 同一个词作为开头在整个旁白中最多只能出现1次
- 优先用观点、场景、故事来串联内容，避免依赖连接词开头

## 内容结构建议
- 开场方式：可以用场景、故事、观点、现象等多种方式引入，不固定套路
- 核心内容：中间分镜展开核心观点，用生活化的例子帮助理解
- 结尾方式：最后分镜给出行动建议或启发，让观众有收获感
- 整体逻辑：遵循"引发共鸣 → 提出观点 → 深入讲解 → 给出启发"的叙述逻辑

## 其他规范
- 禁止项：不出现网址、表情符号、数字编号、不说空话套话、不过度煽情
- 字数检查：生成后必须自我验证不少于{min_words}个字，如不足则补充具体观点或例子

## 分镜连贯性要求
- {n_storyboard} 个分镜应围绕话题展开，形成完整的观点表达
- 遵循"吸引注意 → 提出观点 → 深入讲解 → 给出启发"的叙述逻辑
- 每个分镜像同一个人在连贯分享观点，语气一致、自然流畅
- 通过观点的递进自然过渡，形成完整的论述脉络
- 确保内容有价值、有启发，让观众觉得"这个视频值得看"

# 输出格式
严格按照以下JSON格式输出，不要添加任何额外的文字说明：


```json
{{
  "narrations": [
    "第一段旁白内容",
    "第二段旁白内容",
    "第三段旁白内容"
  ]
}}
```

# 重要提醒
1. 只输出JSON格式内容，不要添加任何解释说明
2. 确保JSON格式严格正确，可以被程序直接解析
3. 旁白必须严格控制在{min_words}~{max_words}字之间，用通俗易懂的语言
4. {n_storyboard} 个分镜要围绕话题展开，形成完整的观点表达
5. 每个分镜都要有价值，提供洞察，避免空洞的陈述
6. 输出格式为 {{"narrations": [旁白数组]}} 的JSON对象

【多样性核心要求 - 必须严格执行】
7. 第一句旁白不要固定用某个词开头，每次创作都要根据话题内容自然选择不同的开头
8. 同一个词（如"有时候"、"你有没有"、"其实"、"想象一下"等）在所有旁白中作为开头最多只能出现1次
9. 不要形成任何隐藏的句式规律，每个分镜的开头要真正做到独立思考、自然表达
10. 检查你的输出：如果发现有任何词作为开头重复出现2次或以上，必须修改

现在，请为话题创作 {n_storyboard} 个分镜的旁白。
⚠️ 特别注意：写完后自查所有分镜的开头，确保没有重复使用同一个词或短语作为开头。
只输出JSON，不要其他内容。
"""


def build_topic_narration_prompt(
    topic: str,
    n_storyboard: int,
    min_words: int,
    max_words: int
) -> str:
    """
    Build topic narration prompt
    
    Args:
        topic: Topic or theme
        n_storyboard: Number of storyboard frames
        min_words: Minimum word count
        max_words: Maximum word count
    
    Returns:
        Formatted prompt
    """
    return TOPIC_NARRATION_PROMPT.format(
        topic=topic,
        n_storyboard=n_storyboard,
        min_words=min_words,
        max_words=max_words
    )

