"""
User schema definitions for common operations.
"""

from datetime import datetime
from typing import Optional, List
from uuid import UUID
from pydantic import EmailStr, Field, ConfigDict
from src.apps.base.schemas.common import BaseSchema
from src.apps.files.schemas.file_common import FileResponseSchema
from src.apps.base.schemas.common import AddressSchema
from src.apps.role_permissions.schemas.role_permission_common import RoleSchema


class UserBase(BaseSchema):
    """Base user schema with common fields."""
    
    email: EmailStr = Field(..., description="User's email address")
    username: Optional[str] = Field(None, max_length=100, description="User's username")
    first_name: Optional[str] = Field(None, max_length=100, description="User's first name")
    middle_name: Optional[str] = Field(None, max_length=100, description="User's middle name")
    last_name: Optional[str] = Field(None, max_length=100, description="User's last name")
    phone: Optional[str] = Field(None, max_length=20, description="User's phone number")
    is_active: bool = Field(True, description="Whether the user is active")
    is_verified: bool = Field(False, description="Whether the user is verified")
    
    @property
    def full_name(self) -> str:
        """Get user's full name."""
        names = [name for name in [self.first_name, self.middle_name, self.last_name] if name]
        return " ".join(names) if names else ""


class UserResponseSchema(UserBase):
    """User response schema."""
    
    model_config = ConfigDict(from_attributes=True)
    
    id: int = Field(..., description="User's unique identifier")
    user_id: Optional[str] = Field(None, description="User's external identifier")
    username: str = Field(..., description="User's username")
    created_at: datetime = Field(..., description="When the user was created")
    updated_at: Optional[datetime] = Field(None, description="When the user was last updated")
    deleted_at: Optional[datetime] = Field(None, description="When the user was soft deleted")


class UserCreateSchema(UserBase):
    """Schema for creating a new user."""
    
    username: str = Field(..., max_length=100, description="User's username (required)")
    password: str = Field(..., min_length=8, description="User's password (required)")


class UserUpdateSchema(UserBase):
    """Schema for updating user information."""
    
    # Make all fields optional for updates
    email: Optional[EmailStr] = Field(None, description="User's email address")
    username: Optional[str] = Field(None, max_length=100, description="User's username")
    first_name: Optional[str] = Field(None, max_length=100, description="User's first name")
    middle_name: Optional[str] = Field(None, max_length=100, description="User's middle name")
    last_name: Optional[str] = Field(None, max_length=100, description="User's last name")
    phone: Optional[str] = Field(None, max_length=20, description="User's phone number")
    is_active: Optional[bool] = Field(None, description="Whether the user is active")
    is_verified: Optional[bool] = Field(None, description="Whether the user is verified")


class UserRolesSchema(BaseSchema):
    id: int = Field(description="Id of user role resource")
    # role: RoleNoDepsSchema = Field(description="Associated role of the user")
    role: RoleSchema = Field(description="Associated role of the user")
    is_primary: bool = Field(description="Is this role the primary role of user?")

class UserSchema(UserBase):
    id: int = Field(description="Id of user resource")
    user_id: Optional[str] = Field(
        default=None, description="Unique id of user typically has the form 'usr_xxx' "
    )
    uuid: Optional[UUID] = Field(default=None, description="System generated uuid of user")
    is_active: Optional[bool] = Field(
        default=None, description="Activation status of user, false denotes that the user is inactive"
    )
    is_verified: Optional[bool] = Field(
        default=None, description="Verification status of user, false denotes that the user is unverified"
    )
    access_level: Optional[str] = Field(default=None, description="Access level of the user")
    is_admin: Optional[bool] = Field(default=None, description="Is this user an administrator?")
    is_owner: Optional[bool] = Field(default=None, description="Is this user an owner?")
    last_login: Optional[datetime] = Field(default=None, description="Last logged in unix timestamp")
    dob: Optional[datetime] = Field(
        default=None, description="User date of birth in formate YYYY/MM/DD"
    )
    timezone: Optional[str] = Field(default=None, description="Current time zone of user")
    created_at: Optional[datetime] = Field(
        default=None, description="Created date and time as unix timestamp"
    )
    updated_at: Optional[datetime] = Field(
        default=None, description="Updated date and time as unix timestamp"
    )
    deleted_at: Optional[datetime] = Field(
        default=None, description="Deleted date and time as unix timestamp"
    )
    avatar: Optional[FileResponseSchema] = Field(
        default=None, description="Profile picture / avatar of user"
    )
    roles: Optional[List[UserRolesSchema]] = Field(
        default=[], description="Roles of this user"
    )
    addresses: Optional[List[AddressSchema]] = Field(
        default=None, description="Addresses of this user account"
    )
    user_role_type: Optional[str] = Field(default=None, description="User role type check")
    signup_details_filled: Optional[bool] = Field(
        default=None, description="Checking if user have filled up signup details or not"
    )
    twofa_enabled: Optional[bool] = Field(default=None, description="2FA Authorization")