from __future__ import annotations

from typing import Any, Literal

from pydantic import BaseModel, Field


class WorkflowStep(BaseModel):
    step: int
    step_id: str
    intent_id: str
    plugin_id: str
    action: str
    status: Literal["pending", "running", "completed", "failed", "skipped", "waiting_confirmation"] = "pending"
    depends_on: list[str] = Field(default_factory=list)
    slots: dict[str, Any] = Field(default_factory=dict)
    condition: dict[str, Any] = Field(default_factory=dict)
    requires_confirmation: bool = False
    timeout_ms: int = 1500


class MissingSlot(BaseModel):
    slot_name: str
    ask_template: str
    priority: int = 1


class Workflow(BaseModel):
    workflow_id: str
    workflow_type: Literal["single", "sequence", "conditional", "parallel"] = "single"
    domain: str
    intent_id: str
    status: Literal["ready", "waiting_slot", "waiting_confirmation", "running", "completed", "failed"] = "ready"
    risk_level: Literal["low", "medium", "high"] = "low"
    slots: dict[str, Any] = Field(default_factory=dict)
    missing_slots: list[MissingSlot] = Field(default_factory=list)
    steps: list[WorkflowStep] = Field(default_factory=list)
    meta: dict[str, Any] = Field(default_factory=dict)
