"""Players — the humans (and seed-only bots) on the courts.

No password/session table: identity comes from BW Auth (Pattern B). A player
maps 1:1 to a BW username where one exists; seed-only sub-team members
(Zeina/Rahman/Stevan) exist without BW accounts so sub-court rallies render.
"""
import datetime

from sqlalchemy import String, text
from sqlalchemy.dialects.postgresql import JSONB
from sqlalchemy.orm import Mapped, mapped_column

from .base import Base, created_at, uuid_pk


class Player(Base):
    __tablename__ = "players"

    id: Mapped[str] = uuid_pk()
    username: Mapped[str] = mapped_column(String, unique=True, nullable=False)
    email: Mapped[str | None] = mapped_column(String)
    display_name: Mapped[str | None] = mapped_column(String)
    # Deterministic avatar tint; one color language, assigned once.
    avatar_color: Mapped[str | None] = mapped_column(String)
    sound_settings: Mapped[dict] = mapped_column(
        JSONB, nullable=False, server_default=text("'{}'::jsonb")
    )
    created_at: Mapped[datetime.datetime] = created_at()
