#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
目的点提取Agent（视频分析版本）

功能: 从视频内容中提取创作目的
核心任务: 从创作者视角分析，创作这个视频的目的是什么（为了什么而创作）
特征: 创作者视角，分析创作动机和目标，基于视频逐帧分析

升级说明:
- 统一结构：维度 → 目的点 → 描述
- 维度：观察创作目的的角度（必须从标准分类体系中选择）
- 目的点：表示创作目标（≤15字）
- 描述：对目的的客观描述
- 数量：1-3个目的点，平等不分主次
- 约束：同一维度只能有一个目的点，互斥的目的不能同时出现
- 视频分析：需要对视频进行逐帧或关键帧分析，捕捉动态变化和细节
"""

from typing import Any, Dict, List
import json

from src.components.agents.base import BaseLLMAgent
from src.utils.logger import get_logger
from src.utils.llm_invoker import LLMInvoker

logger = get_logger(__name__)

LOG_SEPARATOR = "=" * 80


class PurposePointAgent(BaseLLMAgent):
    """目的点提取Agent - 分析创作目的和动机

    职责边界：
    - 只提取"目的点"（创作时的动机）
    - 不提取"灵感点"（创作前的触发源，由InspirationPointsAgent负责）
    - 不提取"关键点"（消费者吸引点，由KeyPointsAgent负责）

    核心特征：
    1. 创作者视角：站在创作者角度思考"我为什么要创作这个"
    2. 目标导向：分析创作者希望达到什么效果
    3. 维度化表达：维度（观察角度）→ 目的点（目标）→ 描述（说明）
    4. 证据支撑：基于内容推断，记录推导过程
    """

    def __init__(
        self,
        name: str = "purpose_point_agent",
        description: str = "目的点提取Agent - 分析创作目的",
        model_provider: str = "google_genai",
        temperature: float = 0.5,
        max_tokens: int = 8192
    ):
        """
        初始化目的点提取Agent

        Args:
            name: Agent名称
            description: Agent描述
            model_provider: 模型提供商
            temperature: 生成温度
            max_tokens: 最大token数
        """
        system_prompt = self._build_system_prompt()
        super().__init__(
            name=name,
            description=description,
            model_provider=model_provider,
            system_prompt=system_prompt,
            temperature=temperature,
            max_tokens=max_tokens
        )

    def _build_system_prompt(self) -> str:
        """构建系统提示词"""
        return """你是内容创作分析专家，从创作者视角提取创作目的。

# 核心概念

**目的点** = 创作者希望通过内容对受众产生的影响或效果（Why创作）
- 区分：目的点（Why）≠ 创作手段（How）≠ 灵感点（触发源）
- 验证：问"创作者为什么要做这个内容？"而非"如何做"
- 数量：1-3个，每个二级分类最多1个目的点

# 输出结构

每个目的点包含：
1. **维度**：结构化对象 {"一级分类": "", "二级分类": ""}
2. **目的点**：≤15字，描述创作者希望达成的最终效果
3. **描述**：解释创作者希望受众产生什么反应/影响
4. **推理**：说明这个目的点是如何得出来的，解释从视频内容推导出这个创作目的的过程（基于视频的哪些画面/动作/场景/对话等线索，推导出创作者的这个目的）

# 标准分类体系

```
# 一级：个人
## 二级：记录（个人记录、日记、生活点滴）
## 二级：分享（分享经验、知识、感受、故事）

# 一级：创作者
## 二级：面向粉丝（粉丝运营、互动、维护关系）
## 二级：品牌种草（推广产品/品牌、种草带货）
## 二级：商业化效果（转化、ROI、销售业绩）

# 一级：其他（无法归类的特殊情况）
```

# 核心原则

- **目的优先**：问"为什么"
- **创作者视角**：站在创作者角度思考"我想让受众产生什么反应"
- **证据支撑**：基于视频内容具体体现推断目的
- **分类规范**：维度必须从标准分类体系中选择，优先选择二级分类
- **互斥约束**：每个二级分类只能出现一次
- **宁缺毋滥**：如果目的不明确，不要强行生成，最少可以只有1个目的点
- **视频逐帧分析**：需要对视频进行逐帧或关键帧分析，捕捉画面、动作、场景、对话等维度的信息
"""

    def process(self, state: Dict[str, Any], config=None) -> Dict[str, Any]:
        """处理状态 - 提取目的点（三层结构）"""
        if not self.is_initialized:
            self.initialize()

        logger.info("目的点分析开始")

        try:
            # 从 state 获取视频文件对象
            from src.utils.llm_invoker import get_video_file_from_state
            video_file = get_video_file_from_state(state)

            if not video_file:
                logger.warning("无法获取视频文件对象，跳过目的点提取")
                return {
                    "purpose_point": {
                        "error": "无法获取视频文件对象",
                        "purposes": [],
                        "total_count": 0
                    }
                }

            # 构建分析prompt（只使用视频）
            prompt = self._build_analysis_prompt("")

            # 使用新的视频分析API
            # 将系统提示词合并到用户提示词中
            full_prompt = f"{self.system_prompt}\n\n{prompt}"
            
            result = LLMInvoker.safe_invoke_video_analysis(
                "目的点提取",
                video_file,
                full_prompt,
                agent=self,
                fallback={
                    "目的点列表": []
                }
            )

            # 构建最终输出（扁平化展示所有目的点）
            purpose_points = result.get("目的点列表", [])

            final_output = {
                "purpose_point": {
                    "perspective": "创作者视角",
                    "purposes": purpose_points,  # 所有目的点平等展示
                    "total_count": len(purpose_points)
                }
            }

            logger.info(f"最终结果: {len(purpose_points)}个目的点")

            return final_output

        except Exception as e:
            logger.error(f"目的点分析失败: {e}", exc_info=True)
            return {
                "purpose_point": {
                    "error": str(e),
                    "purposes": [],
                    "total_count": 0
                }
            }

    def _build_messages(self, state: Dict[str, Any]) -> List[Dict[str, Any]]:
        """构建消息 - BaseLLMAgent要求实现（本Agent不使用此方法）"""
        return []

    def _update_state(self, state: Dict[str, Any], response: Any) -> Dict[str, Any]:
        """更新状态 - BaseLLMAgent要求实现（本Agent不使用此方法）"""
        return state

    def _build_analysis_prompt(self, video_url: str = "") -> str:
        """构建分析prompt（视频逐帧分析版本）"""
        prompt = f"""# 任务：提取创作目的（视频逐帧分析）

## 视频内容
请对视频进行逐帧或关键帧分析。

**重要**：你需要对视频进行逐帧或关键帧分析，捕捉以下维度的信息：
- **画面内容**：场景、物体、人物、环境等视觉元素
- **动作变化**：人物的动作、物体的运动、场景的转换
- **时间线索**：视频的时间顺序、节奏变化、关键时间点
- **视觉细节**：颜色、光影、构图、视觉焦点等
- **音频信息**（如有）：对话、音效、背景音乐等

## 分析步骤
1. **逐帧分析**：观察视频的每一帧或关键帧，理解视频的整体内容和结构
2. **识别意图**：从视频的画面、动作、场景、对话等维度，推断创作者想让受众产生什么反应/影响（Why）
3. **维度归类**：从标准分类体系中选择最匹配的维度（优先二级分类）
4. **提炼目的点**：在维度下提炼具体目标（≤15字，聚焦最终效果，不写手段）

## 重要约束
- **每个二级分类最多1个目的点**（例如不能同时有2个"记录"维度的目的点）
- **宁缺毋滥**：如果某个维度的目的不明确，不要强行生成
- **总数控制**：最终输出1-3个目的点，不要为了凑数而硬造
- **证据支撑**：每个目的点都必须有足够的视频内容支撑，不能臆测
- **基于视频**：所有目的点必须基于视频的实际内容，不能凭空想象

## 输出格式（JSON）
{{
    "目的点列表": [
        {{
            "维度": {{
                "一级分类": "",
                "二级分类": ""
            }},
            "目的点": "",
            "描述": "",
            "推理": "说明基于视频的哪些画面/动作/场景/对话等线索，推导出创作者的这个目的"
        }}
    ]
}}
"""

        return prompt



