"""
任務 / 專案的 API schema。

跟 user.py 一樣:
  - Public 系列:對外回傳格式(永遠不含內部欄位)
  - Create / Update 系列:接收前端送來的請求 body
"""

from datetime import date, datetime
from typing import Literal
from uuid import UUID

from pydantic import BaseModel, ConfigDict, Field


# 允許的狀態 / 優先順序集合,集中在這裡,前後端引用同一份
TaskStatus = Literal["todo", "in_progress", "review", "done", "cancelled"]
TaskPriority = Literal["low", "medium", "high", "urgent"]
ProjectStatus = Literal["active", "archived"]


# =============================================================================
# Project
# =============================================================================
class ProjectCreateRequest(BaseModel):
    name: str = Field(..., min_length=1, max_length=200)
    description: str | None = Field(default=None, max_length=2000)
    color: str = Field(default="#1F4E79", pattern=r"^#[0-9A-Fa-f]{6}$")


class ProjectUpdateRequest(BaseModel):
    name: str | None = Field(default=None, min_length=1, max_length=200)
    description: str | None = Field(default=None, max_length=2000)
    color: str | None = Field(default=None, pattern=r"^#[0-9A-Fa-f]{6}$")
    status: ProjectStatus | None = None


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

    id: UUID
    name: str
    description: str | None
    color: str
    owner_id: UUID
    status: str
    created_at: datetime


# =============================================================================
# Task
# =============================================================================
class TaskCreateRequest(BaseModel):
    """建立新任務。

    所有欄位除 title 都可省略,庫柏未來會幫忙自動補(例如優先順序、due_date)。
    """

    title: str = Field(..., min_length=1, max_length=500)
    description: str | None = Field(default=None, max_length=10000)
    project_id: UUID | None = None
    status: TaskStatus = "todo"
    priority: TaskPriority = "medium"
    due_date: date | None = None
    assignee_id: UUID | None = None


class TaskUpdateRequest(BaseModel):
    """更新任務。所有欄位都可選,只更新有傳的欄位。"""

    title: str | None = Field(default=None, min_length=1, max_length=500)
    description: str | None = Field(default=None, max_length=10000)
    project_id: UUID | None = None
    status: TaskStatus | None = None
    priority: TaskPriority | None = None
    due_date: date | None = None
    assignee_id: UUID | None = None
    order_index: int | None = None


class _UserMini(BaseModel):
    """簡化的使用者資料,用在任務的 assignee/creator 欄位裡內嵌,
    避免前端為了顯示「指派給誰」要再多一次 API 請求。"""

    model_config = ConfigDict(from_attributes=True)

    id: UUID
    display_name: str
    avatar_url: str | None = None


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

    id: UUID
    project_id: UUID | None
    title: str
    description: str | None
    status: str
    priority: str
    due_date: date | None
    order_index: int
    completed_at: datetime | None
    created_at: datetime
    updated_at: datetime

    # raw FK(讓前端做 stats / filter 用 — 階段 9-H 修)
    assignee_id: UUID | None = None
    created_by: UUID | None = None

    # 內嵌指派 / 建立者資訊(讓前端不用再查 users)
    assignee: _UserMini | None = None
    creator: _UserMini | None = None
