"""组成员关系表模型"""

import datetime

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

from backend.core.database import Base

# 角色的可选值
GROUP_ROLE_VALUES = ("member", "admin", "owner")


class GroupMember(Base):
    """组成员关系表

    维护组账号和成员的多对多关系。
    应用层保证:group_id 指向 GROUP_CAPABLE_TYPES 中的用户类型,member_id 指向 users 表中任意用户。
    """
    __tablename__ = "group_members"

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

    # 关联 users 表
    group_id: Mapped[int] = mapped_column(
        sa.Integer, sa.ForeignKey("users.id", ondelete="CASCADE"), nullable=False,
    )
    member_id: Mapped[int] = mapped_column(
        sa.Integer, sa.ForeignKey("users.id", ondelete="CASCADE"), nullable=False,
    )

    # 角色:member / reviewer
    role: Mapped[str] = mapped_column(sa.String(16), default="member")

    # 时间字段
    joined_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.UniqueConstraint("group_id", "member_id", name="uk_group_member"),
        sa.Index("idx_gm_member_id", "member_id"),
    )

    def __repr__(self) -> str:
        return (
            f"<GroupMember(id={self.id}, group_id={self.group_id}, "
            f"member_id={self.member_id}, role={self.role})>"
        )