"""
User schemas for authentication and user management.
"""
from typing import Optional, List
from datetime import datetime
from pydantic import BaseModel, EmailStr, Field

from app.models.user import UserRole


class UserBase(BaseModel):
    """Base user schema with common fields."""
    email: EmailStr
    first_name: str = Field(..., min_length=1, max_length=100)
    last_name: str = Field(..., min_length=1, max_length=100)
    role: UserRole = UserRole.RECEPTION
    establishment_id: Optional[int] = None


class UserCreate(UserBase):
    """Schema for creating a new user."""
    password: str = Field(..., min_length=6, max_length=100)
    establishment_ids: Optional[List[int]] = None  # List of establishment IDs to assign


class UserUpdate(BaseModel):
    """Schema for updating a user."""
    email: Optional[EmailStr] = None
    first_name: Optional[str] = Field(None, min_length=1, max_length=100)
    last_name: Optional[str] = Field(None, min_length=1, max_length=100)
    password: Optional[str] = Field(None, min_length=6, max_length=100)
    role: Optional[UserRole] = None
    is_active: Optional[bool] = None
    establishment_id: Optional[int] = None
    establishment_ids: Optional[List[int]] = None  # List of establishment IDs to assign


class EstablishmentBasic(BaseModel):
    """Basic establishment info for user response."""
    id: int
    name: str
    city: Optional[str] = None

    class Config:
        from_attributes = True


class UserResponse(UserBase):
    """Schema for user response."""
    id: int
    is_active: bool
    full_name: str
    created_at: datetime
    updated_at: datetime
    establishments: List[EstablishmentBasic] = []

    class Config:
        from_attributes = True


class UserWithEstablishments(UserResponse):
    """Schema for user with full establishment details."""
    establishment_ids: List[int] = []

    class Config:
        from_attributes = True


class UserLogin(BaseModel):
    """Schema for user login."""
    email: EmailStr
    password: str


class Token(BaseModel):
    """Schema for JWT tokens response."""
    access_token: str
    refresh_token: str
    token_type: str = "bearer"


class TokenData(BaseModel):
    """Schema for decoded token data."""
    user_id: int
    email: str
    role: UserRole


class TokenRefresh(BaseModel):
    """Schema for token refresh request."""
    refresh_token: str
