"""Resume vs JD screening match."""

from app.schemas.common import JobStatus
from app.schemas.resume_match import ResumeMatchRequest, ResumeMatchResponse
from app.services.ai_generate import generate_json


class ResumeMatchService:
    async def score(self, payload: ResumeMatchRequest) -> ResumeMatchResponse:
        system = (
            "Score resume vs job description. Return JSON: "
            "{\"match_score\":0-1,\"matched_skills\":[],\"missing_skills\":[],\"summary\"}"
        )
        user = (
            f"Role: {payload.role_title}\nJD:\n{payload.job_description}\n"
            f"Resume: {payload.resume_text or payload.resume_structured}\n"
            f"Required skills: {payload.required_skills}"
        )

        def local() -> dict:
            text = (payload.resume_text or str(payload.resume_structured)).lower()
            required = payload.required_skills or []
            if not required:
                # derive crude skill tokens from JD
                required = [
                    w for w in ["python", "fastapi", "sql", "aws", "react", "java"]
                    if w in payload.job_description.lower()
                ] or ["communication"]
            matched = [s for s in required if s.lower() in text]
            missing = [s for s in required if s not in matched]
            score = (len(matched) / len(required)) if required else 0.5
            return {
                "match_score": round(score, 2),
                "matched_skills": matched,
                "missing_skills": missing,
                "summary": (
                    f"Resume match {round(score * 100)}% for {payload.role_title}."
                ),
            }

        data, stub, provider = await generate_json(
            system=system, user=user, local_factory=local
        )
        score = float(data.get("match_score") or 0)
        return ResumeMatchResponse(
            correlation_id=payload.correlation_id,
            candidate_id=payload.candidate_id,
            role_title=payload.role_title,
            status=JobStatus.SUCCEEDED,
            stub=stub,
            message=f"Resume match via {provider}",
            match_score=score,
            screen_passed=score >= 0.6,
            matched_skills=list(data.get("matched_skills") or []),
            missing_skills=list(data.get("missing_skills") or []),
            summary=data.get("summary"),
        )
