"""
User-related schemas
"""
from pydantic import BaseModel
from typing import Optional
from uuid import UUID
from datetime import datetime, date


class UserRoleBase(BaseModel):
    role_name: str
    description: Optional[str] = None


class UserRoleCreate(UserRoleBase):
    pass


class UserRoleUpdate(UserRoleBase):
    pass


class UserRole(UserRoleBase):
    role_id: int

    class Config:
        orm_mode = True


class LanguageBase(BaseModel):
    language_code: str
    language_name: str
    flag_url: Optional[str] = None
    is_active: bool = True


class LanguageCreate(LanguageBase):
    pass


class LanguageUpdate(LanguageBase):
    pass


class Language(LanguageBase):
    language_id: int

    class Config:
        orm_mode = True


class CurrencyBase(BaseModel):
    currency_code: str
    currency_name: str
    currency_symbol: Optional[str] = None
    exchange_rate_to_eur: float = 1.0
    is_active: bool = True


class CurrencyCreate(CurrencyBase):
    pass


class CurrencyUpdate(CurrencyBase):
    pass


class Currency(CurrencyBase):
    currency_id: int
    updated_at: datetime

    class Config:
        orm_mode = True


class CountryBase(BaseModel):
    country_name: str
    country_code: str
    phone_code: Optional[str] = None
    flag_url: Optional[str] = None


class CountryCreate(CountryBase):
    pass


class CountryUpdate(CountryBase):
    pass


class Country(CountryBase):
    country_id: int
    created_at: datetime

    class Config:
        orm_mode = True


class UserBase(BaseModel):
    email: str
    first_name: Optional[str] = None
    last_name: Optional[str] = None
    phone: Optional[str] = None
    date_of_birth: Optional[date] = None
    profile_photo_path: Optional[str] = None
    is_email_verified: bool = False
    is_active: bool = True


class UserCreate(UserBase):
    password: str
    role_id: int
    preferred_language_id: int
    preferred_currency_id: int


class UserUpdate(UserBase):
    role_id: Optional[int] = None
    preferred_language_id: Optional[int] = None
    preferred_currency_id: Optional[int] = None


class User(UserBase):
    user_id: UUID
    role_id: int
    preferred_language_id: int
    preferred_currency_id: int
    created_at: datetime
    updated_at: datetime
    last_login: Optional[datetime] = None

    class Config:
        orm_mode = True


class EmailVerificationTokenBase(BaseModel):
    token: str
    token_type: str
    expires_at: datetime
    is_used: bool = False


class EmailVerificationTokenCreate(EmailVerificationTokenBase):
    user_id: UUID


class EmailVerificationTokenUpdate(EmailVerificationTokenBase):
    user_id: Optional[UUID] = None


class EmailVerificationToken(EmailVerificationTokenBase):
    token_id: int
    user_id: UUID
    created_at: datetime

    class Config:
        orm_mode = True