"""Structured payloads for clarification_required and user_input_required."""
from __future__ import annotations
from typing import Any, Literal, Optional

from pydantic import BaseModel, Field


class ClarificationOption(BaseModel):
    id: str
    label: str
    description: Optional[str] = None


class ClarificationQuestion(BaseModel):
    id: str
    prompt: str
    type: Literal["single_select", "multi_select", "free_text"]
    options: list[ClarificationOption] = Field(default_factory=list)
    allow_other: bool = False
    required: bool = False
    default_option_id: Optional[str] = None


class ClarificationRequestV1(BaseModel):
    version: Literal[1] = 1
    thinking_summary: str = ""
    questions: list[ClarificationQuestion] = Field(default_factory=list)


class InterruptionEnvelope(BaseModel):
    """Normalized row + codegen_runs.interruption_payload."""

    kind: Literal["clarification_required", "user_input_required"]
    version: int = 1
    thinking_summary: Optional[str] = None
    questions: Optional[list[ClarificationQuestion]] = None
    # user_input_required: manifest items live here
    manifest: Optional[dict[str, Any]] = None

    def to_storage_dict(self) -> dict:
        d = self.model_dump(mode="json", exclude_none=True)
        return d


def parse_clarification_json(raw: dict) -> Optional[ClarificationRequestV1]:
    try:
        return ClarificationRequestV1.model_validate(raw)
    except Exception:
        return None


def clarification_to_interruption(req: ClarificationRequestV1) -> InterruptionEnvelope:
    return InterruptionEnvelope(
        kind="clarification_required",
        version=1,
        thinking_summary=req.thinking_summary,
        questions=req.questions,
    )


def manifest_to_interruption(manifest: dict) -> InterruptionEnvelope:
    return InterruptionEnvelope(
        kind="user_input_required",
        version=1,
        thinking_summary="Configuration values are required to continue.",
        manifest=manifest,
    )
