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


# ---- Base User ----
class UserBase(BaseModel):
    first_name: str
    last_name: str
    email: Optional[EmailStr] = None
    phone: Optional[str] = None


class UserOut(UserBase):
    id: int
    stem_id: str
    username: Optional[str] = None
    email: Optional[str] = None  # override EmailStr — allow any stored email value
    role: str
    profile_image_url: Optional[str] = None
    date_of_birth: Optional[date] = None
    gender: Optional[str] = None
    is_active: bool
    is_email_verified: bool
    last_login_at: Optional[datetime] = None
    created_at: datetime

    class Config:
        from_attributes = True


class UserListOut(BaseModel):
    id: int
    stem_id: str
    first_name: str
    last_name: str
    email: Optional[str] = None
    phone: Optional[str] = None
    role: str
    is_active: bool
    created_at: datetime

    class Config:
        from_attributes = True


# ---- Student ----
class StudentProfileOut(BaseModel):
    id: int
    user_id: int
    current_grade_id: Optional[int] = None
    current_school_id: Optional[int] = None
    bio: Optional[str] = None
    learning_style: Optional[str] = None
    preferred_game_type_id: Optional[int] = None
    total_xp: int
    level_rank: int
    streak_days: int
    last_activity_at: Optional[datetime] = None

    class Config:
        from_attributes = True


class StudentDetailOut(UserOut):
    student_profile: Optional[StudentProfileOut] = None


class StudentUpdateRequest(BaseModel):
    first_name: Optional[str] = None
    last_name: Optional[str] = None
    phone: Optional[str] = None
    date_of_birth: Optional[date] = None
    gender: Optional[str] = None
    bio: Optional[str] = None
    learning_style: Optional[str] = None
    preferred_game_type_id: Optional[int] = None
    current_grade_id: Optional[int] = None


# ---- Parent ----
class ParentProfileOut(BaseModel):
    id: int
    user_id: int
    occupation: Optional[str] = None

    class Config:
        from_attributes = True


class ParentDetailOut(UserOut):
    parent_profile: Optional[ParentProfileOut] = None


# ---- Teacher ----
class TeacherProfileOut(BaseModel):
    id: int
    user_id: int
    teacher_code: str
    specialization: Optional[str] = None
    qualifications: Optional[str] = None
    experience_years: int
    is_content_approved: bool

    class Config:
        from_attributes = True


class TeacherDetailOut(UserOut):
    teacher_profile: Optional[TeacherProfileOut] = None


# ---- Notifications ----
class NotificationOut(BaseModel):
    id: int
    title: str
    message: str
    type: str
    is_read: bool
    action_url: Optional[str] = None
    created_at: datetime

    class Config:
        from_attributes = True


# ---- Pagination ----
class PaginatedResponse(BaseModel):
    items: List
    total: int
    page: int
    page_size: int
    total_pages: int


class LinkStudentRequest(BaseModel):
    student_stem_id: str
    relationship: str = "guardian"
    is_primary: bool = False


class TransferSchoolRequest(BaseModel):
    new_school_code: str


class AdminUpdateUserRequest(BaseModel):
    first_name: Optional[str] = None
    last_name: Optional[str] = None
    email: Optional[EmailStr] = None
    phone: Optional[str] = None
    is_active: Optional[bool] = None
    is_email_verified: Optional[bool] = None
    role: Optional[str] = None
