import uuid

from sqlalchemy import ForeignKey, String
from sqlalchemy.dialects.postgresql import JSONB, UUID as PGUUID
from sqlalchemy.orm import Mapped, mapped_column

from app.models.base import Base, TenantScopedMixin, TimestampMixin, UUIDPKMixin


class ReportTemplate(UUIDPKMixin, TenantScopedMixin, TimestampMixin, Base):
    """A saved multi-source report — see app/crud/report_builder.py and db/schema.sql."""

    __tablename__ = "report_templates"

    name: Mapped[str] = mapped_column(String(200), nullable=False)
    description: Mapped[str | None] = mapped_column(String(500))
    parameters: Mapped[list] = mapped_column(JSONB, nullable=False, server_default="[]")
    sections: Mapped[list] = mapped_column(JSONB, nullable=False, server_default="[]")
    settings: Mapped[dict] = mapped_column(JSONB, nullable=False, server_default="{}")
    role_ids: Mapped[list] = mapped_column(JSONB, nullable=False, server_default="[]")
    # A Portal user's own report — see db/schema.sql.
    vendor_id: Mapped[uuid.UUID | None] = mapped_column(PGUUID(as_uuid=True), ForeignKey("vendors.id", ondelete="CASCADE"))
    created_by: Mapped[uuid.UUID | None] = mapped_column(PGUUID(as_uuid=True), ForeignKey("users.id", ondelete="SET NULL"))
    updated_by: Mapped[uuid.UUID | None] = mapped_column(PGUUID(as_uuid=True), ForeignKey("users.id", ondelete="SET NULL"))
