from pydantic import BaseModel
from uuid import UUID
from typing import Optional
from datetime import date


class TicketCreateRequestSchema(BaseModel):
    project_id: UUID
    title: str
    description: Optional[str] = None
    type: str  # BUG, FEATURE, TASK, STORY
    status: Optional[str] = "BACKLOG"  # BACKLOG, TODO, IN_PROGRESS, IN_REVIEW, DONE
    priority: Optional[str] = "MEDIUM"  # CRITICAL, HIGH, MEDIUM, LOW
    story_points: Optional[int] = None
    due_date: Optional[date] = None
    assignee_id: Optional[UUID] = None
    assignee_ids: Optional[list[UUID]] = []
    label_ids: Optional[list[UUID]] = []
    release_names: Optional[list[str]] = []


class TicketLabelMinimalSchema(BaseModel):
    id: UUID
    name: str
    color: Optional[str] = None

    class Config:
        from_attributes = True
        from_orm = True


class TicketLabelNestedSchema(BaseModel):
    label_id: UUID
    label: TicketLabelMinimalSchema

    class Config:
        from_attributes = True
        from_orm = True


class ReleaseResponseSchema(BaseModel):
    id: UUID
    ticket_id: Optional[UUID] = None
    name: str

    class Config:
        from_attributes = True
        from_orm = True


class TicketResponseSchema(BaseModel):
    id: UUID
    project_id: UUID
    parent_ticket_id: Optional[UUID] = None
    assignee_id: Optional[UUID] = None
    assignee_ids: Optional[list[UUID]] = []
    reporter_id: UUID
    ticket_number: str
    title: str
    description: Optional[str] = None
    type: str
    status: str
    priority: str
    story_points: Optional[int] = None
    due_date: Optional[date] = None
    message: Optional[str] = None
    ticket_labels: list[TicketLabelNestedSchema] = []
    releases: list[ReleaseResponseSchema] = []

    class Config:
        from_attributes = True
        from_orm = True


class TicketUpdateRequestSchema(BaseModel):
    title: Optional[str] = None
    description: Optional[str] = None
    type: Optional[str] = None
    status: Optional[str] = None
    priority: Optional[str] = None
    story_points: Optional[int] = None
    due_date: Optional[date] = None
    assignee_id: Optional[UUID] = None
    assignee_ids: Optional[list[UUID]] = []
