from datetime import datetime
from typing import Any

from pydantic import BaseModel, Field


class MetadataFieldCreate(BaseModel):
    field_name: str = Field(..., description="Field display name")
    field_key: str = Field(..., description="Field key for storage")
    field_type: str = Field(
        ..., description="Field type: text, textarea, number, date, select, multiselect"
    )
    field_options: list[str] | None = Field(
        None, description="Options for select/multiselect types"
    )
    default_value: str | None = Field(None, description="Default value")
    is_required: bool = Field(False, description="Whether field is required")
    description: str | None = Field(None, description="Field description")


class MetadataFieldUpdate(BaseModel):
    field_name: str | None = Field(None, description="Field display name")
    field_type: str | None = Field(None, description="Field type")
    field_options: list[str] | None = Field(
        None, description="Options for select/multiselect types"
    )
    default_value: str | None = Field(None, description="Default value")
    is_required: bool | None = Field(None, description="Whether field is required")
    description: str | None = Field(None, description="Field description")
    sort_order: int | None = Field(None, description="Sort order")


class MetadataFieldResponse(BaseModel):
    id: int
    knowledge_base_id: int
    field_name: str
    field_key: str
    field_type: str
    field_options: list[str] | None
    default_value: str | None
    is_required: bool
    sort_order: int
    description: str | None
    created_at: datetime | None
    updated_at: datetime | None
    is_system: bool = Field(False, description="Whether this is a system field")

    class Config:
        from_attributes = True


class FieldReorder(BaseModel):
    field_id: int
    sort_order: int


class DocumentMetadataValueResponse(BaseModel):
    field_id: int
    field_name: str
    field_key: str
    field_type: str
    field_options: list[str] | None
    value: str | None
    is_system: bool = Field(False, description="Whether this is a system field")
    is_readonly: bool = Field(False, description="Whether this field is read-only")
    is_system: bool = Field(False, description="Whether this is a system field")
    is_readonly: bool = Field(False, description="Whether this field is read-only")


class DocumentMetadataResponse(BaseModel):
    document_id: int
    metadata: list[DocumentMetadataValueResponse]


class DocumentMetadataUpdate(BaseModel):
    metadata: dict[str, Any] = Field(..., description="Metadata values keyed by field_key")
