from pydantic import BaseModel, EmailStr, Field from typing import Optional from datetime import datetime # User schemas class UserBase(BaseModel): username: str = Field(..., min_length=3, max_length=50) email: EmailStr class UserCreate(UserBase): password: str = Field(..., min_length=6) class UserResponse(UserBase): id: int is_active: bool is_admin: bool created_at: datetime last_login: Optional[datetime] = None class Config: from_attributes = True # Auth schemas class Token(BaseModel): access_token: str token_type: str class TokenData(BaseModel): username: Optional[str] = None class LoginRequest(BaseModel): username: str password: str # UserStats schemas class UserStatsBase(BaseModel): energy: float = 100.0 max_energy: float = 100.0 hunger: float = 100.0 max_hunger: float = 100.0 level: int = 1 experience: int = 0 coins: int = 0 class UserStatsResponse(UserStatsBase): id: int user_id: int total_playtime: int rooms_visited: int items_collected: int enemies_defeated: int deaths: int updated_at: datetime class Config: from_attributes = True class UserStatsUpdate(BaseModel): energy: Optional[float] = None hunger: Optional[float] = None experience: Optional[int] = None coins: Optional[int] = None rooms_visited: Optional[int] = None items_collected: Optional[int] = None enemies_defeated: Optional[int] = None deaths: Optional[int] = None # GameSession schemas class GameSessionCreate(BaseModel): pass class GameSessionResponse(BaseModel): id: int user_id: int started_at: datetime ended_at: Optional[datetime] = None duration: int energy_consumed: float hunger_consumed: float rooms_visited_session: int items_collected_session: int enemies_defeated_session: int deaths_session: int class Config: from_attributes = True # Admin schemas class AdminStats(BaseModel): total_users: int active_users_today: int new_users_today: int total_sessions: int avg_session_duration: float total_playtime: int total_rooms_visited: int total_items_collected: int total_enemies_defeated: int class UserListItem(BaseModel): id: int username: str email: str is_active: bool is_admin: bool created_at: datetime last_login: Optional[datetime] = None class Config: from_attributes = True class UserDetail(UserListItem): stats: Optional[UserStatsResponse] = None