from __future__ import annotations

from collections.abc import Mapping, Sequence
from typing import Any, TypeAlias

from pydantic import BaseModel, ConfigDict, Field

from graphon.nodes.human_input.entities import FormInputConfig, UserActionConfig
from models.execution_extra_content import ExecutionContentType


class HumanInputFormDefinition(BaseModel):
    model_config = ConfigDict(frozen=True)

    form_id: str
    node_id: str
    node_title: str
    form_content: str
    inputs: Sequence[FormInputConfig] = Field(default_factory=list)
    actions: Sequence[UserActionConfig] = Field(default_factory=list)
    display_in_ui: bool = False
    form_token: str | None = None
    resolved_default_values: Mapping[str, Any] = Field(default_factory=dict)
    expiration_time: int


class HumanInputFormSubmissionData(BaseModel):
    model_config = ConfigDict(frozen=True)

    node_id: str
    node_title: str
    rendered_content: str
    action_id: str
    action_text: str


class HumanInputContent(BaseModel):
    model_config = ConfigDict(frozen=True)

    workflow_run_id: str
    submitted: bool
    form_definition: HumanInputFormDefinition | None = None
    form_submission_data: HumanInputFormSubmissionData | None = None
    type: ExecutionContentType = Field(default=ExecutionContentType.HUMAN_INPUT)


# Keep a runtime alias here: callers and tests expect identity with HumanInputContent.
ExecutionExtraContentDomainModel: TypeAlias = HumanInputContent  # noqa: UP040

__all__ = [
    "ExecutionExtraContentDomainModel",
    "HumanInputContent",
    "HumanInputFormDefinition",
    "HumanInputFormSubmissionData",
]
