"""Badge recommendations from performance signals."""

from app.schemas.badges import BadgeItem, BadgeRecommendRequest, BadgeRecommendResponse
from app.schemas.common import JobStatus
from app.services.ai_generate import generate_json


class BadgesService:
    async def recommend(self, payload: BadgeRecommendRequest) -> BadgeRecommendResponse:
        system = (
            "Recommend badges from performance. Return JSON: "
            "{\"earned\":[{\"badge_id\",\"name\",\"level\",\"reason\"}],"
            "\"next_badges\":[...]}"
        )
        user = (
            f"Candidate: {payload.candidate_id}\nTracks: {payload.track_results}\n"
            f"Assessments: {payload.assessment_results}\nInterviews: {payload.interview_scores}"
        )

        def local() -> dict:
            earned = []
            if payload.track_results:
                earned.append(
                    {
                        "badge_id": "track-starter",
                        "name": "Track Starter",
                        "level": "beginner",
                        "reason": "Completed at least one interview track attempt",
                    }
                )
            scores = [
                float(x.get("score"))
                for x in payload.interview_scores
                if isinstance(x, dict) and isinstance(x.get("score"), (int, float))
            ]
            if scores and max(scores) >= 0.8:
                earned.append(
                    {
                        "badge_id": "strong-interviewee",
                        "name": "Strong Interviewee",
                        "level": "advanced",
                        "reason": "Interview score >= 0.8",
                    }
                )
            next_badges = [
                {
                    "badge_id": "assessment-ace",
                    "name": "Assessment Ace",
                    "level": "intermediate",
                    "reason": "Pass 3 assessments above 70%",
                }
            ]
            if not earned:
                earned.append(
                    {
                        "badge_id": "getting-started",
                        "name": "Getting Started",
                        "level": "beginner",
                        "reason": "Profile activity detected",
                    }
                )
            return {"earned": earned, "next_badges": next_badges}

        data, stub, provider = await generate_json(
            system=system, user=user, local_factory=local
        )

        def parse(items: list) -> list[BadgeItem]:
            out = []
            for i, b in enumerate(items or []):
                if not isinstance(b, dict):
                    continue
                out.append(
                    BadgeItem(
                        badge_id=str(b.get("badge_id", f"badge-{i}")),
                        name=str(b.get("name", "Badge")),
                        level=b.get("level"),
                        reason=b.get("reason"),
                    )
                )
            return out

        return BadgeRecommendResponse(
            correlation_id=payload.correlation_id,
            candidate_id=payload.candidate_id,
            status=JobStatus.SUCCEEDED,
            stub=stub,
            message=f"Badge recommendations via {provider}",
            earned=parse(data.get("earned") or []),
            next_badges=parse(data.get("next_badges") or []),
        )
