"""Prompts for generic agent."""

from textwrap import dedent
from typing import ClassVar

from langchain.prompts import PromptTemplate
from pydantic import BaseModel


class Prompts(BaseModel):
    """Prompts for generic agent."""

    TASK_SLICE: ClassVar[str] = dedent(
        """\
	Begin! This is VERY important to you, your job depends on it!

	Current Task: {input}"""
    )

    SCRATCHPAD_SLICE: ClassVar[str] = "\n{agent_scratchpad}"

    MEMORY_SLICE: ClassVar[str] = dedent(
        """\
	This is the summary of your work so far:
	{chat_history}"""
    )

    ROLE_PLAYING_SLICE: ClassVar[str] = dedent(
        """\
	You are {role}.
	{backstory}

	Your personal goal is: {goal}"""
    )

    TOOLS_SLICE: ClassVar[str] = dedent(
        """\


	TOOLS:
	------
	You have access to the following tools:

	{tools}

	To use a tool, please use the exact following format:

	```
	Thought: Do I need to use a tool? Yes
	Action: the action to take, should be one of [{tool_names}], just the name.
	Action Input: the input to the action
	Observation: the result of the action
	```

	When you have a response for your task, or if you do not need to use a tool, you MUST use the format:

	```
	Thought: Do I need to use a tool? No
	Final Answer: [your response here]
	```"""
    )

    VOTING_SLICE: ClassVar[str] = dedent(
        """\
	You are working on a crew with your co-workers and need to decide who will execute the task.

	These are your format instructions:
	{format_instructions}

	These are your co-workers and their roles:
	{coworkers}"""
    )

    TASK_EXECUTION_WITH_MEMORY_PROMPT: ClassVar[str] = PromptTemplate.from_template(
        ROLE_PLAYING_SLICE + TOOLS_SLICE + MEMORY_SLICE + TASK_SLICE + SCRATCHPAD_SLICE
    )

    TASK_EXECUTION_PROMPT: ClassVar[str] = PromptTemplate.from_template(
        ROLE_PLAYING_SLICE + TOOLS_SLICE + TASK_SLICE + SCRATCHPAD_SLICE
    )

    CONSENSUNS_VOTING_PROMPT: ClassVar[str] = PromptTemplate.from_template(
        ROLE_PLAYING_SLICE + VOTING_SLICE + TASK_SLICE + SCRATCHPAD_SLICE
    )
