"""
User Schemas
User profile and management
"""
from typing import Optional, List
from pydantic import BaseModel, Field, EmailStr
from datetime import datetime

from app.models.user import UserRole


class UserBase(BaseModel):
    """Base user schema"""
    email: Optional[EmailStr] = None
    phone: Optional[str] = None
    first_name: Optional[str] = None
    last_name: Optional[str] = None


class UserCreate(UserBase):
    """User creation schema"""
    password: str = Field(..., min_length=8)
    role: UserRole = UserRole.PASSENGER


class UserUpdate(BaseModel):
    """User update schema"""
    first_name: Optional[str] = Field(None, max_length=100)
    last_name: Optional[str] = Field(None, max_length=100)
    date_of_birth: Optional[datetime] = None
    gender: Optional[str] = Field(None, pattern="^(male|female|other)$")
    address: Optional[str] = None
    city: Optional[str] = None
    state: Optional[str] = None
    country: Optional[str] = None
    postal_code: Optional[str] = None


class UserProfileUpdate(UserUpdate):
    """Profile update with additional fields (profile picture required as base64)."""
    fcm_token: Optional[str] = Field(None, description="FCM token for push notifications")
    profile_picture_base64: str = Field(
        ...,
        min_length=24,
        description="Profile photo as base64 or data URL (image/jpeg, image/png, image/webp; max 5MB decoded)",
    )


class UserResponse(BaseModel):
    """User response schema"""
    id: int
    email: Optional[str] = None
    phone: Optional[str] = None
    first_name: Optional[str] = None
    last_name: Optional[str] = None
    full_name: str
    profile_picture: Optional[str] = None
    role: UserRole
    is_active: bool
    is_verified: bool
    is_email_verified: bool
    is_phone_verified: bool
    created_at: datetime
    
    # Wallet info (if exists)
    wallet_balance: Optional[int] = None
    
    # Driver info (if driver)
    driver_status: Optional[str] = None
    is_online: Optional[bool] = None
    average_rating: Optional[float] = None
    
    class Config:
        from_attributes = True
        
    @classmethod
    def from_orm_with_extras(cls, user, wallet_balance=None, driver_info=None):
        """Create response with additional data"""
        data = {
            "id": user.id,
            "email": user.email,
            "phone": user.phone,
            "first_name": user.first_name,
            "last_name": user.last_name,
            "full_name": user.full_name,
            "profile_picture": user.profile_picture,
            "role": user.role,
            "is_active": user.is_active,
            "is_verified": user.is_verified,
            "is_email_verified": user.is_email_verified,
            "is_phone_verified": user.is_phone_verified,
            "created_at": user.created_at,
            "wallet_balance": wallet_balance,
        }
        if driver_info:
            data.update({
                "driver_status": driver_info.get("status"),
                "is_online": driver_info.get("is_online"),
                "average_rating": driver_info.get("average_rating"),
            })
        return cls(**data)


class UserListResponse(BaseModel):
    """User list item response (for admin)"""
    id: int
    email: Optional[str] = None
    phone: Optional[str] = None
    full_name: str
    role: UserRole
    is_active: bool
    is_verified: bool
    is_blocked: bool
    created_at: datetime
    last_login_at: Optional[datetime] = None
    
    class Config:
        from_attributes = True


class UserBlockRequest(BaseModel):
    """Request to block/unblock user"""
    is_blocked: bool
    reason: Optional[str] = None
