from smolagents import CodeAgent, DuckDuckGoSearchTool, HfApiModel,load_tool,tool
import datetime
import requests
import pytz
import yaml
from tools.final_answer import FinalAnswerTool

from Gradio_UI import GradioUI

@tool
def simplify_expression(arg1:str)-> str:
    """A tool that simplify mathematical expression with x and y variables 
    Args:
        arg1: the mathematical expression
    """
    try:
        import sympy as sp
        # define x & y variables
        x, y = sp.symbols('x y')
        expression = sp.sympify(arg1)
        # Simplify
        simplified_expression = sp.simplify(expression)
        # Factor if possible
        factored_expression = sp.factor(simplified_expression)
        # Générer LaTeX output (best rendered in md)
        # latex_code = sp.latex(factored_expression)
        # return latex_code
        return factored_expression
    except Exception as e:
        return f"Ouch, is that a valid math expression : {e}"

@tool
def get_current_time_in_timezone(timezone: str) -> str:
    """A tool that fetches the current local time in a specified timezone.
    Args:
        timezone: A string representing a valid timezone (e.g., 'America/New_York').
    """
    try:
        # Create timezone object
        tz = pytz.timezone(timezone)
        # Get current time in that timezone
        local_time = datetime.datetime.now(tz).strftime("%Y-%m-%d %H:%M:%S")
        return f"The current local time in {timezone} is: {local_time}"
    except Exception as e:
        return f"Error fetching time for timezone '{timezone}': {str(e)}"


final_answer = FinalAnswerTool()
model = HfApiModel(
    max_tokens=2096,
    temperature=0.5,
    # model_id='https://wxknx1kg971u7k1n.us-east-1.aws.endpoints.huggingface.cloud',# it is possible that this model may be overloaded
    model_id='https://jc26mwg228mkj8dw.us-east-1.aws.endpoints.huggingface.cloud',
    custom_role_conversions=None,
)



# Import tool from Hub
image_generation_tool = load_tool("agents-course/text-to-image", trust_remote_code=True)

with open("prompts.yaml", 'r') as stream:
    prompt_templates = yaml.safe_load(stream)
    
agent = CodeAgent(
    model=model,
    tools=[final_answer, simplify_expression, image_generation_tool],
    additional_authorized_imports=['requests', 'sympy'],
    max_steps=6,
    verbosity_level=1,
    grammar=None,
    planning_interval=None,
    name=None,
    description=None,
    prompt_templates=prompt_templates
)


GradioUI(agent).launch()