"""Pydantic schemas for API request/response and validation."""

from typing import Literal

from pydantic import BaseModel, ConfigDict

# Allowed duty event types; API maps unknown DB values to "duty".
DUTY_EVENT_TYPES = ("duty", "unavailable", "vacation")


class UserBase(BaseModel):
    """Base user fields (full_name, username, first/last name)."""

    full_name: str
    username: str | None = None
    first_name: str | None = None
    last_name: str | None = None


class UserCreate(UserBase):
    """User creation payload including Telegram user id."""

    telegram_user_id: int


class UserInDb(UserBase):
    """User as stored in DB (includes id and telegram_user_id)."""

    id: int
    telegram_user_id: int

    model_config = ConfigDict(from_attributes=True)


class DutyBase(BaseModel):
    """Duty fields: user_id, start_at, end_at (UTC ISO 8601 with Z)."""

    user_id: int
    start_at: str  # UTC, ISO 8601 with Z
    end_at: str  # UTC, ISO 8601 with Z


class DutyCreate(DutyBase):
    """Duty creation payload."""

    pass


class DutyInDb(DutyBase):
    """Duty as stored in DB (includes id)."""

    id: int

    model_config = ConfigDict(from_attributes=True)


class DutyWithUser(DutyInDb):
    """Duty with full_name, event_type, and optional contact fields for calendar display.

    event_type: only these values are returned; unknown DB values are mapped to "duty" in the API.
    phone and username are exposed only to authenticated Mini App users (role-gated).
    """

    full_name: str
    event_type: Literal["duty", "unavailable", "vacation"] = "duty"
    phone: str | None = None
    username: str | None = None

    model_config = ConfigDict(from_attributes=True)


class CalendarEvent(BaseModel):
    """External calendar event (e.g. holiday) for a single day."""

    date: str  # YYYY-MM-DD
    summary: str
