"""Schema tri thức chuẩn hóa cho DSCons."""

from __future__ import annotations

from typing import Any

from pydantic import BaseModel, Field


class KnowledgeMetadata(BaseModel):
    """Metadata chuẩn cho từng chunk tri thức."""

    task_type: str = Field(..., description="Miền tác vụ dùng để route agent.")
    knowledge_type: str = Field(..., description="Loại tri thức chuẩn hóa.")
    document_type: str = Field(..., description="Loại tài liệu nguồn.")
    project_name: str | None = None
    project_code: str | None = None
    package_name: str | None = None
    package_code: str | None = None
    contract_code: str | None = None
    vendor_or_client: str | None = None
    agency_name: str | None = None
    decision_no: str | None = None
    issue_date: str | None = None
    effective_date: str | None = None
    revision: str | None = None
    source_file: str | None = None
    source_page: int | None = None
    source_pages: str | None = None
    section_title: str | None = None
    legal_basis: str | None = None
    work_item_code: str | None = None
    cost_item_code: str | None = None
    payment_stage: str | None = None
    settlement_stage: str | None = None
    audit_focus: str | None = None
    schema_version: str = "1.0"
    extra_metadata: dict[str, Any] = Field(default_factory=dict)


class KnowledgeIngestItem(BaseModel):
    """Một đơn vị tri thức có metadata chuẩn."""

    text: str = Field(..., min_length=1)
    metadata: KnowledgeMetadata


class KnowledgeBatchIngestRequest(BaseModel):
    """Request nạp lô tri thức có cấu trúc."""

    chunks: list[KnowledgeIngestItem] = Field(..., min_length=1)


class KnowledgeFilter(BaseModel):
    """Bộ lọc tìm kiếm tri thức nâng cao."""

    task_type: str | None = None
    knowledge_type: str | None = None
    document_type: str | None = None
    project_code: str | None = None
    package_code: str | None = None
    contract_code: str | None = None
    payment_stage: str | None = None
    settlement_stage: str | None = None
    audit_focus: str | None = None
