from pydantic import BaseModel, Field, EmailStr
from typing import List, Optional
from datetime import datetime, timezone
import uuid

class UserRegister(BaseModel):
    username: str
    email: EmailStr
    password: str

class UserLogin(BaseModel):
    email: EmailStr
    password: str

class User(BaseModel):
    id: str = Field(default_factory=lambda: str(uuid.uuid4()))
    username: str
    email: EmailStr
    is_active: bool = True
    created_at: datetime = Field(default_factory=lambda: datetime.now(timezone.utc))
    level: str = "foundation"
    total_points: int = 0
    badges: List[str] = []
    games_completed: List[str] = []
    courses_enrolled: List[str] = []

    class Config:
        from_attributes = True

class Token(BaseModel):
    access_token: str
    token_type: str
    user: dict

class GameScore(BaseModel):
    id: str = Field(default_factory=lambda: str(uuid.uuid4()))
    user_id: str
    game_name: str
    score: int
    time_taken: int
    completed: bool
    completed_at: datetime = Field(default_factory=lambda: datetime.now(timezone.utc))

class Badge(BaseModel):
    id: str = Field(default_factory=lambda: str(uuid.uuid4()))
    name: str
    description: str
    icon: str
    requirements: dict

class LeaderboardEntry(BaseModel):
    user_id: str
    username: str
    total_points: int
    games_completed: int
    badges_count: int

class Lesson(BaseModel):
    title: str
    video_url: Optional[str] = None
    slides: List[dict] = [] # [{title: str, content: str, image_url: str}]
    voiceover_script: Optional[str] = None
    exercises: List[dict] = [] # [{question: str, options: List[str], correct: int}]
    attachments: List[dict] = [] # [{name: str, url: str, type: str}]

class Module(BaseModel):
    name: str
    duration: str
    lessons: List[Lesson]

class Course(BaseModel):
    id: str = Field(default_factory=lambda: str(uuid.uuid4()))
    title: str
    description: str
    level: str
    duration_weeks: int
    modules: List[Module]
    price: float = 0.0

class Enrollment(BaseModel):
    id: str = Field(default_factory=lambda: str(uuid.uuid4()))
    user_id: str
    course_id: str
    enrolled_at: datetime = Field(default_factory=lambda: datetime.now(timezone.utc))
    progress: int = 0
