import uuid

from sqlalchemy import ForeignKey, Integer, 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 DataQuery(UUIDPKMixin, TenantScopedMixin, TimestampMixin, Base):
    """A REST call or read-only SQL statement used as a data source — see
    app/crud/data_queries.py and db/schema.sql."""

    __tablename__ = "data_queries"

    name: Mapped[str] = mapped_column(String(200), nullable=False)
    description: Mapped[str | None] = mapped_column(String(500))
    kind: Mapped[str] = mapped_column(String(10), nullable=False)
    connector_id: Mapped[uuid.UUID | None] = mapped_column(PGUUID(as_uuid=True), ForeignKey("connectors.id", ondelete="SET NULL"))
    definition: Mapped[dict] = mapped_column(JSONB, nullable=False, server_default="{}")
    parameters: Mapped[list] = mapped_column(JSONB, nullable=False, server_default="[]")
    columns: Mapped[list] = mapped_column(JSONB, nullable=False, server_default="[]")
    cache_seconds: Mapped[int] = mapped_column(Integer, nullable=False, server_default="60")
    role_ids: Mapped[list] = mapped_column(JSONB, nullable=False, server_default="[]")
    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"))
