"""Knowledge ingestion and retrieval schemas."""

from __future__ import annotations

from typing import Any

from pydantic import BaseModel, Field

from app.models.health_agent_schemas import RetrievalFilterSet
from app.models.schema_constants import SUPPORTED_TASK_TYPES


class KnowledgeChunkPayload(BaseModel):
    """Single knowledge chunk for ingestion."""

    text: str = Field(..., min_length=1)
    metadata: dict[str, Any] = Field(default_factory=dict)


class KnowledgeIngestRequest(BaseModel):
    """Knowledge ingestion request."""

    task_type: str = Field(
        ..., description=f"One of: {', '.join(SUPPORTED_TASK_TYPES)}"
    )
    chunks: list[KnowledgeChunkPayload] = Field(..., min_length=1)
    default_metadata: dict[str, Any] = Field(default_factory=dict)


class KnowledgeIngestResponse(BaseModel):
    """Knowledge ingestion response."""

    status: str
    ingested_count: int


class ReviewMemoryIngestRequest(BaseModel):
    """Request payload for converting a dossier review session into RAG memory chunks."""

    review_id: str = Field(..., min_length=1)
    task_type: str | None = Field(
        default=None, description="Tùy chọn override task_type khi ingest."
    )
    default_metadata: dict[str, Any] = Field(default_factory=dict)


class ProjectMemoryEventPayload(BaseModel):
    """Single operational event to be converted into project memory chunks."""

    event_type: str = Field(..., min_length=1)
    title: str | None = None
    summary: str = Field(..., min_length=1)
    details: str | None = None
    outcome: str | None = None
    next_action: str | None = None
    project_code: str = Field(..., min_length=1)
    agent_scope: str | None = None
    document_type: str | None = None
    source_table: str | None = None
    event_id: str | None = None
    metadata: dict[str, Any] = Field(default_factory=dict)


class ProjectMemoryIngestRequest(BaseModel):
    """Request payload for converting project operational events into RAG knowledge chunks."""

    task_type: str
    events: list[ProjectMemoryEventPayload] = Field(..., min_length=1)
    default_metadata: dict[str, Any] = Field(default_factory=dict)


class MemoryIngestResponse(BaseModel):
    """Response payload for review/project memory ingestion endpoints."""

    status: str
    ingested_count: int
    chunk_count: int


class KnowledgeSearchRequest(BaseModel):
    """Knowledge search request."""

    task_type: str = Field(
        ..., description=f"One of: {', '.join(SUPPORTED_TASK_TYPES)}"
    )
    query: str = Field(..., min_length=1)
    top_k: int = Field(default=3, ge=1, le=20)
    filters: RetrievalFilterSet | None = Field(
        default=None, description="Optional metadata retrieval filters."
    )


class KnowledgeSearchResult(BaseModel):
    """Single search hit."""

    id: str
    text: str
    score: float
    metadata: dict[str, Any] = Field(default_factory=dict)


class KnowledgeSearchResponse(BaseModel):
    """Knowledge search response."""

    results: list[KnowledgeSearchResult]
