# backend/app/schemas.py from datetime import datetime from pydantic import BaseModel, ConfigDict, Field from .constants import ( BracketType, MatchSourceType, MatchStatus, TournamentTypes, WinnerSide, ) class TeamSchema(BaseModel): id: int name: str model_config = ConfigDict(from_attributes=True) class CourtSchema(BaseModel): id: int name: str model_config = ConfigDict(from_attributes=True) class TeamCreate(BaseModel): name: str class CourtCreate(BaseModel): name: str class SetScore(BaseModel): p1: int p2: int class ScoreReport(BaseModel): id: str code: str | None = None sets: list[SetScore] class MatchOut(BaseModel): id: str number: int | None = None timestamp: datetime | None = None court: str | None = Field( default=None, validation_alias="court_name", serialization_alias="court" ) bracket: BracketType round: int p1: str | None = Field( default=None, validation_alias="p1_name", serialization_alias="p1" ) p2: str | None = Field( default=None, validation_alias="p2_name", serialization_alias="p2" ) status: MatchStatus sets: list[SetScore] = [] previous_match_p1_id: str | None = Field( default=None, serialization_alias="source_p1" ) previous_match_p2_id: str | None = Field( default=None, serialization_alias="source_p2" ) source_p1_type: MatchSourceType | None = None source_p2_type: MatchSourceType | None = None winner_next_match_id: str | None = Field( default=None, serialization_alias="next_win" ) loser_next_match_id: str | None = Field( default=None, serialization_alias="next_loss" ) winner_side: WinnerSide = WinnerSide.NONE model_config = ConfigDict(from_attributes=True, populate_by_name=True) class TournamentCreate(BaseModel): name: str code: str type: TournamentTypes timestamp: datetime duration: int teams: list[str] courts: list[str] class TournamentOut(BaseModel): id: str name: str timestamp: datetime type: TournamentTypes team_count: int court_count: int model_config = ConfigDict(from_attributes=True) class TournamentUpdate(BaseModel): name: str | None = None code: str | None = None timestamp: datetime | None = None duration: int | None = None type: TournamentTypes | None = None class TournamentDetail(BaseModel): id: str name: str code: str timestamp: datetime type: TournamentTypes teams: list[TeamSchema] courts: list[CourtSchema] matches: list[MatchOut] model_config = ConfigDict(from_attributes=True) class TournamentUpdateResponse(TournamentDetail): code: str class Token(BaseModel): access_token: str token_type: str