import asyncio
from langchain.tools import BaseTool, tool
from pydantic import BaseModel, Field
from typing import Type

class MongoChatHistoryToolInput(BaseModel):
    thread_id: str = Field(description="Hangi konuşma/oturum ID'sinin geçmişi çekilecek")
    limit: int = Field(default=10, description="Kaç mesaj getirileceği (max 200)")

class MongoChatHistoryTool(BaseTool):
    name: str = "mongodb_sohbet_gecmisi"
    description: str = (
        "MongoDB'den belirtilen thread_id için eski sohbet geçmişini getirir. "
        "En yeni mesajlar yukarıda olacak şekilde sıralı döner."
    )
    args_schema: Type[BaseModel] = MongoChatHistoryToolInput

    async def _arun(self, thread_id: str, limit: int = 10) -> str:  # type: ignore[override]
        global client, db, chat_col, users_col
        assert chat_col is not None
        limit = min(max(limit, 1), 10)
        cursor = (
            chat_col.find({"thread_id": thread_id}, projection={"_id": 0})
            .sort("timestamp", -1)
            .limit(limit)
            .max_time_ms(3000)
        )
        docs = [doc async for doc in cursor]
        # Tarihleri ISO formatlı string yapalım
        for d in docs:
            if "timestamp" in d and hasattr(d["timestamp"], "isoformat"):
                d["timestamp"] = d["timestamp"].isoformat()
        # En eski üstte olsun diye ters çevir
        docs.reverse()
        return json.dumps(docs, ensure_ascii=False, indent=2)
    
    def _run(self, thread_id: str, limit: int = 10) -> str:
        return asyncio.run(self._arun(thread_id, limit))
