"""Pydantic-схемы API M1."""

from datetime import datetime
from typing import Any

from pydantic import BaseModel, ConfigDict, Field

# --- Task ---


class TagOut(BaseModel):
    model_config = ConfigDict(from_attributes=True)

    id: int
    name: str


class ProjectOut(BaseModel):
    model_config = ConfigDict(from_attributes=True)

    id: int
    name: str
    relevance_status: str
    priority: int | None
    note: str


class TaskCreate(BaseModel):
    title: str = Field(min_length=1, max_length=500)
    description: str = ""
    parent_task_id: int | None = None  # подзадача (M3)


class TaskUpdate(BaseModel):
    """Частичное обновление метаданных задачи (ручная детализация)."""

    title: str | None = Field(None, max_length=500)
    description: str | None = None
    project_id: int | None = None
    parent_task_id: int | None = None
    tag_ids: list[int] | None = None
    priority: int | None = None
    status: str | None = None


class TaskOut(BaseModel):
    model_config = ConfigDict(from_attributes=True)

    id: int
    title: str
    description: str
    task_type: str
    status: str
    detail_state: str
    parent_task_id: int | None
    project: ProjectOut | None
    priority: int | None
    tags: list[TagOut]
    ai_proposal: dict[str, Any] | None
    created_at: datetime
    approved_at: datetime | None
    done_at: datetime | None


class ApproveIn(BaseModel):
    """Утверждение детализации; apply_proposal=True — принять предложение LLM."""

    apply_proposal: bool = False


# --- Project / Tag ---


class AttachmentOut(BaseModel):
    """Вложение задачи (изображение)."""

    model_config = ConfigDict(from_attributes=True)

    id: int
    task_id: int
    filename: str
    original_name: str
    mime: str
    size: int
    created_at: datetime


class ProjectCreate(BaseModel):
    name: str = Field(min_length=1, max_length=200)
    priority: int | None = None
    note: str = ""


class ProjectUpdate(BaseModel):
    name: str | None = Field(None, max_length=200)
    relevance_status: str | None = None
    priority: int | None = None
    note: str | None = None


class TagCreate(BaseModel):
    name: str = Field(min_length=1, max_length=100)
