"""Reusable mapped-column mixins for ORM models."""

import datetime as dt
import uuid

from sqlalchemy import DateTime, func
from sqlalchemy.orm import Mapped, mapped_column


class UUIDPrimaryKeyMixin:
    """``id`` UUID primary key, generated application-side.

    Generating in Python (not a DB default) keeps ids available before flush —
    important because ``track.id`` is the client-facing ``content_id``.
    """

    id: Mapped[uuid.UUID] = mapped_column(primary_key=True, default=uuid.uuid4)


class TimestampMixin:
    """``created_at`` / ``updated_at``, server-managed.

    Present on every user-mutable entity for future delta-sync (plan §4).
    """

    created_at: Mapped[dt.datetime] = mapped_column(
        DateTime(timezone=True),
        server_default=func.now(),
        nullable=False,
    )
    updated_at: Mapped[dt.datetime] = mapped_column(
        DateTime(timezone=True),
        server_default=func.now(),
        onupdate=func.now(),
        nullable=False,
    )
