"""Timed puzzle challenges — SOW Assessment Types."""

from uuid import uuid4

from app.schemas.common import JobStatus
from app.schemas.puzzles import (
    PuzzleGenerateRequest,
    PuzzleGenerateResponse,
    PuzzleGradeRequest,
    PuzzleGradeResponse,
)
from app.schemas.questions import QuestionType
from app.services.ai_generate import generate_json
from app.services.questions import _local_questions, _parse_questions


class PuzzlesService:
    async def generate(self, payload: PuzzleGenerateRequest) -> PuzzleGenerateResponse:
        system = (
            "Generate timed puzzle / brain-teaser challenges. Return JSON: "
            "{\"puzzles\":[{\"stem\",\"answer\",\"explanation\",\"options\":[]}]}"
        )
        user = (
            f"Type: {payload.puzzle_type}\nRole: {payload.role_title}\n"
            f"Difficulty: {payload.difficulty.value}\nCount: {payload.count}\n"
            f"Time limit minutes: {payload.time_limit_minutes}"
        )

        def local() -> dict:
            return {
                "puzzles": _local_questions(
                    count=payload.count,
                    qtype=QuestionType.MCQ,
                    difficulty=payload.difficulty,
                    topic=f"puzzle / {payload.puzzle_type}",
                )
            }

        data, stub, provider = await generate_json(
            system=system, user=user, local_factory=local
        )
        puzzles = _parse_questions(
            data.get("puzzles") or data.get("questions") or [],
            QuestionType.MCQ,
            payload.difficulty,
        )
        return PuzzleGenerateResponse(
            correlation_id=payload.correlation_id,
            puzzle_set_id=str(uuid4()),
            puzzle_type=payload.puzzle_type,
            time_limit_minutes=payload.time_limit_minutes,
            status=JobStatus.SUCCEEDED,
            stub=stub,
            message=f"Puzzles via {provider}",
            puzzles=puzzles,
        )

    async def grade(self, payload: PuzzleGradeRequest) -> PuzzleGradeResponse:
        system = (
            "Grade puzzle answers. Return JSON: "
            "{\"total_score\",\"max_total_score\",\"passed\",\"feedback_markdown\","
            "\"item_results\":[]}"
        )
        user = (
            f"set={payload.puzzle_set_id}\nanswers={payload.answers}\n"
            f"time={payload.time_taken_seconds}"
        )

        def local() -> dict:
            n = len(payload.answers)
            max_total = float(n)
            total = round(max_total * 0.75, 2)
            return {
                "total_score": total,
                "max_total_score": max_total,
                "passed": total >= max_total * 0.6,
                "feedback_markdown": "Strong pattern recognition. Practice timed spatial sets.",
                "item_results": [{"index": i, "score": 0.75} for i in range(n)],
            }

        data, stub, provider = await generate_json(
            system=system, user=user, local_factory=local
        )
        return PuzzleGradeResponse(
            correlation_id=payload.correlation_id,
            puzzle_set_id=payload.puzzle_set_id,
            status=JobStatus.SUCCEEDED,
            stub=stub,
            message=f"Puzzles graded via {provider}",
            total_score=float(data.get("total_score") or 0),
            max_total_score=float(data.get("max_total_score") or 0),
            passed=data.get("passed"),
            feedback_markdown=data.get("feedback_markdown"),
            item_results=list(data.get("item_results") or []),
        )
