"""Case study simulator generate / grade."""

from uuid import uuid4

from app.schemas.case_studies import (
    CaseStudyGenerateRequest,
    CaseStudyGenerateResponse,
    CaseStudyGradeRequest,
    CaseStudyGradeResponse,
)
from app.schemas.common import JobStatus
from app.services.ai_generate import generate_json


class CaseStudiesService:
    async def generate(
        self, payload: CaseStudyGenerateRequest
    ) -> CaseStudyGenerateResponse:
        system = (
            "Create a hiring case study. Return JSON: "
            "{\"title\",\"scenario_markdown\",\"tasks\":[],\"rubric\":{}}"
        )
        user = (
            f"Role: {payload.role_title}\nIndustry: {payload.industry}\n"
            f"JD: {payload.job_description}\nDifficulty: {payload.difficulty.value}\n"
            f"Time: {payload.time_limit_minutes} minutes"
        )

        def local() -> dict:
            return {
                "title": f"{payload.role_title} decision case",
                "scenario_markdown": (
                    f"## Scenario\nYou are a {payload.role_title} at a "
                    f"{payload.industry or 'growing'} company. Leadership asks you to "
                    "diagnose a delivery risk and propose a 30-day action plan."
                ),
                "tasks": [
                    "Identify root causes",
                    "Propose prioritized actions",
                    "Define success metrics",
                    "Call out risks and trade-offs",
                ],
                "rubric": {
                    "structure": 25,
                    "insight": 25,
                    "feasibility": 25,
                    "communication": 25,
                    "passing_score": 70,
                },
            }

        data, stub, provider = await generate_json(
            system=system, user=user, local_factory=local
        )
        return CaseStudyGenerateResponse(
            correlation_id=payload.correlation_id,
            case_id=str(uuid4()),
            status=JobStatus.SUCCEEDED,
            stub=stub,
            message=f"Case study generated via {provider}",
            title=data.get("title"),
            scenario_markdown=data.get("scenario_markdown"),
            tasks=list(data.get("tasks") or []),
            rubric=data.get("rubric") or {},
        )

    async def grade(self, payload: CaseStudyGradeRequest) -> CaseStudyGradeResponse:
        system = (
            "Grade a case-study submission. Return JSON: "
            "{\"total_score\",\"max_total_score\",\"passed\",\"feedback_markdown\","
            "\"rubric_scores\":{}}"
        )
        user = (
            f"Case: {payload.case_id}\nRole: {payload.role_title}\n"
            f"Rubric: {payload.rubric}\nSubmission:\n{payload.candidate_submission}"
        )

        def local() -> dict:
            length = len(payload.candidate_submission.strip())
            score = 55.0 if length < 200 else 72.0 if length < 800 else 84.0
            return {
                "total_score": score,
                "max_total_score": 100.0,
                "passed": score >= 70.0,
                "feedback_markdown": (
                    "Solid structure. Strengthen quantified impact and risk mitigation."
                ),
                "rubric_scores": {
                    "structure": score * 0.25,
                    "insight": score * 0.25,
                    "feasibility": score * 0.25,
                    "communication": score * 0.25,
                },
            }

        data, stub, provider = await generate_json(
            system=system, user=user, local_factory=local
        )
        return CaseStudyGradeResponse(
            correlation_id=payload.correlation_id,
            case_id=payload.case_id,
            status=JobStatus.SUCCEEDED,
            stub=stub,
            message=f"Case study graded via {provider}",
            total_score=float(data.get("total_score") or 0),
            max_total_score=float(data.get("max_total_score") or 100),
            passed=data.get("passed"),
            feedback_markdown=data.get("feedback_markdown"),
            rubric_scores=data.get("rubric_scores") or {},
        )
