import zhipuai


class ZhipuaiUtil:
    """Utility class for interacting with Zhipu.ai for content creation."""

    def __init__(self, api_key: str) -> None:
        """Initialize the utility with the necessary API key."""
        zhipuai.api_key = api_key

    def promotion_prompt(self, book_intro):
        """Generate a promotion prompt for a given book introduction.

        Args:
            book_intro (str): The introduction of the book to be promoted.

        Returns:
            str: A formatted string prompt for content creation.
        """
        if not book_intro:
            raise ValueError("The book introduction cannot be empty.")

        return f"""
        你是小红书爆款写作专家，请你用以下步骤来进行创作，首先产出5个标题，其次产出1个正文。我会给你提供一份[书籍介绍]，你要用爆款写作的方式在双十一推广这本书。
        小红书爆款写作指导文档
        为了更好地利用AI技术创建小红书的爆款文案，您可以按照以下步骤进行操作：
        1. 产出标题
        首先，您需要为文章创作一个吸引人的标题。在小红书平台上，标题是非常关键的，因为它是用户首先看到的内容。
        技能与策略
        采用二极管标题法：这种方法通常会提供两种极端的选择或情感，使读者产生好奇心。
        吸引人的特点：使用引人入胜、具有话题性或与当前热点事件相关的词汇。
        使用爆款关键词：从提供的列表中随机选择1-2个关键词，并嵌入标题中。
        了解小红书平台的标题特性：确保标题长度适中，不超过平台的限制，并且与平台的风格相匹配。
        遵循创作规则：确保标题不含有违反小红书平台规定的内容。
        2. 产出正文
        接下来，您需要为文章创作正文内容。在小红书上，用户通常喜欢阅读简短、有趣和具有话题性的内容。
        技能与策略
        写作风格：确保内容口语化、简短，每句话都要简明扼要。
        写作开篇方法：开篇要有吸引力，可以使用一个引人入胜的故事或事实作为开头。
        文本结构：确保文章有清晰的结构，包括开头、正文和结尾。
        互动引导方法：在文章中加入互动元素，如提问或引导用户留言。
        使用小技巧：如在文章中添加引用、统计数据或名人名言等。
        使用爆炸词：在正文中适当使用爆炸词，增加文章的吸引力。
        SEO关键词：从文章中抽取3-6个关键词，生成#标签并放在文章最后。
        以下是[书籍介绍]：{book_intro}
        """

    def generate_promotion(self, book_intro):
        """Generate promotional content for a book using the Zhipu.ai model.

        Args:
            book_intro (str): The introduction of the book for which to create promotional content.

        Returns:
            str: The promotional content generated by the AI model.

        Raises:
            ValueError: If the response from the AI model is not in the expected format.
        """
        # Validate the book_intro argument
        if not book_intro:
            raise ValueError(
                "Book introduction must be provided for promotion generation."
            )

        response = zhipuai.model_api.invoke(
            model="chatglm_turbo",
            prompt=[
                {"role": "user", "content": self.promotion_prompt(book_intro)},
            ],
            temperature=0.9,
        )

        # Verify that a valid response is received from the model
        if response.get("data") and response["data"].get("choices"):
            return response["data"]["choices"][0]["content"]
        else:
            raise ValueError("AI model response lacks required content.")
