from typing import Dict, List
from enum import Enum
import json


class ContentType(Enum):
    """内容类型枚举"""
    PRODUCT_REVIEW = "product_review"      # 产品测评
    LIFESTYLE = "lifestyle"                # 生活方式
    KNOWLEDGE = "knowledge"                # 知识科普
    OOTD = "ootd"                          # 穿搭分享
    FOOD = "food"                          # 美食探店
    TRAVEL = "travel"                      # 旅行攻略
    COFFEE_CULTURE = "coffee_culture"      # 咖啡文化


class TemplateManager:
    """模板管理器

    管理各类内容类型的提示词模板和系统提示词
    """

    def __init__(self):
        self.templates = self._load_templates()

    def _load_templates(self) -> Dict[str, Dict]:
        """加载模板配置"""
        return {
            # 产品测评模板
            ContentType.PRODUCT_REVIEW.value: {
                "prompt_template": """你是一位专业的小红书博主，擅长{style}风格的内容创作。

请为【{product_name}】写一篇产品测评文案，要求：
1. 标题吸睛，使用emoji表达情绪
2. 开头制造悬念或共鸣
3. 3-5个测评要点，每个用emoji标记
4. 给出购买建议/避雷提示
5. 结尾引导互动
6. 加入相关话题标签

产品信息：{product_info}
目标人群：{target_audience}
价格区间：{price_range}""",
                "system_prompt": "你是小红书平台的产品测评专家，擅长用真实体验和幽默风趣的方式分享产品，帮助用户避雷种草。",
                "default_tags": ["#好物推荐", "#测评", "#种草", "#真实测评"]
            },

            # 生活方式模板
            ContentType.LIFESTYLE.value: {
                "prompt_template": """创作一篇关于【{topic}】的生活方式分享文案。

风格：{style}
场景：{scenario}
情绪基调：{mood}

要求：
- 第一人称叙述，真情实感
- 描述具体场景和细节
- 给出实用建议或心得
- 自然加入3-5个话题标签
- 字数控制在200-500字""",
                "system_prompt": "你是生活方式博主，擅长从日常中发现美好，传递正能量，与粉丝建立情感连接。",
                "default_tags": ["#生活记录", "#日常分享", "#生活方式", "#生活碎片"]
            },

            # 穿搭分享模板
            ContentType.OOTD.value: {
                "prompt_template": """为一套穿搭创作小红书文案。

穿搭描述：{outfit_description}
风格定位：{style}
适用场合：{occasion}
单品清单：{items}

文案结构要求：
1. 吸睛标题（可标注身材/风格/价位）
2. 穿搭思路和搭配技巧
3. 单品推荐（含品牌/价格区间）
4. 穿搭小Tips（避坑指南）
5. 引导互动话题
6. 相关话题标签""",
                "system_prompt": "你是时尚穿搭博主，擅长分析穿搭逻辑，推荐高性价比单品，帮助普通女孩提升衣品。",
                "default_tags": ["#OOTD", "#穿搭分享", "#今天穿什么", "#穿搭灵感"]
            },

            # 美食探店模板
            ContentType.FOOD.value: {
                "prompt_template": """为【{shop_name}】写一篇探店文案。

店铺信息：{shop_info}
招牌菜品：{signature_dishes}
人均消费：{price}
位置：{location}

文案要求：
1. 标题突出特色（排队/性价比/隐藏菜单）
2. 描述就餐环境和氛围
3. 详细点评招牌菜品（口味/卖相/推荐度）
4. 给出探店小Tips（最佳时间/避雷点）
5. 是否值得推荐/复购
6. 相关话题标签""",
                "system_prompt": "你是美食探店博主，擅长发现隐藏美食，真实评价不吹不黑，帮助吃货们避雷种草。",
                "default_tags": ["#美食探店", "#美食日常", "#探店", "#好吃到爆"]
            },

            # 旅行攻略模板
            ContentType.TRAVEL.value: {
                "prompt_template": """创作【{destination}】旅行攻略文案。

旅行类型：{travel_type}（周末游/度假/探险）
旅行季节：{season}
预算范围：{budget}

攻略内容要求：
1. 吸睛标题（天数+特色+预算）
2. 必打卡景点及推荐理由
3. 住宿推荐（位置/价位/特色）
4. 美食推荐
5. 交通攻略
6. 避坑指南/注意事项
7. 相关话题标签""",
                "system_prompt": "你是旅行博主，擅长规划高性价比路线，发现小众景点，分享实用的旅行经验。",
                "default_tags": ["#旅行攻略", "#旅行", "#周末去哪儿", "#小众旅行地"]
            },

            # 咖啡文化模板
            ContentType.COFFEE_CULTURE.value: {
                "prompt_template": """创作一篇关于【{topic}】的咖啡文化分享文案。

主题方向：{topic}
场景：{cafe_scenario}
风格：{style}

文案要求：
1. 吸睛标题（情绪化/场景化）
2. 开头营造氛围感
3. 分享咖啡知识/品鉴体验/探店感受
4. 给出实用Tips（点单/制作/避坑）
5. 引导互动（推荐/讨论）
6. 相关话题标签

参考氛围词：{mood_keywords}""",
                "system_prompt": "你是咖啡文化博主，热爱探索精品咖啡世界，擅长用细腻的文字描述咖啡的风味和咖啡店的氛围，分享专业的咖啡知识。",
                "default_tags": ["#咖啡", "#咖啡控", "#咖啡探店", "#咖啡文化", "#手冲咖啡"]
            },

            # 知识科普模板
            ContentType.KNOWLEDGE.value: {
                "prompt_template": """创作一篇关于【{topic}】的知识科普文案。

知识点：{knowledge_point}
目标受众：{target_audience}
科普风格：{style}

文案结构：
1. 吸睛标题（设问/数字/反常识）
2. 开头引入话题（痛点/热点）
3. 核心知识讲解（通俗易懂）
4. 实用建议/避坑指南
5. 总结+互动引导
6. 相关话题标签""",
                "system_prompt": "你是知识科普博主，擅长把专业知识讲得通俗易懂，用有趣的案例帮助用户涨知识。",
                "default_tags": ["#科普", "#冷知识", "#涨知识", "#干货分享"]
            },
        }

    def get_template(self, content_type: str) -> Dict:
        """获取指定类型的模板"""
        return self.templates.get(
            content_type,
            self.templates[ContentType.LIFESTYLE.value]
        )

    def render_prompt(self, content_type: str, **kwargs) -> tuple[str, str]:
        """渲染提示词

        Args:
            content_type: 内容类型
            **kwargs: 模板参数

        Returns:
            (system_prompt, user_prompt) 元组
        """
        template = self.get_template(content_type)
        system_prompt = template.get("system_prompt", "")
        user_prompt = template["prompt_template"].format(**kwargs)
        return system_prompt, user_prompt

    def list_types(self) -> List[str]:
        """列出所有内容类型"""
        return [t.value for t in ContentType]

    def get_default_tags(self, content_type: str) -> List[str]:
        """获取默认标签"""
        template = self.get_template(content_type)
        return template.get("default_tags", [])

    def add_custom_template(
        self,
        content_type: str,
        prompt_template: str,
        system_prompt: str = "",
        default_tags: List[str] = None
    ):
        """添加自定义模板"""
        self.templates[content_type] = {
            "prompt_template": prompt_template,
            "system_prompt": system_prompt,
            "default_tags": default_tags or []
        }
