from typing import Optional, List, Dict, Annotated
from pydantic import BaseModel, Field, StringConstraints
from datetime import datetime

# Common types
DateStr = Annotated[str, StringConstraints(pattern=r"^\d{4}-\d{2}-\d{2}$")]
TimeStr = Annotated[str, StringConstraints(pattern=r"^\d{2}:\d{2}$")]

class ReservationIn(BaseModel):
    date: DateStr
    time: TimeStr
    duration_minutes: int = Field(60, ge=5, le=24*60)
    price_cents: int = Field(0, ge=0)
    user_ids: List[int] = Field(default_factory=list)
    user_id: Optional[int] = None
    name: Optional[str] = None
    email: Optional[str] = None
    phone: Optional[str] = None
    status: Optional[str] = "confirmada"
    notes: Optional[str] = None
    docente_id: Optional[int] = None
    teacher_id: Optional[int] = None  # Alias/Alternative for docente_id
    paid: bool = False
    
    # Optional flexible fields for different UI versions
    per_student_cents: Optional[Dict[str, int]] = None
    student_payments: Optional[Dict[str, bool]] = None


class ReservationUpdate(BaseModel):
    date: Optional[DateStr] = None
    time: Optional[TimeStr] = None
    duration_minutes: Optional[int] = Field(None, ge=5, le=24*60)
    price_cents: Optional[int] = Field(None, ge=0)
    user_ids: Optional[List[int]] = None
    user_id: Optional[int] = None
    name: Optional[str] = None
    email: Optional[str] = None
    phone: Optional[str] = None
    status: Optional[str] = None
    notes: Optional[str] = None
    docente_id: Optional[int] = None
    paid: Optional[bool] = None
    student_payments: Optional[Dict[str, bool]] = None
    per_student_cents: Optional[Dict[str, int]] = None


class ExpenseIn(BaseModel):
    date: str
    amount_cents: int = Field(ge=0)
    category: Optional[str] = None
    concept: Optional[str] = None
    notes: Optional[str] = None
    user_id: Optional[int] = None
    reservation_id: Optional[int] = None
