"""ORM model for artists."""

from sqlalchemy import String, UniqueConstraint
from sqlalchemy.orm import Mapped, mapped_column

from app.infrastructure.db.base import Base
from app.infrastructure.db.models.mixins import TimestampMixin, UUIDPrimaryKeyMixin


class ArtistModel(UUIDPrimaryKeyMixin, TimestampMixin, Base):
    __tablename__ = "artists"
    __table_args__ = (
        # Binds a remote (browsable) artist to its local row for re-browse/save
        # dedup. Multiple NULLs are allowed by Postgres, so locally-created
        # artists (source/source_id both NULL) never collide on this.
        UniqueConstraint("source", "source_id", name="uq_artists_source_source_id"),
    )

    name: Mapped[str] = mapped_column(String(512), index=True, nullable=False)
    musicbrainz_id: Mapped[str | None] = mapped_column(String(36), index=True, nullable=True)

    # -- remote identity (lazy materialization) --------------------------
    source: Mapped[str | None] = mapped_column(String(32), nullable=True)
    source_id: Mapped[str | None] = mapped_column(String(512), nullable=True)
