"""
User-related database models
"""
from sqlalchemy import Column, Integer, BigInteger, String, Boolean, DateTime, Date, Text, ForeignKey, DECIMAL
from sqlalchemy.orm import relationship
from sqlalchemy.sql import func
from sqlalchemy.dialects.postgresql import UUID as PG_UUID
import uuid
from app.db.session import Base


class UserRole(Base):
    __tablename__ = "user_roles"

    role_id = Column(Integer, primary_key=True, index=True)
    role_name = Column(String(30), unique=True, nullable=False)
    description = Column(Text)

    # Relationships
    users = relationship("User", back_populates="role")


class Language(Base):
    __tablename__ = "languages"

    language_id = Column(Integer, primary_key=True, index=True)
    language_code = Column(String(5), unique=True, nullable=False)
    language_name = Column(String(50), nullable=False)
    flag_url = Column(String(500))
    is_active = Column(Boolean, default=True)

    # Relationships
    users = relationship("User", back_populates="preferred_language")


class Currency(Base):
    __tablename__ = "currencies"

    currency_id = Column(Integer, primary_key=True, index=True)
    currency_code = Column(String(3), unique=True, nullable=False)
    currency_name = Column(String(50), nullable=False)
    currency_symbol = Column(String(10))
    exchange_rate_to_eur = Column(DECIMAL(10, 6), default=1.0)
    is_active = Column(Boolean, default=True)
    updated_at = Column(DateTime(timezone=True), server_default=func.now(), onupdate=func.now())

    # Relationships
    users = relationship("User", back_populates="preferred_currency")


class Country(Base):
    __tablename__ = "countries"

    country_id = Column(Integer, primary_key=True, index=True)
    country_name = Column(String(100), nullable=False)
    country_code = Column(String(3), unique=True, nullable=False)
    phone_code = Column(String(10))
    flag_url = Column(String(500))
    created_at = Column(DateTime(timezone=True), server_default=func.now())

    # Relationships
    companies = relationship("Company", back_populates="country")
    beach_places = relationship("BeachPlace", back_populates="country")


class User(Base):
    __tablename__ = "users"

    user_id = Column(PG_UUID(as_uuid=True), primary_key=True, default=uuid.uuid4, index=True)
    email = Column(String(255), unique=True, nullable=False, index=True)
    password_hash = Column(String(255), nullable=False)
    first_name = Column(String(100))
    last_name = Column(String(100))
    phone = Column(String(50))
    date_of_birth = Column(Date)
    profile_photo_path = Column(String(1000))
    role_id = Column(Integer, ForeignKey("user_roles.role_id"))
    preferred_language_id = Column(Integer, ForeignKey("languages.language_id"))
    preferred_currency_id = Column(Integer, ForeignKey("currencies.currency_id"))
    is_email_verified = Column(Boolean, default=False)
    is_active = Column(Boolean, default=True)
    created_at = Column(DateTime(timezone=True), server_default=func.now())
    updated_at = Column(DateTime(timezone=True), server_default=func.now(), onupdate=func.now())
    last_login = Column(DateTime(timezone=True))

    # Relationships
    role = relationship("UserRole", back_populates="users")
    preferred_language = relationship("Language", back_populates="users")
    preferred_currency = relationship("Currency", back_populates="users")
    user_companies = relationship("UserCompany", back_populates="user")
    verification_tokens = relationship("EmailVerificationToken", back_populates="user")
    bookings = relationship("Booking", back_populates="user")
    reviews = relationship("Review", back_populates="user")
    wallet = relationship("UserWallet", back_populates="user", uselist=False)

    @property
    def full_name(self):
        if self.first_name and self.last_name:
            return f"{self.first_name} {self.last_name}"
        return self.first_name or self.last_name or self.email


class EmailVerificationToken(Base):
    __tablename__ = "email_verification_tokens"

    token_id = Column(BigInteger, primary_key=True, index=True)
    user_id = Column(PG_UUID(as_uuid=True), ForeignKey("users.user_id"))
    token = Column(String(6), nullable=False)
    token_type = Column(String(30), nullable=False)  # 'email_verification', 'password_reset'
    expires_at = Column(DateTime(timezone=True), nullable=False)
    is_used = Column(Boolean, default=False)
    created_at = Column(DateTime(timezone=True), server_default=func.now())

    # Relationships
    user = relationship("User", back_populates="verification_tokens")