import uuid from typing import Optional from fastapi import APIRouter, Depends, HTTPException, Query from fastapi.responses import JSONResponse from pydantic import BaseModel from sqlalchemy.ext.asyncio import AsyncSession from db_setup import get_session from users.permissions import PermissionTag, require_permission from verification_check.enums import ( CompetencyEvaluation, EmploymentVerification, QualitativeEvaluation, RecordOverview, RefereeDetails, ) from verification_check.views import VerificationCheckForm router = APIRouter() class VerificationCheckCreate(BaseModel): recruiter_id:uuid.UUID candidate_id:uuid.UUID record_overview:Optional[RecordOverview] employment_verification:Optional[EmploymentVerification] competency_evaluation:Optional[CompetencyEvaluation] qualitative_evaluation:Optional[QualitativeEvaluation] referee:Optional[RefereeDetails] class VerificationCheckUpdate(BaseModel): recruiter_id:Optional[uuid.UUID]=None candidate_id:Optional[uuid.UUID]=None record_overview:Optional[RecordOverview]=None employment_verification:Optional[EmploymentVerification]=None competency_evaluation:Optional[CompetencyEvaluation]=None qualitative_evaluation:Optional[QualitativeEvaluation]=None referee:Optional[RefereeDetails]=None @router.get("/verification-check/fetch") async def fetch_verification_check( current_user:dict=Depends(require_permission(PermissionTag.CANDIDATES_VIEW)), form_id:str=Query(None), candidate_id:str=Query(None), session:AsyncSession=Depends(get_session), ): """One row by form_id, else the list (optionally one candidate's referees). Admins see every row; other roles stay scoped to created_by.""" try: service=VerificationCheckForm(session=session) data=await service.get_form_by_id(form_id,candidate_id,current_user) return JSONResponse(content={"data":data,"status_code":200}) except HTTPException: raise except Exception as e: raise HTTPException(status_code=500, detail=str(e)) @router.post("/verification-check/create") async def create_verification_check( payload: VerificationCheckCreate, current_user:dict=Depends(require_permission(PermissionTag.CANDIDATES_CREATE)), session:AsyncSession=Depends(get_session), ): try: service = VerificationCheckForm(session=session) data = await service.create_form(payload.model_dump(exclude_unset=True), current_user) return JSONResponse(content={"data": data, "status_code": 200}) except HTTPException: raise except Exception as e: raise HTTPException(status_code=500, detail=str(e)) @router.patch("/verification-check/update") async def update_verification_check( payload: VerificationCheckUpdate, current_user:dict=Depends(require_permission(PermissionTag.CANDIDATES_EDIT)), form_id:str=Query(...), session:AsyncSession=Depends(get_session), ): try: service=VerificationCheckForm(session=session) data=await service.update_form(form_id,payload.model_dump(exclude_unset=True),current_user) return JSONResponse(content={"data":data,"status_code":200}) except HTTPException: raise except Exception as e: raise HTTPException(status_code=500,detail=str(e)) @router.delete("/verification-check/delete") async def delete_verification_check( current_user:dict=Depends(require_permission(PermissionTag.CANDIDATES_DELETE)), form_id:str=Query(...), session:AsyncSession=Depends(get_session), ): try: service=VerificationCheckForm(session=session) data=await service.delete_form(form_id,current_user) return JSONResponse(content={"data":data,"status_code":200}) except HTTPException: raise except Exception as e: raise HTTPException(status_code=500,detail=str(e))