"""Skill-gap analysis service."""

from app.schemas.common import JobStatus
from app.schemas.skill_gap import (
    SkillGapAnalyzeRequest,
    SkillGapAnalyzeResponse,
    SkillGapItem,
)
from app.services.ai_generate import generate_json


class SkillGapService:
    async def analyze(self, payload: SkillGapAnalyzeRequest) -> SkillGapAnalyzeResponse:
        system = (
            "Analyze skill gaps vs a job description. Return JSON: "
            "{\"overall_readiness\":0-1,\"strengths\":[],\"recommended_prep_focus\":[],"
            "\"gaps\":[{\"skill\",\"required_level\",\"demonstrated_level\",\"gap\","
            "\"priority\",\"learning_suggestions\":[],\"evidence\"}]}"
        )
        user = (
            f"Role: {payload.role_title}\nJD:\n{payload.job_description}\n"
            f"Required: {payload.required_skills}\nDemonstrated: {payload.demonstrated_skills}\n"
            f"Resume: {payload.resume_text or payload.resume_structured}\n"
            f"Answers: {payload.interview_answers}"
        )

        def local() -> dict:
            skills = payload.required_skills or ["role fundamentals", "communication"]
            demonstrated = set(s.lower() for s in payload.demonstrated_skills)
            gaps = []
            strengths = []
            for s in skills:
                if s.lower() in demonstrated:
                    strengths.append(s)
                else:
                    gaps.append(
                        {
                            "skill": s,
                            "required_level": 0.8,
                            "demonstrated_level": 0.4,
                            "gap": 0.4,
                            "priority": "high",
                            "learning_suggestions": [f"Practice {s} with role-based exercises"],
                            "evidence": "Not clearly demonstrated in provided materials",
                        }
                    )
            return {
                "overall_readiness": 0.55 if gaps else 0.8,
                "strengths": strengths or ["baseline communication"],
                "recommended_prep_focus": [g["skill"] for g in gaps[:3]],
                "gaps": gaps,
            }

        data, stub, provider = await generate_json(
            system=system, user=user, local_factory=local
        )
        gaps = [
            SkillGapItem(
                skill=str(g.get("skill", "")),
                required_level=g.get("required_level"),
                demonstrated_level=g.get("demonstrated_level"),
                gap=g.get("gap"),
                priority=str(g.get("priority", "medium")),
                learning_suggestions=list(g.get("learning_suggestions") or []),
                evidence=g.get("evidence"),
            )
            for g in (data.get("gaps") or [])
            if isinstance(g, dict)
        ]
        return SkillGapAnalyzeResponse(
            correlation_id=payload.correlation_id,
            candidate_id=payload.candidate_id,
            role_title=payload.role_title,
            status=JobStatus.SUCCEEDED,
            stub=stub,
            message=f"Skill-gap analysis via {provider}",
            overall_readiness=data.get("overall_readiness"),
            gaps=gaps,
            strengths=list(data.get("strengths") or []),
            recommended_prep_focus=list(data.get("recommended_prep_focus") or []),
        )
