from fastapi import APIRouter, HTTPException, Depends
from pydantic import BaseModel
from sqlalchemy.orm import Session

from app.database import get_db
from app.api.deps import get_current_user
from app.models.user import User
from app.services.matching_service import match_candidates_for_jd, preview_match
from app.services.gemini_service import GeminiError

router = APIRouter(prefix="/api/v1")


class MatchRequest(BaseModel):
    jd_id: int
    top_k: int = 10


class PreviewRequest(BaseModel):
    jd_id: int
    resume_text: str


@router.post("/match")
async def match(
    request: MatchRequest,
    current_user: User = Depends(get_current_user),
    db: Session = Depends(get_db),
):
    try:
        results = match_candidates_for_jd(
            jd_id=request.jd_id,
            company_id=current_user.company_id,
            db=db,
            top_k=request.top_k,
        )
        return {"results": results, "total": len(results)}
    except ValueError as e:
        raise HTTPException(status_code=404, detail=str(e))
    except GeminiError as e:
        raise HTTPException(status_code=503, detail=str(e))


@router.post("/match/preview")
async def match_preview(
    request: PreviewRequest,
    current_user: User = Depends(get_current_user),
    db: Session = Depends(get_db),
):
    """저장 없이 단일 후보자 ↔ JD 매칭 점수 미리보기 (익스텐션용)"""
    try:
        result = preview_match(
            jd_id=request.jd_id,
            resume_text=request.resume_text,
            company_id=current_user.company_id,
            db=db,
        )
        return result
    except ValueError as e:
        raise HTTPException(status_code=404, detail=str(e))
    except GeminiError as e:
        raise HTTPException(status_code=503, detail=str(e))
