import uuid
from datetime import datetime

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

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


class PublicDataSource(UUIDPKMixin, TenantScopedMixin, Base):
    """Signed-out read access to one datasource's records or one form's
    submissions — the public website's data blocks (app/crud/public_data.py).
    Only `fields` are ever shown, only rows matching `filters` are ever read."""

    __tablename__ = "public_data_sources"

    source_type: Mapped[str] = mapped_column(String(10), nullable=False)
    source_id: Mapped[uuid.UUID] = mapped_column(PGUUID(as_uuid=True), nullable=False)
    enabled: Mapped[bool] = mapped_column(Boolean, nullable=False, server_default="false")
    fields: Mapped[list] = mapped_column(JSONB, nullable=False, server_default="[]")
    filters: Mapped[list] = mapped_column(JSONB, nullable=False, server_default="[]")
    allow_search: Mapped[bool] = mapped_column(Boolean, nullable=False, server_default="true")
    created_at: Mapped[datetime] = mapped_column(TIMESTAMP(timezone=True), server_default=text("now()"))
    updated_at: Mapped[datetime] = mapped_column(TIMESTAMP(timezone=True), server_default=text("now()"))
    updated_by: Mapped[uuid.UUID | None] = mapped_column(PGUUID(as_uuid=True), ForeignKey("users.id", ondelete="SET NULL"))
