import uuid

from sqlalchemy import Column, String
from sqlalchemy.ext.declarative import declared_attr


def new_public_id() -> str:
    return str(uuid.uuid4())


class PublicIdMixin:
    """Identifiant opaque pour les URLs (clé interne numérique inchangée)."""

    @declared_attr
    def public_id(cls):
        return Column(
            String(36),
            unique=True,
            nullable=False,
            default=new_public_id,
            index=True,
        )
