from __future__ import annotations

from typing import Any, Literal

from pydantic import BaseModel, Field

DEFAULT_COMMIT_MESSAGE_TEMPLATE = """{{subject}}

commit {{commit_id}} {{source}}

{{body}}

{{trailers}}"""


class TargetConfigLayoutOpts(BaseModel):
    model_config = {"extra": "forbid"}
    default_level: Literal["L0-MANDATORY", "L1-RECOMMEND", "L2-OPTIONAL"] = Field(
        default_factory=lambda: "L1-RECOMMEND"
    )


class BackportConfigPayload(BaseModel):
    project_url: str = ""
    backport_model_id: str = ""
    project_dir: str = ""
    source_branch: str = ""
    target_path: str = ""
    target_release: str = ""
    patch_dataset_dir: str = ""
    signer_name: str = ""
    signer_email: str = ""
    commit_message_template: str = DEFAULT_COMMIT_MESSAGE_TEMPLATE
    commit_message_source: str = "auto"
    linux_repo_path: str = "~/Image/linux"
    commit_sort: str = "describe"
    current_excel_path: str = ""
    current_report_path: str = ""
    current_filtered_report_path: str = ""
    target_config_layout: Literal["none", "anolis"] = "none"
    target_config_layout_opts: TargetConfigLayoutOpts = Field(
        default_factory=TargetConfigLayoutOpts
    )
    enable_conflict_summary: bool = False
    cvekit_options: dict[str, Any] = Field(default_factory=dict)


class BackportConfigUpdateResponse(BaseModel):
    ok: bool
    config_path: str = ""


class BackportRuntimeStatusResponse(BaseModel):
    ok: bool
    model_configured: bool = False
    model_name: str = ""
    model_provider: str = ""
    api_key_available: bool = False
    cvekit_available: bool = False
    cvekit_path: str = ""
    errors: list[str] = Field(default_factory=list)


class BackportRunRequest(BaseModel):
    action: str
    payload: dict[str, Any] = Field(default_factory=dict)


class BackportAsyncRunResponse(BaseModel):
    run_id: str
    action: str
    status: str
    result: dict[str, Any] | None = None
    error: str = ""
    progress: dict[str, Any] | None = None
    pause_requested: bool = False
    paused_at: float | None = None


class BackportToolSnapshotResponse(BaseModel):
    tool_name: str
    arguments_text: str
    response_text: str
    is_error: bool


class BackportRunResponse(BaseModel):
    agentId: str
    agentName: str
    sessionId: str
    assistantText: str
    parsedResult: dict[str, Any] | None = None
    toolSnapshots: list[BackportToolSnapshotResponse] = Field(default_factory=list)