from __future__ import annotations from datetime import datetime from typing import ClassVar, Literal from uuid import UUID from pydantic import BaseModel, ConfigDict, Field from schemas.todo import TodoOrder class TodoCreate(BaseModel): model_config: ClassVar[ConfigDict] = ConfigDict(extra="forbid") title: str = Field(..., min_length=1, max_length=255) description: str | None = Field(None, max_length=1000) priority: int = Field(1, ge=1, le=4) order: TodoOrder | None = None schedule_item_ids: list[UUID] = Field(default_factory=list) class TodoUpdate(BaseModel): model_config: ClassVar[ConfigDict] = ConfigDict(extra="forbid") title: str | None = Field(None, min_length=1, max_length=255) description: str | None = Field(None, max_length=1000) priority: int | None = Field(None, ge=1, le=4) order: TodoOrder | None = None status: Literal["pending", "done", "canceled"] | None = None schedule_item_ids: list[UUID] | None = None class ScheduleItemBasic(BaseModel): model_config: ClassVar[ConfigDict] = ConfigDict(from_attributes=True) id: UUID title: str start_at: datetime end_at: datetime | None class TodoResponse(BaseModel): model_config: ClassVar[ConfigDict] = ConfigDict(from_attributes=True) id: UUID owner_id: UUID title: str description: str | None priority: int order: TodoOrder status: str completed_at: datetime | None created_at: datetime updated_at: datetime schedule_items: list[ScheduleItemBasic] = Field(default_factory=list) class TodoReorderItem(BaseModel): model_config: ClassVar[ConfigDict] = ConfigDict(extra="forbid") id: UUID priority: int = Field(..., ge=1, le=4) order: TodoOrder class TodoReorderRequest(BaseModel): model_config: ClassVar[ConfigDict] = ConfigDict(extra="forbid") items: list[TodoReorderItem] = Field(..., min_length=1) class TodoComplete(BaseModel): model_config: ClassVar[ConfigDict] = ConfigDict(extra="forbid") pass