"""Health, agent runtime, and shared lightweight request schemas."""

from __future__ import annotations

from pydantic import BaseModel, Field

from app.models.schema_constants import SUPPORTED_TASK_TYPES


class HealthResponse(BaseModel):
    """Health check response payload."""

    status: str = "ok"
    service: str = "dscons"


class RetrievalFilterSet(BaseModel):
    """Optional metadata filters for scoped retrieval."""

    knowledge_type: str | None = None
    document_type: str | None = None
    project_code: str | None = None
    agent_scope: str | None = None
    agent_code: str | None = None
    source_table: str | None = None
    review_id: str | None = None
    finding_id: str | None = None
    assignment_id: str | None = None


class RouteTaskRequest(BaseModel):
    """Request payload for task routing."""

    task_type: str = Field(
        ..., description=f"One of: {', '.join(SUPPORTED_TASK_TYPES)}"
    )
    query: str = Field(
        ..., min_length=1, description="User question or task description."
    )
    top_k: int = Field(
        default=3, ge=1, le=20, description="Number of knowledge chunks to retrieve."
    )
    agent_code: str | None = Field(
        default=None, description="Optional AI employee persona code."
    )
    filters: RetrievalFilterSet | None = Field(
        default=None, description="Optional metadata retrieval filters."
    )


class RouteTaskResponse(BaseModel):
    """Response payload for routed task execution."""

    selected_agent: str
    answer: str
    retrieved_chunks_count: int
    task_type: str
    agent_code: str


class AgentRunRequest(BaseModel):
    """Explicit request payload for direct agent execution endpoints."""

    query: str = Field(
        ..., min_length=1, description="User question or task description."
    )
    top_k: int = Field(
        default=3, ge=1, le=20, description="Number of knowledge chunks to retrieve."
    )
    agent_code: str | None = Field(
        default=None, description="Optional AI employee persona code."
    )
    filters: RetrievalFilterSet | None = Field(
        default=None, description="Optional metadata retrieval filters."
    )


class AgentRunResponse(BaseModel):
    """Explicit response payload for direct agent execution endpoints."""

    selected_agent: str
    task_type: str
    answer: str
    retrieved_chunks_count: int
    agent_code: str
