"""AI job description drafting."""

from app.prompts import render_jd_draft_prompts
from app.schemas.common import JobStatus
from app.schemas.job_descriptions import (
    JobDescriptionDraftRequest,
    JobDescriptionDraftResponse,
    JobDescriptionSections,
)
from app.services.ai_generate import generate_json


class JobDescriptionsService:
    async def draft(
        self, payload: JobDescriptionDraftRequest
    ) -> JobDescriptionDraftResponse:
        system, user = render_jd_draft_prompts(
            persona=payload.persona,
            role_title=payload.role_title,
            seniority=payload.seniority or "",
            department=payload.department or "",
            employment_type=payload.employment_type.value,
            location=payload.location or "",
            must_have_skills=payload.must_have_skills,
            nice_to_have_skills=payload.nice_to_have_skills,
            responsibilities=payload.responsibilities,
            company_context=payload.company_context or "",
            tone_notes=payload.tone_notes or "",
            language=payload.language,
        )
        system += (
            "\nReturn JSON: {\"title\",\"markdown\",\"sections\":"
            "{\"summary\",\"responsibilities\":[],\"requirements\":[],"
            "\"nice_to_have\":[],\"benefits\":[]}}"
        )

        def local() -> dict:
            skills = payload.must_have_skills or ["relevant domain skills"]
            resp = payload.responsibilities or [
                f"Own delivery for the {payload.role_title} function",
                "Collaborate with cross-functional partners",
                "Improve processes and measurable outcomes",
            ]
            reqs = [f"Proven experience with {s}" for s in skills]
            summary = (
                f"We are hiring a {payload.role_title} to drive impact"
                f"{' in ' + payload.department if payload.department else ''}."
            )
            markdown = (
                f"# {payload.role_title}\n\n{summary}\n\n"
                f"## Responsibilities\n"
                + "\n".join(f"- {r}" for r in resp)
                + "\n\n## Requirements\n"
                + "\n".join(f"- {r}" for r in reqs)
            )
            return {
                "title": payload.role_title,
                "markdown": markdown,
                "sections": {
                    "summary": summary,
                    "responsibilities": resp,
                    "requirements": reqs,
                    "nice_to_have": payload.nice_to_have_skills,
                    "benefits": ["Competitive compensation", "Growth opportunities"],
                },
            }

        data, stub, provider = await generate_json(
            system=system, user=user, local_factory=local
        )
        sections_raw = data.get("sections") or {}
        sections = JobDescriptionSections(
            summary=sections_raw.get("summary"),
            responsibilities=list(sections_raw.get("responsibilities") or []),
            requirements=list(sections_raw.get("requirements") or []),
            nice_to_have=list(sections_raw.get("nice_to_have") or []),
            benefits=list(sections_raw.get("benefits") or []),
        )
        return JobDescriptionDraftResponse(
            correlation_id=payload.correlation_id,
            role_title=payload.role_title,
            persona=payload.persona,
            status=JobStatus.SUCCEEDED,
            stub=stub,
            message=f"Drafted JD via {provider}",
            prompt_preview={"system": system, "user": user},
            title=data.get("title") or payload.role_title,
            markdown=data.get("markdown"),
            sections=sections,
        )
