"""
Test Chat Route - NO AUTH REQUIRED
------------------------------------
`POST /api/test/chat` - endpoint thô để kiểm tra AI API key còn sống không.

Không dùng graph, không dùng tools, không dùng history.
Gọi thẳng OpenAI / Gemini / Groq tùy DEFAULT_MODEL.

Dùng để debug: nếu endpoint này work → vấn đề ở auth/middleware.
                nếu không work     → vấn đề API key hoặc model.
"""

import logging
import time

from fastapi import APIRouter
from pydantic import BaseModel

from config import DEFAULT_MODEL, GOOGLE_API_KEY, GROQ_API_KEY, OPENAI_API_KEY

logger = logging.getLogger(__name__)
router = APIRouter(tags=["test"])


class TestChatRequest(BaseModel):
    message: str
    model: str | None = None  # override DEFAULT_MODEL nếu muốn


class TestChatResponse(BaseModel):
    status: str
    model_used: str
    response: str
    latency_ms: int


@router.post(
    "/api/test/chat",
    response_model=TestChatResponse,
    summary="[NO AUTH] Test AI API key trực tiếp",
    description=(
        "Endpoint debug - gọi thẳng LLM không qua graph/tools/auth. "
        "Dùng để kiểm tra API key còn sống và model đang hoạt động."
    ),
)
async def test_chat(req: TestChatRequest) -> TestChatResponse:
    model_name = req.model or DEFAULT_MODEL
    logger.info("[TEST CHAT] model=%s | msg=%s", model_name, req.message)

    t0 = time.monotonic()

    try:
        response_text = await _call_llm(model_name=model_name, message=req.message)
    except Exception as exc:
        logger.error("[TEST CHAT] LLM error: %s", exc, exc_info=True)
        return TestChatResponse(
            status="error",
            model_used=model_name,
            response=f"LỖI: {type(exc).__name__}: {exc}",
            latency_ms=int((time.monotonic() - t0) * 1000),
        )

    latency = int((time.monotonic() - t0) * 1000)
    logger.info("[TEST CHAT] OK latency=%dms", latency)

    return TestChatResponse(
        status="ok",
        model_used=model_name,
        response=response_text,
        latency_ms=latency,
    )


async def _call_llm(model_name: str, message: str) -> str:
    """Gọi LLM tương ứng với model_name, trả về string response."""

    # ── Gemini / Google ──────────────────────────────────────────────────────
    if model_name.startswith("gemini"):
        from langchain_google_genai import ChatGoogleGenerativeAI
        llm = ChatGoogleGenerativeAI(model=model_name, google_api_key=GOOGLE_API_KEY)
        result = await llm.ainvoke(message)
        return result.content

    # ── Groq ─────────────────────────────────────────────────────────────────
    if model_name.startswith("llama") or model_name.startswith("mixtral") or "groq" in model_name:
        from langchain_groq import ChatGroq
        llm = ChatGroq(model=model_name, groq_api_key=GROQ_API_KEY)
        result = await llm.ainvoke(message)
        return result.content

    # ── OpenAI (default) ─────────────────────────────────────────────────────
    from langchain_openai import ChatOpenAI
    llm = ChatOpenAI(model=model_name, openai_api_key=OPENAI_API_KEY)
    result = await llm.ainvoke(message)
    return result.content
