import json
from typing import Type
from pydantic import BaseModel, Field
from langchain.tools import BaseTool
from FikoGpt.db import get_collections
from FikoGpt.config import get_config

config = get_config()
MAX_HISTORY_LIMIT = config.get("MAX_HISTORY_LIMIT")

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."
    args_schema: Type[BaseModel] = MongoChatHistoryToolInput

    async def _arun(self, thread_id: str, limit: int = 10) -> str:
        from datetime import datetime
        chat_col, _ = get_collections()
        limit = min(max(limit, 1), MAX_HISTORY_LIMIT)
        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]
        for d in docs:
            if "timestamp" in d and hasattr(d["timestamp"], "isoformat"):
                d["timestamp"] = d["timestamp"].isoformat()
        docs.reverse()
        return json.dumps(docs, ensure_ascii=False, indent=2)
    
    async def _run(self, thread_id: str, limit: int = 10) -> str:
        return await self._arun(thread_id, limit)