"""
Pydantic schemas for Task model.

Request and response schemas for hierarchical task tracking.
"""

from datetime import datetime
from typing import Optional
from uuid import UUID

from pydantic import BaseModel, Field


class TaskBase(BaseModel):
    """Base schema with shared Task fields."""

    parent_task_id: Optional[str] = Field(None, description="Reference to parent task for hierarchical structure (UUID)")
    task_order: int = Field(..., description="Order of this task relative to siblings")
    title: str = Field(..., description="Task title", max_length=500)
    description: Optional[str] = Field(None, description="Detailed task description")
    task_type: Optional[str] = Field(
        None,
        description="Type: implementation, research, review, deployment, testing, documentation, bugfix, analysis"
    )
    status: str = Field(
        ...,
        description="Status: pending, in_progress, blocked, completed, cancelled"
    )
    blocking_reason: Optional[str] = Field(None, description="Reason why task is blocked (if status='blocked')")
    session_id: Optional[str] = Field(None, description="Foreign key to sessions table (UUID)")
    client_id: Optional[str] = Field(None, description="Foreign key to clients table (UUID)")
    project_id: Optional[str] = Field(None, description="Foreign key to projects table (UUID)")
    assigned_agent: Optional[str] = Field(None, description="Which agent is handling this task", max_length=100)
    estimated_complexity: Optional[str] = Field(
        None,
        description="Complexity: trivial, simple, moderate, complex, very_complex"
    )
    started_at: Optional[datetime] = Field(None, description="When the task was started")
    completed_at: Optional[datetime] = Field(None, description="When the task was completed")
    task_context: Optional[str] = Field(None, description="Detailed context for this task (JSON)")
    dependencies: Optional[str] = Field(None, description="JSON array of dependency task IDs")


class TaskCreate(TaskBase):
    """Schema for creating a new Task."""
    pass


class TaskUpdate(BaseModel):
    """Schema for updating an existing Task. All fields are optional."""

    parent_task_id: Optional[str] = Field(None, description="Reference to parent task for hierarchical structure (UUID)")
    task_order: Optional[int] = Field(None, description="Order of this task relative to siblings")
    title: Optional[str] = Field(None, description="Task title", max_length=500)
    description: Optional[str] = Field(None, description="Detailed task description")
    task_type: Optional[str] = Field(
        None,
        description="Type: implementation, research, review, deployment, testing, documentation, bugfix, analysis"
    )
    status: Optional[str] = Field(
        None,
        description="Status: pending, in_progress, blocked, completed, cancelled"
    )
    blocking_reason: Optional[str] = Field(None, description="Reason why task is blocked (if status='blocked')")
    session_id: Optional[str] = Field(None, description="Foreign key to sessions table (UUID)")
    client_id: Optional[str] = Field(None, description="Foreign key to clients table (UUID)")
    project_id: Optional[str] = Field(None, description="Foreign key to projects table (UUID)")
    assigned_agent: Optional[str] = Field(None, description="Which agent is handling this task", max_length=100)
    estimated_complexity: Optional[str] = Field(
        None,
        description="Complexity: trivial, simple, moderate, complex, very_complex"
    )
    started_at: Optional[datetime] = Field(None, description="When the task was started")
    completed_at: Optional[datetime] = Field(None, description="When the task was completed")
    task_context: Optional[str] = Field(None, description="Detailed context for this task (JSON)")
    dependencies: Optional[str] = Field(None, description="JSON array of dependency task IDs")


class TaskResponse(TaskBase):
    """Schema for Task responses with ID and timestamps."""

    id: UUID = Field(..., description="Unique identifier for the task")
    created_at: datetime = Field(..., description="Timestamp when the task was created")
    updated_at: datetime = Field(..., description="Timestamp when the task was last updated")

    model_config = {"from_attributes": True}
