from pydantic import BaseModel
from typing import Optional, List
from datetime import datetime


# ---- Game Types ----
class GameTypeOut(BaseModel):
    id: int
    name: str
    slug: str
    description: Optional[str] = None
    icon_url: Optional[str] = None
    is_active: bool

    class Config:
        from_attributes = True


class GameTypeCreateRequest(BaseModel):
    name: str
    slug: str
    description: Optional[str] = None
    icon_url: Optional[str] = None


class GameTypeUpdateRequest(BaseModel):
    name: Optional[str] = None
    slug: Optional[str] = None
    description: Optional[str] = None
    icon_url: Optional[str] = None
    is_active: Optional[bool] = None


# ---- Game Assets ----
class GameAssetOut(BaseModel):
    id: int
    game_type_id: int
    name: str
    slug: str
    image_url: Optional[str] = None
    svg_url: Optional[str] = None
    rive_url: Optional[str] = None
    sound_url: Optional[str] = None
    asset_type: str
    asset_group: Optional[str] = None
    monetary_value: Optional[float] = None
    quantity_default: int
    is_offline_available: bool
    is_active: bool

    class Config:
        from_attributes = True


class GameAssetCreateRequest(BaseModel):
    game_type_id: int
    name: str
    slug: str
    image_url: Optional[str] = None
    svg_url: Optional[str] = None
    rive_url: Optional[str] = None
    sound_url: Optional[str] = None
    asset_type: str = "image"
    asset_group: str = "action"
    monetary_value: Optional[float] = None
    quantity_default: int = 1
    is_offline_available: bool = False


# ---- Games ----
class GameOut(BaseModel):
    id: int
    name: str
    slug: str
    description: Optional[str] = None
    instructions: Optional[str] = None
    intro_video_url: Optional[str] = None
    artwork_url: Optional[str] = None
    game_type_id: int
    subject_grade_id: Optional[int] = None
    is_active: bool
    created_at: datetime

    class Config:
        from_attributes = True


class GameCreateRequest(BaseModel):
    name: str
    slug: str
    description: Optional[str] = None
    instructions: Optional[str] = None
    intro_video_url: Optional[str] = None
    artwork_url: Optional[str] = None
    game_type_id: int
    category_id: Optional[int] = None
    subject_grade_id: Optional[int] = None


# ---- Answer Options ----
class AnswerOptionOut(BaseModel):
    id: int
    answer_text: str
    is_correct: bool
    display_order: int
    explanation: Optional[str] = None
    asset_group: Optional[str] = None
    monetary_value: Optional[float] = None
    quantity: int
    asset_2d: Optional[GameAssetOut] = None
    asset_3d: Optional[GameAssetOut] = None
    asset_vr: Optional[GameAssetOut] = None

    class Config:
        from_attributes = True


class AnswerOptionCreateRequest(BaseModel):
    answer_text: str
    is_correct: bool = False
    display_order: int = 1
    explanation: Optional[str] = None
    asset_2d_id: Optional[int] = None
    asset_3d_id: Optional[int] = None
    asset_vr_id: Optional[int] = None
    asset_group: Optional[str] = None
    monetary_value: Optional[float] = None
    quantity: int = 1


# ---- Questions ----
class QuestionOut(BaseModel):
    id: int
    level_id: int
    question_text: str
    question_type: str
    difficulty: str
    sequence_order: int
    time_limit_seconds: int
    points: int
    hint_text: Optional[str] = None
    explanation: Optional[str] = None
    media_url: Optional[str] = None
    is_verified: bool
    is_active: bool
    answers: List[AnswerOptionOut] = []

    class Config:
        from_attributes = True


class QuestionCreateRequest(BaseModel):
    level_id: int
    question_text: str
    question_type: str = "multiple_choice"
    difficulty: str = "medium"
    sequence_order: int = 1
    time_limit_seconds: int = 60
    points: int = 10
    hint_text: Optional[str] = None
    explanation: Optional[str] = None
    media_url: Optional[str] = None
    answers: List[AnswerOptionCreateRequest] = []


# ---- Game Session ----
class CreateSessionRequest(BaseModel):
    play_mode: str = "single_player"
    game_level_id: int
    game_type_id: int
    max_players: int = 1
    settings: Optional[dict] = None


class JoinSessionRequest(BaseModel):
    session_code: str
    team_id: Optional[int] = None


class SessionOut(BaseModel):
    id: int
    session_code: str
    play_mode: str
    game_level_id: int
    game_type_id: int
    host_user_id: int
    status: str
    max_players: int
    started_at: Optional[datetime] = None
    ended_at: Optional[datetime] = None
    is_offline: bool
    created_at: datetime

    class Config:
        from_attributes = True


class SubmitAnswerRequest(BaseModel):
    session_id: int
    question_id: int
    selected_answer_id: int
    time_taken_seconds: int = 0


class CompleteSessionRequest(BaseModel):
    session_id: int
    score: int
    stars_earned: int
    completion_time_seconds: int
    answers_correct: int
    answers_total: int
