# Function Calling Template
import json
import os
from openai import OpenAI

client = OpenAI(api_key=os.getenv("OPENAI_API_KEY", "YOUR_API_KEY"))


def get_weather(city: str) -> str:
    return f"Het is 18 graden en zonnig in {city}."


TOOLS = {
    "get_weather": {
        "description": "Vraag het weer op voor een stad",
        "parameters": {
            "type": "object",
            "properties": {"city": {"type": "string"}},
            "required": ["city"],
        },
        "function": get_weather,
    }
}


def agent_loop(query: str, model: str = "gpt-4o-mini", max_turns: int = 5):
    messages = [{"role": "user", "content": query}]
    for _ in range(max_turns):
        resp = client.chat.completions.create(
            model=model,
            messages=messages,
            tools=[
                {
                    "type": "function",
                    "function": {
                        "name": name,
                        "description": meta["description"],
                        "parameters": meta["parameters"],
                    },
                }
                for name, meta in TOOLS.items()
            ],
        )
        choice = resp.choices[0].message
        messages.append(
            {"role": "assistant", "content": choice.content or "", "tool_calls": choice.tool_calls}
        )

        if choice.tool_calls:
            for call in choice.tool_calls:
                fn = TOOLS[call.function.name]["function"]
                args = json.loads(call.function.arguments)
                result = fn(**args)
                messages.append(
                    {"role": "tool", "tool_call_id": call.id, "content": result}
                )
        else:
            return choice.content
    return "Geen antwoord gevonden binnen het aantal stappen."


if __name__ == "__main__":
    print(agent_loop("Wat is het weer in Rotterdam?"))
