"""AI job matching / recommendations."""

from app.schemas.common import JobStatus
from app.schemas.job_matching import JobMatchItem, JobMatchingRequest, JobMatchingResponse
from app.services.ai_generate import generate_json


class JobMatchingService:
    async def recommend(self, payload: JobMatchingRequest) -> JobMatchingResponse:
        system = (
            "Rank jobs for a candidate. Return JSON: {\"recommendations\":"
            "[{\"job_id\",\"title\",\"match_score\",\"reasons\":[],\"skill_overlap\":[],\"gaps\":[]}]}"
        )
        user = (
            f"Candidate: {payload.candidate_id}\nSkills: {payload.skills}\n"
            f"Experience years: {payload.experience_years}\nInterests: {payload.interests}\n"
            f"Goals: {payload.career_goals}\nResume: {payload.resume_text or payload.resume_structured}\n"
            f"Catalog: {payload.job_catalog[:50]}\nLimit: {payload.limit}"
        )

        def local() -> dict:
            recs = []
            for i, job in enumerate(payload.job_catalog[: payload.limit]):
                if not isinstance(job, dict):
                    continue
                job_id = str(job.get("job_id") or job.get("id") or f"job-{i + 1}")
                title = job.get("title")
                job_skills = [str(s) for s in (job.get("skills") or [])]
                overlap = [s for s in payload.skills if s in job_skills] or payload.skills[:2]
                score = min(0.95, 0.55 + 0.08 * len(overlap))
                recs.append(
                    {
                        "job_id": job_id,
                        "title": title,
                        "match_score": round(score, 2),
                        "reasons": [
                            "Skill overlap with candidate profile",
                            "Aligned with stated interests/goals"
                            if payload.interests or payload.career_goals
                            else "Role title proximity",
                        ],
                        "skill_overlap": overlap,
                        "gaps": [s for s in job_skills if s not in payload.skills][:5],
                    }
                )
            if not recs:
                recs = [
                    {
                        "job_id": "placeholder-1",
                        "title": "Suggested role match",
                        "match_score": 0.6,
                        "reasons": ["Insufficient catalog — return baseline suggestion"],
                        "skill_overlap": payload.skills[:3],
                        "gaps": [],
                    }
                ]
            return {"recommendations": recs}

        data, stub, provider = await generate_json(
            system=system, user=user, local_factory=local
        )
        recommendations = [
            JobMatchItem(
                job_id=str(r.get("job_id", "")),
                title=r.get("title"),
                match_score=r.get("match_score"),
                reasons=list(r.get("reasons") or []),
                skill_overlap=list(r.get("skill_overlap") or []),
                gaps=list(r.get("gaps") or []),
            )
            for r in (data.get("recommendations") or [])
            if isinstance(r, dict) and r.get("job_id")
        ]
        return JobMatchingResponse(
            correlation_id=payload.correlation_id,
            candidate_id=payload.candidate_id,
            status=JobStatus.SUCCEEDED,
            stub=stub,
            message=f"Job matching via {provider}",
            recommendations=recommendations,
        )
