"""User schemas for Mantimon TCG.

This module defines Pydantic models for user-related API requests
and responses.

Example:
    user_response = UserResponse(
        id="550e8400-e29b-41d4-a716-446655440000",
        email="player@example.com",
        display_name="Player1",
        is_premium=False,
        created_at=datetime.now(UTC)
    )
"""

from datetime import datetime
from uuid import UUID

from pydantic import BaseModel, EmailStr, Field


class UserResponse(BaseModel):
    """Public user information returned by API endpoints.

    Attributes:
        id: User's unique identifier.
        email: User's email address.
        display_name: User's public display name.
        avatar_url: URL to user's avatar image.
        is_premium: Whether user has active premium subscription.
        premium_until: When premium subscription expires (if premium).
        created_at: When the account was created.
    """

    id: UUID = Field(..., description="User ID")
    email: EmailStr = Field(..., description="User's email address")
    display_name: str = Field(..., description="Public display name")
    avatar_url: str | None = Field(default=None, description="Avatar image URL")
    is_premium: bool = Field(default=False, description="Premium subscription status")
    premium_until: datetime | None = Field(default=None, description="Premium expiration date")
    created_at: datetime = Field(..., description="Account creation date")

    model_config = {"from_attributes": True}


class UserCreate(BaseModel):
    """Internal schema for creating a user from OAuth data.

    Not exposed via API - used internally by auth service.

    Attributes:
        email: User's email from OAuth provider.
        display_name: User's name from OAuth provider.
        avatar_url: Avatar URL from OAuth provider.
        oauth_provider: OAuth provider name (google, discord).
        oauth_id: Unique ID from the OAuth provider.
    """

    email: EmailStr = Field(..., description="Email from OAuth provider")
    display_name: str = Field(..., max_length=50, description="Display name")
    avatar_url: str | None = Field(default=None, description="Avatar URL")
    oauth_provider: str = Field(..., description="OAuth provider (google, discord)")
    oauth_id: str = Field(..., description="Unique ID from OAuth provider")


class UserUpdate(BaseModel):
    """Schema for updating user profile.

    All fields are optional - only provided fields are updated.

    Attributes:
        display_name: New display name.
        avatar_url: New avatar URL.
    """

    display_name: str | None = Field(
        default=None, min_length=1, max_length=50, description="New display name"
    )
    avatar_url: str | None = Field(default=None, description="New avatar URL")


class OAuthUserInfo(BaseModel):
    """Normalized user information from OAuth providers.

    This provides a consistent structure regardless of whether
    the user authenticated via Google or Discord.

    Attributes:
        provider: OAuth provider name.
        oauth_id: Unique ID from the provider.
        email: User's email address.
        name: User's display name from provider.
        avatar_url: Avatar URL from provider.
    """

    provider: str = Field(..., description="OAuth provider (google, discord)")
    oauth_id: str = Field(..., description="Unique ID from provider")
    email: EmailStr = Field(..., description="User's email")
    name: str = Field(..., description="User's name from provider")
    avatar_url: str | None = Field(default=None, description="Avatar URL from provider")

    def to_user_create(self) -> UserCreate:
        """Convert OAuth info to UserCreate schema.

        Returns:
            UserCreate instance ready for user creation.
        """
        return UserCreate(
            email=self.email,
            display_name=self.name[:50],  # Enforce max length
            avatar_url=self.avatar_url,
            oauth_provider=self.provider,
            oauth_id=self.oauth_id,
        )
