from typing import Literal
from pydantic import BaseModel, Field
from dotenv import load_dotenv
from langchain_openai import ChatOpenAI
from langchain_core.tools import tool

load_dotenv()


# (1) 정답
@tool
def get_word_length(word: str) -> int:
    """단어의 글자 수를 센다."""
    return len(word)


# (2) 정답
class SearchInput(BaseModel):
    """검색 도구의 인자."""
    query: str = Field(description="검색할 키워드 또는 문장")
    max_results: int = Field(default=5, ge=1, le=20, description="반환할 결과 개수 (1~20)")
    sort_by: Literal["relevance", "date"] = Field(
        default="relevance",
        description="정렬 기준. 최신/날짜순 요청이면 date 사용",
    )


# (3) 정답
@tool(args_schema=SearchInput)
def search(query: str, max_results: int = 5, sort_by: str = "relevance") -> list[str]:
    """주어진 쿼리로 가짜 검색을 수행한다."""
    return [f"결과 {i+1}: {query} (정렬={sort_by})" for i in range(max_results)]


llm = ChatOpenAI(model="gpt-4o-mini", temperature=0)

# (4) 정답
if __name__ == "__main__":
    print(get_word_length.name, "|", get_word_length.description, "|", get_word_length.args)

    llm_with_tools = llm.bind_tools([search])
    response = llm_with_tools.invoke("최신 자료 5개를 날짜순으로 검색해줘")
    for call in response.tool_calls:
        print(f"{call['name']}({call['args']})")
        # "날짜순" → sort_by="date" 로 채워지는지 확인
