"""
基础模型定义
============
"""

import uuid
from datetime import UTC, datetime

from sqlalchemy import BigInteger, DateTime
from sqlalchemy.dialects.postgresql import UUID
from sqlalchemy.orm import Mapped, mapped_column

from app.db.session import Base


class BaseModel(Base):
    """
    基础模型 - UUID 主键

    适用于需要暴露给外部、跨系统的表（如用户表）。
    提供 UUID 主键 + 创建时间 + 更新时间。
    """

    __abstract__ = True

    id: Mapped[uuid.UUID] = mapped_column(
        UUID(as_uuid=True),
        primary_key=True,
        default=uuid.uuid4,
    )

    created_at: Mapped[datetime] = mapped_column(
        DateTime(timezone=True),
        default=lambda: datetime.now(UTC),
        nullable=False,
    )

    updated_at: Mapped[datetime] = mapped_column(
        DateTime(timezone=True),
        default=lambda: datetime.now(UTC),
        onupdate=lambda: datetime.now(UTC),
        nullable=False,
    )

    def to_dict(self) -> dict:
        """转换为字典（用于序列化）"""
        return {column.name: getattr(self, column.name) for column in self.__table__.columns}


class BaseModelBigInt(Base):
    """
    基础模型 - BigInt 自增主键

    适用于内部表、数据量大的表（如积分流水、设备记录）。
    提供 BigInt 自增主键 + 创建时间 + 更新时间。
    """

    __abstract__ = True

    id: Mapped[int] = mapped_column(
        BigInteger,
        primary_key=True,
        autoincrement=True,
    )

    created_at: Mapped[datetime] = mapped_column(
        DateTime(timezone=True),
        default=lambda: datetime.now(UTC),
        nullable=False,
    )

    updated_at: Mapped[datetime] = mapped_column(
        DateTime(timezone=True),
        default=lambda: datetime.now(UTC),
        onupdate=lambda: datetime.now(UTC),
        nullable=False,
    )

    def to_dict(self) -> dict:
        """转换为字典（用于序列化）"""
        return {column.name: getattr(self, column.name) for column in self.__table__.columns}
