from sqlalchemy import BigInteger, String, JSON, UniqueConstraint, Index
from sqlalchemy.dialects.mysql import DATETIME as MYSQL_DATETIME, TINYINT
from sqlalchemy.orm import Mapped, mapped_column, relationship
from app.core.models.base import Base, TimestampMixin, TenantMixin


class User(Base, TenantMixin, TimestampMixin):
    """后台用户 / 员工（非买家）"""

    __tablename__ = "users"
    __table_args__ = (
        UniqueConstraint("tenant_id", "email", name="uk_users_tenant_email"),
        Index("ix_users_role", "role"),
        {
            "mysql_engine": "InnoDB",
            "mysql_charset": "utf8mb4",
            "mysql_collate": "utf8mb4_unicode_ci",
        },
    )

    id: Mapped[int] = mapped_column(BigInteger, primary_key=True, autoincrement=True)
    email: Mapped[str] = mapped_column(String(255), nullable=False, comment="登录邮箱")
    password_hash: Mapped[str] = mapped_column(String(255), nullable=False, comment="密码哈希（bcrypt）")
    role: Mapped[str] = mapped_column(String(30), nullable=False, default="staff", comment="角色：owner/admin/staff")
    is_active: Mapped[int] = mapped_column(TINYINT(1), nullable=False, default=1, comment="账号状态")
    is_superadmin: Mapped[int] = mapped_column(TINYINT(1), nullable=False, default=0, comment="平台超管标记")
    profile: Mapped[dict | None] = mapped_column(JSON, nullable=True, comment="姓名、头像、偏好设置")
    last_login_at: Mapped[MYSQL_DATETIME | None] = mapped_column(MYSQL_DATETIME(fsp=3), nullable=True)

    # ── 关联 ─────────────────────────────────────────────────────
    tenant = relationship("Tenant", back_populates="users", lazy="noload")
    admin_roles = relationship("AdminUserRole", back_populates="user", cascade="all, delete-orphan", lazy="noload")
    permission_overrides = relationship(
        "AdminUserPermissionOverride",
        back_populates="user",
        cascade="all, delete-orphan",
        foreign_keys="AdminUserPermissionOverride.user_id",
        lazy="noload",
    )

    def __repr__(self) -> str:
        return f"<User id={self.id} email={self.email!r} role={self.role!r}>"
