from __future__ import annotations

from fastapi import APIRouter, HTTPException
from fastapi.responses import JSONResponse

from app.models.repo_resolution import RepoClarificationRequired
from app.models.search import SearchRequest, SearchResponse
from app.retrieval.retrieval_client import RetrievalClientError
from app.services.search_service import SearchService

router = APIRouter(prefix="/search", tags=["Search"])

_search_service = SearchService()


@router.post("/", response_model=None)
async def search(body: SearchRequest) -> SearchResponse | JSONResponse:
    try:
        return await _search_service.search(body)
    except RepoClarificationRequired as exc:
        return JSONResponse(
            status_code=409,
            content=exc.clarification.model_dump(mode="json"),
        )
    except ValueError as exc:
        message = str(exc)
        if "question must be non-empty" in message:
            raise HTTPException(status_code=422, detail=message) from exc
        if "invalid intent_override" in message:
            raise HTTPException(status_code=422, detail=message) from exc
        raise HTTPException(status_code=400, detail=message) from exc
    except LookupError as exc:
        raise HTTPException(status_code=404, detail=str(exc)) from exc
    except RetrievalClientError as exc:
        raise HTTPException(
            status_code=503 if exc.status_code is None else exc.status_code,
            detail=str(exc),
        ) from exc
