"""BaseModel —— 所有业务模型的抽象基类。

自动提供三个公共时间字段：
- created_at：INSERT 时由数据库写入当前时间
- updated_at：INSERT 和 UPDATE 时自动更新
- deleted_at：默认 NULL，非 NULL 表示已软删除
"""

from __future__ import annotations

from datetime import datetime

from sqlalchemy import DateTime, func
from sqlalchemy.orm import Mapped, mapped_column

from fastapi_common.fastapi_common_sqlalchemy.base import Base


class BaseModel(Base):
    """所有业务模型的抽象基类。"""

    __abstract__ = True

    created_at: Mapped[datetime] = mapped_column(
        "created_at", DateTime(timezone=True), server_default=func.now(), comment="创建时间"
    )
    updated_at: Mapped[datetime] = mapped_column(
        "updated_at", DateTime(timezone=True), server_default=func.now(), onupdate=func.now(), comment="更新时间"
    )
    deleted_at: Mapped[datetime | None] = mapped_column(
        "deleted_at", DateTime(timezone=True), default=None, comment="软删除时间"
    )
