"""AI-assisted reference check questionnaires and reports."""

from uuid import uuid4

from app.schemas.common import JobStatus
from app.schemas.reference_checks import (
    ReferenceQuestion,
    ReferenceQuestionnaireRequest,
    ReferenceQuestionnaireResponse,
    ReferenceReportRequest,
    ReferenceReportResponse,
)
from app.services.ai_generate import generate_json


class ReferenceChecksService:
    async def questionnaire(
        self, payload: ReferenceQuestionnaireRequest
    ) -> ReferenceQuestionnaireResponse:
        system = (
            "Create referee questionnaire. Return JSON: "
            "{\"questions\":[{\"id\",\"text\",\"category\"}]}"
        )
        user = (
            f"Candidate: {payload.candidate_id}\nRole: {payload.role_title}\n"
            f"JD: {payload.job_description}\nRelationship: {payload.referee_relationship}\n"
            f"Count: {payload.count}"
        )

        def local() -> dict:
            base = [
                ("performance", f"How would you rate {payload.candidate_id}'s performance in their role?"),
                ("strengths", "What are this person's greatest professional strengths?"),
                ("growth", "Where should they focus for growth?"),
                ("collaboration", "How effectively do they collaborate with others?"),
                ("reliability", "Can you describe their reliability under deadlines?"),
                ("leadership", "Have they demonstrated ownership or leadership?"),
                ("rehire", "Would you rehire or work with them again? Why?"),
                ("role_fit", f"How well would they fit a {payload.role_title} role?"),
            ]
            qs = [
                {"id": f"rq-{i + 1}", "text": text, "category": cat}
                for i, (cat, text) in enumerate(base[: payload.count])
            ]
            return {"questions": qs}

        data, stub, provider = await generate_json(
            system=system, user=user, local_factory=local
        )
        questions = [
            ReferenceQuestion(
                id=str(q.get("id", f"rq-{i}")),
                text=str(q.get("text", "")),
                category=q.get("category"),
            )
            for i, q in enumerate(data.get("questions") or [])
            if isinstance(q, dict) and q.get("text")
        ]
        return ReferenceQuestionnaireResponse(
            correlation_id=payload.correlation_id,
            candidate_id=payload.candidate_id,
            questionnaire_id=str(uuid4()),
            status=JobStatus.SUCCEEDED,
            stub=stub,
            message=f"Reference questionnaire via {provider}",
            questions=questions,
        )

    async def report(self, payload: ReferenceReportRequest) -> ReferenceReportResponse:
        system = (
            "Consolidate referee responses. Return JSON: "
            "{\"sentiment_summary\",\"strengths\":[],\"concerns\":[],"
            "\"recommendation\",\"report_markdown\"}"
        )
        user = (
            f"Candidate: {payload.candidate_id}\nRole: {payload.role_title}\n"
            f"Responses: {payload.referee_responses}"
        )

        def local() -> dict:
            return {
                "sentiment_summary": "Overall positive with normal growth areas noted.",
                "strengths": ["Reliability", "Collaboration"],
                "concerns": ["Limited examples of senior-scope ownership"],
                "recommendation": "proceed_with_interview",
                "report_markdown": (
                    f"# Reference report — {payload.candidate_id}\n\n"
                    f"Role context: {payload.role_title}\n\n"
                    "Summary: referees reported solid performance with room to grow on ownership."
                ),
            }

        data, stub, provider = await generate_json(
            system=system, user=user, local_factory=local
        )
        return ReferenceReportResponse(
            correlation_id=payload.correlation_id,
            candidate_id=payload.candidate_id,
            report_id=str(uuid4()),
            status=JobStatus.SUCCEEDED,
            stub=stub,
            message=f"Reference report via {provider}",
            sentiment_summary=data.get("sentiment_summary"),
            strengths=list(data.get("strengths") or []),
            concerns=list(data.get("concerns") or []),
            recommendation=data.get("recommendation"),
            report_markdown=data.get("report_markdown"),
        )
