"""
User Model - Admin and Client Users
"""
from sqlalchemy import Column, String, Boolean, Integer, ForeignKey, Enum as SQLEnum, DateTime
from sqlalchemy.orm import relationship
from enum import Enum

from app.models.base import BaseModel


class UserRole(str, Enum):
    SUPER_ADMIN = "super_admin"      # Full platform access
    ADMIN = "admin"                   # Admin portal access
    SUPPORT = "support"               # Support team
    CLIENT_OWNER = "client_owner"     # Client account owner
    CLIENT_ADMIN = "client_admin"     # Client admin
    CLIENT_USER = "client_user"       # Regular client user


class User(BaseModel):
    """
    User model for both admin and client users
    """
    __tablename__ = "users"

    # Basic Info
    email = Column(String(255), unique=True, index=True, nullable=False)
    password_hash = Column(String(255), nullable=False)
    name = Column(String(255), nullable=False)
    phone = Column(String(50), nullable=True)
    avatar_url = Column(String(500), nullable=True)

    # Role & Permissions
    role = Column(SQLEnum(UserRole), default=UserRole.CLIENT_USER, nullable=False)
    # role = Column(SQLEnum(UserRole,values_callable=lambda enum_cls: [member.value for member in enum_cls]), default=UserRole.CLIENT_USER,nullable=False)

    # Client association (null for admin users)
    client_id = Column(Integer, ForeignKey("clients.id", ondelete="CASCADE"), nullable=True, index=True)

    # Status
    is_active = Column(Boolean, default=True, nullable=False)
    is_verified = Column(Boolean, default=False, nullable=False)
    email_verified = Column(Boolean, default=False, nullable=False)

    # OAuth
    oauth_provider = Column(String(50), nullable=True)  # google, github
    oauth_id = Column(String(255), nullable=True)

    # Security
    failed_login_attempts = Column(Integer, default=0)
    last_login_at = Column(DateTime, nullable=True)
    last_login_ip = Column(String(50), nullable=True)

    # 2FA
    two_factor_enabled = Column(Boolean, default=False)
    two_factor_secret = Column(String(255), nullable=True)

    # Relationships
    client = relationship("Client", back_populates="users")
    api_keys = relationship("ApiKey", back_populates="user", cascade="all, delete-orphan")
    audit_logs = relationship("AuditLog", back_populates="user", cascade="all, delete-orphan")

    def __repr__(self):
        return f"<User {self.email}>"

    @property
    def is_admin(self) -> bool:
        return self.role in [UserRole.SUPER_ADMIN, UserRole.ADMIN, UserRole.SUPPORT]

    @property
    def is_client(self) -> bool:
        return self.role in [UserRole.CLIENT_OWNER, UserRole.CLIENT_ADMIN, UserRole.CLIENT_USER]
