from .base import Agent as BaseAgent
from browser_use import Browser, Agent, ChatOpenAI
from enum import Enum

class AgentTypes(str, Enum):
    GENERIC_BROWSER_USE_AGENT = "generic_browser_use_agent"

def _build_prompt(goal : str, environment_url : str) -> str:
    #TODO: Improve prompt engineering here and experiment with
    return f"""You are an autonomous agent tasked with achieving the following goal: {goal}
You have access to a web browser to interact with the environment at {environment_url}.
Use the browser to navigate, gather information, and perform actions necessary to accomplish your goal.
Be thorough and ensure you complete the task fully."""

class GenericBrowserUseAgent(BaseAgent):
    def __init__(self,
                 goal: str,
                 url: str = "http://localhost:3000",
                 timeout: int = 300,
                 llm_model: str = "gpt-5-mini",
                 headless: bool = True):
        super().__init__(goal, url, timeout)
        self.llm_model = ChatOpenAI(model=llm_model)
        self.browser = Browser(headless=headless)
        self.agent = Agent(task=_build_prompt(goal, url),
                           llm=self.llm_model,
                           browser=self.browser)
    async def act(self) -> str:
        self.result = await self.agent.run()
        # https://github.com/browser-use/browser-use/blob/main/browser_use/agent/views.py#L301
        return self.result.final_result()

def get_agent(agent_type: AgentTypes,  **kwargs) -> Agent:
    if agent_type == AgentTypes.GENERIC_BROWSER_USE_AGENT:
        return GenericBrowserUseAgent(**kwargs)
    else:
        raise ValueError(f"Unknown agent type: {agent_type}")

if __name__ == "__main__":
    import asyncio
    JTBD= "Find me the cheapest room in Madrid for 2 people in the next two days, review each hotel room in detail and then add it to cart."
    agent = get_agent(AgentTypes.GENERIC_BROWSER_USE_AGENT,
                      goal=JTBD,
                      url="http://localhost:3000/start-task?uuid=d10f5ab3-a7b7-4e97-8d94-ab06f1537c0a",
                      timeout=300)
    R=asyncio.run(agent.act())
    print(R)
