# backend/app/plugins/advanced_stats/models.py
from sqlalchemy import JSON, BigInteger, ForeignKey, Index, String, UniqueConstraint
from sqlalchemy.orm import Mapped, mapped_column

from app.core.models.base import Base, TenantMixin, TimestampMixin


class AdvReportPreset(Base, TenantMixin, TimestampMixin):
    """预设报表：把一组筛选条件存成命名快照，下次一键加载。"""

    __tablename__ = "adv_report_presets"
    __table_args__ = (
        UniqueConstraint("tenant_id", "user_id", "title", name="uk_adv_preset_tenant_user_title"),
        Index("ix_adv_preset_tenant_user", "tenant_id", "user_id"),
        {
            "mysql_engine": "InnoDB",
            "mysql_charset": "utf8mb4",
            "mysql_collate": "utf8mb4_unicode_ci",
        },
    )

    id: Mapped[int] = mapped_column(BigInteger, primary_key=True, autoincrement=True)
    user_id: Mapped[int] = mapped_column(
        BigInteger, ForeignKey("users.id", ondelete="CASCADE"), nullable=False,
        comment="预设归属人，各自看各自的",
    )
    title: Mapped[str] = mapped_column(String(100), nullable=False)
    query: Mapped[dict] = mapped_column(JSON, nullable=False, comment="ReportQuery 的字段快照")
