import json
from openai import OpenAI
from dotenv import load_dotenv

load_dotenv()
client = OpenAI()


def calculator(expression):
    """실제로 계산을 수행할 파이썬 함수"""
    return str(eval(expression))


# (1) 정답 — 도구를 JSON 스키마로 직접 정의 (LangChain 의 @tool/bind_tools 가 자동 생성해주던 것)
tools = [{
    "type": "function",
    "function": {
        "name": "calculator",
        "description": "수학 식을 계산한다. 예: '53 * 7 + 2'",
        "parameters": {
            "type": "object",
            "properties": {"expression": {"type": "string", "description": "계산할 수식"}},
            "required": ["expression"],
        },
    },
}]

messages = [{"role": "user", "content": "53 * 7 + 2 는 얼마야?"}]

# (2) 정답 — tools= 로 호출 → 모델이 '어떤 함수를 부를지' 결정 (실행은 아직 안 함)
msg = client.chat.completions.create(
    model="gpt-4o-mini", messages=messages, tools=tools
).choices[0].message
print("호출 결정:", [(c.function.name, c.function.arguments) for c in msg.tool_calls])

# (3) 정답 — 결정된 함수를 실제로 실행 → 결과를 'tool' 메시지로 붙임
messages.append(msg)                              # 모델의 tool_call 메시지
for call in msg.tool_calls:
    args = json.loads(call.function.arguments)    # arguments 는 JSON '문자열' → dict 로 변환
    result = calculator(**args)
    messages.append({"role": "tool", "tool_call_id": call.id, "content": result})

# (4) 정답 — 결과를 주고 다시 호출 → 최종 답변
final = client.chat.completions.create(model="gpt-4o-mini", messages=messages)
print("최종 답변:", final.choices[0].message.content)
