from typing import Optional, List, Annotated
from pydantic import BaseModel, Field, ConfigDict, field_validator, BeforeValidator
from datetime import datetime

StrId = Annotated[str, BeforeValidator(str)]


class ChecklistBase(BaseModel):
    job_id: str = Field(..., max_length=36)
    title: str = Field(..., max_length=500, min_length=1)
    description: Optional[str] = None
    display_order: int = Field(default=0, ge=0)


class ChecklistCreate(ChecklistBase):
    pass


class ChecklistUpdate(BaseModel):
    job_id: Optional[str] = Field(None, max_length=36)
    title: Optional[str] = Field(None, max_length=500, min_length=1)
    description: Optional[str] = None
    display_order: Optional[int] = Field(None, ge=0)


class ChecklistResponse(ChecklistBase):
    id: StrId
    created_at: datetime
    updated_at: datetime

    model_config = ConfigDict(from_attributes=True)


class ChecklistitemBase(BaseModel):
    checklist_id: str = Field(..., max_length=36)
    description: str = Field(..., min_length=1)
    is_completed: bool = Field(default=False)
    assigned_to_user_id: Optional[str] = Field(None, max_length=36)
    display_order: int = Field(default=0, ge=0)
    completed_at: Optional[datetime] = None


class ChecklistitemCreate(ChecklistitemBase):
    pass


class ChecklistitemUpdate(BaseModel):
    checklist_id: Optional[str] = Field(None, max_length=36)
    description: Optional[str] = Field(None, min_length=1)
    is_completed: Optional[bool] = None
    assigned_to_user_id: Optional[str] = Field(None, max_length=36)
    display_order: Optional[int] = Field(None, ge=0)
    completed_at: Optional[datetime] = None


class ChecklistitemResponse(ChecklistitemBase):
    id: StrId
    created_at: datetime
    updated_at: datetime

    model_config = ConfigDict(from_attributes=True)


class ChecklistListResponse(BaseModel):
    items: List[ChecklistResponse]
    total: int
    limit: int
    offset: int

    model_config = ConfigDict(from_attributes=True)


class ChecklistitemListResponse(BaseModel):
    items: List[ChecklistitemResponse]
    total: int
    limit: int
    offset: int

    model_config = ConfigDict(from_attributes=True)