from typing import Optional,List
from datetime import datetime
from pydantic import BaseModel, EmailStr, field_validator
from db.schemas.role import RoleOut  # Assuming RoleOut is defined in role.py
from pydantic import field_serializer

from db.schemas.university import UniversityOut



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

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

class UserCreate(BaseModel):
    name: str
    email: EmailStr
    password: str
    role_id: Optional[int] = None
    university_id:Optional[int]=None
    is_active: bool = True
    is_email_verified: bool = False
    is_phone_verified: bool = False
    phone_number: Optional[str] = None
    profile_picture: Optional[str] = None
    activation_date: Optional[datetime] = None
    educational_degree: Optional[str] = None
    department: Optional[str] = None
    subscription_package: Optional[str] = None
    subscription_start_date: Optional[datetime] = None
    subscription_end_date: Optional[datetime] = None
    subscription_status: Optional[str] = None  # e.g., 'active', 'expired', 'cancelled'
    subscription_renewal_date: Optional[datetime] = None
    created_at: Optional[datetime] = None
    updated_at: Optional[datetime] = None
            # ✅ This will run before validation
    @field_validator(
        "subscription_start_date",
        "subscription_end_date",
        "subscription_renewal_date",
        "activation_date",
        mode="before"
    )
    def empty_string_to_none(cls, v):
        if v in ("", None):
            return None
        return v
class UserResponse(BaseModel):
    id: int
    name: str
    email: EmailStr
    is_active: bool
    role: RoleOut
    university: Optional[UniversityOut] = None
    activation_date: datetime | None
    last_login: datetime | None
    is_email_verified: bool = False
    is_phone_verified: bool = False
    phone_number: Optional[str] = None
    profile_picture: Optional[str] = None
    role_id: Optional[int]
    university_id:Optional[int]
    educational_degree: Optional[str] = None
    department: Optional[str] = None
    subscription_package: Optional[str] = None
    subscription_start_date: Optional[datetime] = None
    subscription_end_date: Optional[datetime] = None
    subscription_status: Optional[str] = None  # e.g., 'active', 'expired', 'cancelled'
    subscription_renewal_date: Optional[datetime] = None
    created_at: datetime
    updated_at: datetime


    class Config:
        from_attributes = True  # Allows Pydantic to work with SQLAlchemy models
        json_encoders = {
            int: lambda v: v.isoformat() if isinstance(v, datetime) else v
        }
        str_strip_whitespace = True  # Strips whitespace from string fields
        
        @field_serializer('activation_date', 'last_login', 'subscription_start_date', 'subscription_end_date', 'subscription_renewal_date', 'created_at', 'updated_at', when_used="json")
        def serialize_datetime(cls, value: datetime):
            return int(value.timestamp()) if value else None