"""用户表模型"""

import datetime
from typing import Optional

import sqlalchemy as sa
from sqlalchemy import func
from sqlalchemy.orm import Mapped, mapped_column

from backend.core.database import Base

# 用户类型的可选值
USER_TYPE_VALUES = ("member", "group_account", "notifier")

# 可以作为组(拥有成员)的用户类型
GROUP_CAPABLE_TYPES = ("group_account", "notifier")


class User(Base):
    """用户表

    三种用户类型:
    - member:个人成员(如 zhangsan, lisi)
    - group_account:组账号(如 arkui_image, arkui_components)
    - notifier:通知账号(用于发送评论等系统通知,也可拥有成员)
    """
    __tablename__ = "users"

    id: Mapped[int] = mapped_column(sa.Integer, primary_key=True, autoincrement=True)

    # 基本信息
    user_name: Mapped[str] = mapped_column(sa.String(128), nullable=False, unique=True)
    display_name: Mapped[Optional[str]] = mapped_column(sa.String(128), nullable=True)
    description: Mapped[Optional[str]] = mapped_column(sa.Text, nullable=True)

    # 用户类型:member / group_account / notifier
    type: Mapped[str] = mapped_column(sa.String(16), nullable=False)

    # 状态
    is_active: Mapped[bool] = mapped_column(sa.Boolean, default=True)

    # API 凭证
    access_token: Mapped[Optional[str]] = mapped_column(sa.String(256), nullable=True)

    # 时间字段
    created_at: Mapped[datetime.datetime] = mapped_column(sa.DateTime, nullable=False, server_default=func.now())
    updated_at: Mapped[datetime.datetime] = mapped_column(
        sa.DateTime, nullable=False, server_default=func.now(), onupdate=func.now(),
    )

    __table_args__ = (
        sa.Index("idx_user_type", "type"),
        sa.Index("idx_user_active", "is_active"),
    )

    def __repr__(self) -> str:
        return f"<User(id={self.id}, user_name={self.user_name}, type={self.type})>"