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


# ---- Subjects ----
class SubjectOut(BaseModel):
    id: int
    name: str
    slug: str
    description: Optional[str] = None
    icon_url: Optional[str] = None
    color_hex: str
    is_active: bool

    class Config:
        from_attributes = True


class SubjectCreateRequest(BaseModel):
    name: str
    slug: str
    description: Optional[str] = None
    icon_url: Optional[str] = None
    color_hex: str = "#4F46E5"


# ---- Grades ----
class GradeOut(BaseModel):
    id: int
    name: str
    slug: str
    description: Optional[str] = None
    level_order: int
    is_active: bool

    class Config:
        from_attributes = True


# ---- Subject-Grade ----
class SubjectGradeOut(BaseModel):
    id: int
    subject_id: int
    grade_id: int
    subject: Optional[SubjectOut] = None
    grade: Optional[GradeOut] = None
    is_active: bool

    class Config:
        from_attributes = True


# ---- Packages ----
class PackageOut(BaseModel):
    id: int
    name: str
    slug: str
    display_name: str
    description: Optional[str] = None
    price: float
    currency: str
    duration_days: Optional[int] = None
    is_offline_capable: bool
    requires_subscription_check: bool
    grace_period_days: int
    features: Optional[List[str]] = None
    is_active: bool

    class Config:
        from_attributes = True


# ---- Topics ----
class TopicOut(BaseModel):
    id: int
    subject_grade_id: int
    package_id: int
    name: str
    slug: str
    description: Optional[str] = None
    thumbnail_url: Optional[str] = None
    sequence_order: int
    is_offline_available: bool
    total_levels: int
    is_active: bool
    created_at: datetime

    class Config:
        from_attributes = True


class TopicCreateRequest(BaseModel):
    subject_grade_id: int
    package_id: int
    name: str
    slug: str
    description: Optional[str] = None
    thumbnail_url: Optional[str] = None
    sequence_order: int = 1
    is_offline_available: bool = False
    total_levels: int = 5


# ---- Topic Levels ----
class TopicLevelOut(BaseModel):
    id: int
    topic_id: int
    level_number: int
    name: Optional[str] = None
    description: Optional[str] = None
    instructions: Optional[str] = None
    passing_score: int
    time_limit_seconds: int
    xp_reward: int
    stars_max: int
    is_active: bool

    class Config:
        from_attributes = True


class TopicLevelCreateRequest(BaseModel):
    topic_id: int
    level_number: int
    name: Optional[str] = None
    description: Optional[str] = None
    instructions: Optional[str] = None
    passing_score: int = 70
    time_limit_seconds: int = 300
    xp_reward: int = 10
    stars_max: int = 3


# ---- Teacher Submissions ----
class TeacherSubmissionOut(BaseModel):
    id: int
    teacher_user_id: int
    topic_level_id: int
    question_text: str
    question_type: str
    difficulty: str
    status: str
    review_comments: Optional[str] = None
    created_at: datetime

    class Config:
        from_attributes = True


class TeacherSubmissionCreateRequest(BaseModel):
    topic_level_id: int
    question_text: str
    question_type: str = "multiple_choice"
    difficulty: str = "medium"
    answers_json: Optional[List[dict]] = None
    hint_text: Optional[str] = None
    explanation: Optional[str] = None


class ReviewSubmissionRequest(BaseModel):
    status: str  # approved | rejected | revision_needed
    review_comments: Optional[str] = None
