from pydantic import BaseModel, EmailStr, Field, ConfigDict from typing import Optional, List from datetime import datetime class UserBase(BaseModel): email: EmailStr name: str avatar_url: Optional[str] = None role: str = "regular" weekly_star_quota: int = Field(default=15, ge=1, le=100) class UserCreate(UserBase): google_id: Optional[str] = None class UserUpdate(BaseModel): name: Optional[str] = None avatar_url: Optional[str] = None role: Optional[str] = None weekly_star_quota: Optional[int] = Field(default=None, ge=1, le=100) is_active: Optional[bool] = None class UserOut(UserBase): id: int google_id: Optional[str] = None is_active: bool created_at: datetime model_config = ConfigDict(from_attributes=True) class ChoreTypeBase(BaseModel): title: str description: Optional[str] = None star_reward: int = Field(default=1, ge=1, le=5) recurrence: str = Field(default="daily", description="daily, weekly, spontaneous") icon: str = "CheckSquare" class ChoreTypeCreate(ChoreTypeBase): pass class ChoreTypeUpdate(BaseModel): title: Optional[str] = None description: Optional[str] = None star_reward: Optional[int] = Field(default=None, ge=1, le=5) recurrence: Optional[str] = None icon: Optional[str] = None class ChoreTypeOut(ChoreTypeBase): id: int created_at: datetime model_config = ConfigDict(from_attributes=True) class ChoreCompletionCreate(BaseModel): chore_type_id: int notes: Optional[str] = None class ChoreCompletionOut(BaseModel): id: int chore_type_id: int user_id: int completed_at: datetime stars_earned: int week_identifier: str notes: Optional[str] = None user_name: Optional[str] = None user_avatar: Optional[str] = None chore_title: Optional[str] = None chore_icon: Optional[str] = None model_config = ConfigDict(from_attributes=True) class UserWeekProgress(BaseModel): user_id: int name: str email: str avatar_url: Optional[str] role: str weekly_star_quota: int stars_earned: int percentage: float completions_count: int class WeeklyReportOut(BaseModel): week_identifier: str user_progress: List[UserWeekProgress] total_stars_earned: int total_completions: int class GoogleAuthRequest(BaseModel): credential: Optional[str] = None email: Optional[EmailStr] = None name: Optional[str] = None avatar_url: Optional[str] = None class DemoLoginRequest(BaseModel): email: EmailStr