from termcolor import colored

from swarms.prompts.autobloggen import (
    DRAFT_AGENT_SYSTEM_PROMPT,
    REVIEW_PROMPT,
    SOCIAL_MEDIA_SYSTEM_PROMPT_AGENT,
    TOPIC_GENERATOR,
)

# Prompts
topic_selection_task = (
    "Generate 10 topics on gaining mental clarity using ancient"
    " practices"
)


class AutoBlogGenSwarm:
    """
    AutoBlogGenSwarm

    Swarm Agent
    Topic selection agent -> draft agent -> review agent -> distribution agent

    Topic Selection Agent:
    - Generate 10 topics on gaining mental clarity using Taosim and Christian meditation

    Draft Agent:
    - Write a 100% unique, creative and in human-like style article of a minimum of 5,000 words using headings and sub-headings.

    Review Agent:
    - Refine the article to meet PositiveMed’s stringent publication standards.

    Distribution Agent:
    - Social Media posts for the article.

    Example:
    ```
    from swarms.autobloggen import AutoBlogGenSwarm
    swarm = AutoBlogGenSwarm()
    swarm.run()
    ```


    """

    def __init__(
        self,
        llm,
        objective: str = "Clicks and engagement",
        iterations: int = 3,
        topic_selection_task: str = topic_selection_task,
        max_retries: int = 3,
        retry_attempts: int = 3,
        topic_selection_agent_prompt: str = f"Your System Instructions: {TOPIC_GENERATOR}, Your current task: {topic_selection_task}",
    ):
        self.llm = llm()
        self.topic_selection_task = topic_selection_task
        self.topic_selection_agent_prompt = (
            topic_selection_agent_prompt
        )
        self.objective = objective
        self.iterations = iterations
        self.max_retries = max_retries
        self.retry_attempts = retry_attempts

    def print_beautifully(self, subheader: str, text: str):
        """Prints the text beautifully"""
        print(
            colored(
                f"""
            ------------------------------------
            {subheader}
            -----------------------------

            {text}
            
            """,
                "blue",
            )
        )

    def social_media_prompt(self, article: str):
        """Gets the social media prompt"""
        prompt = SOCIAL_MEDIA_SYSTEM_PROMPT_AGENT.replace(
            "{{ARTICLE}}", article
        ).replace("{{GOAL}}", self.objective)
        return prompt

    def get_review_prompt(self, article: str):
        """Gets the review prompt"""
        prompt = REVIEW_PROMPT.replace("{{ARTICLE}}", article)
        return prompt

    def step(self):
        """Steps through the task"""
        topic_selection_agent = self.llm(
            self.topic_selection_agent_prompt
        )
        topic_selection_agent = self.print_beautifully(
            "Topic Selection Agent", topic_selection_agent
        )

        draft_blog = self.llm(DRAFT_AGENT_SYSTEM_PROMPT)
        draft_blog = self.print_beatiufully("Draft Agent", draft_blog)

        # Agent that reviews the draft
        review_agent = self.llm(self.get_review_prompt(draft_blog))
        review_agent = self.print_beautifully(
            "Review Agent", review_agent
        )

        # Agent that publishes on social media
        distribution_agent = self.llm(
            self.social_media_prompt(article=review_agent)
        )
        distribution_agent = self.print_beautifully(
            "Distribution Agent", distribution_agent
        )

    def run(self):
        """Runs the swarm"""
        for attempt in range(self.retry_attempts):
            try:
                for i in range(self.iterations):
                    self.step()
            except Exception as error:
                print(
                    colored(
                        (
                            "Error while running AutoBlogGenSwarm"
                            f" {error}"
                        ),
                        "red",
                    )
                )
                if attempt == self.retry_attempts - 1:
                    raise

    def update_task(self, new_task: str):
        """
        Updates the task of the swarm

        Args:
            new_task (str): New task to be performed by the swarm

        """
        self.topic_selection_agent = new_task