from fastapi import APIRouter, Depends

from ..auth import require_auth
from ..config import AI_MODEL
from ..models import AIBoardRequest, AIBoardResponse, AIRequest, AIResponse
from ..openrouter import call_openrouter, run_kanban_ai, safe_ai_error

router = APIRouter()


@router.post("/api/ai/test", response_model=AIResponse)
def ai_test(request: AIRequest) -> AIResponse:
    prompt = request.prompt.strip()
    if not prompt:
        return AIResponse(
            prompt=request.prompt,
            answer="",
            model=AI_MODEL,
            success=False,
            error="Prompt must not be empty.",
        )
    try:
        answer = call_openrouter(prompt)
        return AIResponse(prompt=prompt, answer=answer, model=AI_MODEL, success=True)
    except Exception as exc:
        return AIResponse(
            prompt=prompt,
            answer="",
            model=AI_MODEL,
            success=False,
            error=safe_ai_error(exc),
        )


@router.post("/api/ai/kanban", response_model=AIBoardResponse)
def ai_kanban(
    request: AIBoardRequest,
    current_user: str = Depends(require_auth),
) -> AIBoardResponse:
    prompt = request.prompt.strip()
    if not prompt:
        return AIBoardResponse(
            prompt=request.prompt,
            answer="",
            model=AI_MODEL,
            success=False,
            updated=False,
            error="Prompt must not be empty.",
        )

    board_dict = request.board.model_dump()

    try:
        ai_response = run_kanban_ai(board_dict, prompt)
        answer = str(ai_response.get("answer", "")).strip()
        board_update = ai_response.get("board")

        if isinstance(board_update, dict) and "columns" in board_update and "cards" in board_update:
            return AIBoardResponse(
                prompt=prompt,
                answer=answer,
                model=AI_MODEL,
                success=True,
                updated=True,
                board=board_update,
            )

        return AIBoardResponse(
            prompt=prompt,
            answer=answer,
            model=AI_MODEL,
            success=True,
            updated=False,
        )
    except Exception as exc:
        return AIBoardResponse(
            prompt=prompt,
            answer="",
            model=AI_MODEL,
            success=False,
            updated=False,
            error=safe_ai_error(exc),
        )
