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


class SpecialPositionResponse(BaseModel):
    id: int
    position_number: str
    position_type_code: str
    position_type_label: Optional[str] = None
    position_type_color: Optional[str] = None
    sort_order: int = 0
    posisi_id: Optional[int] = None

    class Config:
        from_attributes = True


class SubscriberResponse(BaseModel):
    id: int
    asim_id: int
    asim_name: Optional[str] = None
    asim_no: Optional[int] = None
    is_admin_assigned: bool

    class Config:
        from_attributes = True


class SpecialMassCreate(BaseModel):
    name: str
    date: date
    time: str
    mass_type: str = 'generate'     # 'generate' | 'subscribe'
    num_positions: int = 8          # only used when mass_type='generate'
    max_subscribers: Optional[int] = None  # only used when mass_type='subscribe'


class SpecialMassUpdate(BaseModel):
    name: Optional[str] = None
    date: Optional[date] = None
    time: Optional[str] = None
    max_subscribers: Optional[int] = None


class SpecialMassResponse(BaseModel):
    id: int
    event_id: int
    name: str
    date: date
    time: str
    mass_type: str
    max_subscribers: Optional[int] = None
    subscriber_count: int = 0
    is_active: bool
    positions: List[SpecialPositionResponse] = []
    subscribers: List[SubscriberResponse] = []

    class Config:
        from_attributes = True


class SpecialEventCreate(BaseModel):
    name: str
    year: int


class SpecialEventUpdate(BaseModel):
    name: Optional[str] = None
    year: Optional[int] = None
    is_active: Optional[bool] = None
    is_published: Optional[bool] = None


class SpecialEventResponse(BaseModel):
    id: int
    name: str
    year: int
    is_active: bool
    is_published: bool
    masses: List[SpecialMassResponse] = []

    class Config:
        from_attributes = True


class SpecialPositionCreate(BaseModel):
    position_number: str
    position_type_code: str


class ReorderItem(BaseModel):
    id: int
    position_number: str
