"""Library schemas.""" from datetime import datetime from typing import Optional, List from uuid import UUID from pydantic import BaseModel, Field, ConfigDict # ============ LISTENING HISTORY SCHEMAS ============ class ListeningHistoryBase(BaseModel): """Base listening history schema.""" played_for: int = Field(..., ge=0, description="Duration played in seconds") completed: bool = False source: Optional[str] = Field(None, max_length=50, description="Playback source") class ListeningHistoryCreate(ListeningHistoryBase): """Schema for creating a listening history entry.""" track_id: UUID class ListeningHistoryResponse(BaseModel): """Schema for listening history response.""" model_config = ConfigDict(from_attributes=True) id: UUID user_id: UUID track_id: UUID played_for: int completed: bool source: Optional[str] played_at: datetime created_at: datetime # Embedded track information track: Optional[dict] = None class ListeningHistoryStats(BaseModel): """Schema for listening history statistics.""" total_plays: int plays_last_30_days: int unique_tracks_played: int # ============ LIKED TRACKS SCHEMAS ============ class LikedTrackBase(BaseModel): """Base liked track schema.""" notes: Optional[str] = Field(None, max_length=1000, description="User notes about the track") class LikedTrackCreate(BaseModel): """Schema for liking a track.""" track_id: UUID notes: Optional[str] = Field(None, max_length=1000) class LikedTrackUpdate(BaseModel): """Schema for updating liked track notes.""" notes: str = Field(..., max_length=1000) class LikedTrackResponse(BaseModel): """Schema for liked track response.""" model_config = ConfigDict(from_attributes=True) id: UUID user_id: UUID track_id: UUID notes: Optional[str] created_at: datetime updated_at: datetime # Embedded track information track: Optional[dict] = None class LikedTrackCheckResponse(BaseModel): """Schema for checking if track is liked.""" is_liked: bool # ============ LIBRARY STATS SCHEMAS ============ class LibraryStatsResponse(BaseModel): """Schema for library statistics response.""" liked_tracks_count: int total_plays: int plays_last_30_days: int unique_tracks_played: int class RecentlyPlayedResponse(BaseModel): """Schema for recently played tracks.""" tracks: List[dict] total: int class MostPlayedTrackResponse(BaseModel): """Schema for most played track response.""" track: dict play_count: int class MostPlayedTracksResponse(BaseModel): """Schema for most played tracks response.""" tracks: List[MostPlayedTrackResponse] total: int