from datetime import date, datetime
from typing import Optional
from pydantic import BaseModel


class TaskCommentOut(BaseModel):
    id: int
    task_id: int
    user_id: int
    username: str
    body: str
    attachment_path: Optional[str] = None
    created_at: datetime

    class Config:
        from_attributes = True


class TaskBase(BaseModel):
    title: str
    status: str = "todo"
    due_date: Optional[date] = None
    assigned_to: Optional[int] = None
    parent_id: Optional[int] = None


class TaskCreate(TaskBase):
    pass


class TaskUpdate(BaseModel):
    title: Optional[str] = None
    status: Optional[str] = None
    due_date: Optional[date] = None
    assigned_to: Optional[int] = None


class TaskOut(BaseModel):
    id: int
    title: str
    status: str
    due_date: Optional[date]
    assigned_to: Optional[int]
    assigned_username: Optional[str]
    parent_id: Optional[int]
    created_by: int
    created_by_username: str
    completed_at: Optional[datetime]
    recurring_task_id: Optional[int] = None
    created_at: datetime
    subtask_count: int = 0
    comment_count: int = 0

    class Config:
        from_attributes = True


class TaskDetailOut(TaskOut):
    subtasks: list[TaskOut] = []
    comments: list[TaskCommentOut] = []
