"""Reusable SQLAlchemy column mixins.

These mixins keep common columns (public identifiers and timestamps) consistent
across models while allowing each table to opt in only to the columns its
approved schema actually defines.
"""

from __future__ import annotations

import uuid

from app.extensions import db
from app.models.base import utcnow


class PublicIdMixin:
    """Adds a UUID ``public_id`` used in URLs and APIs.

    The public identifier is generated on insert and never changes, hiding the
    internal primary key from clients.
    """

    public_id = db.Column(
        db.CHAR(36),
        nullable=False,
        unique=True,
        default=lambda: str(uuid.uuid4()),
    )


class TimestampMixin:
    """Adds ``created_at`` and ``updated_at`` UTC timestamps."""

    created_at = db.Column(db.DateTime, nullable=False, default=utcnow)
    updated_at = db.Column(
        db.DateTime, nullable=False, default=utcnow, onupdate=utcnow
    )


class CreatedAtMixin:
    """Adds only a ``created_at`` UTC timestamp.

    Used by tables (such as token tables) that the schema does not give an
    ``updated_at`` column.
    """

    created_at = db.Column(db.DateTime, nullable=False, default=utcnow)
