"""Contratación (pedido) de un cliente a un músico: express o programado."""
from datetime import datetime, timezone

from geoalchemy2 import Geography
from sqlalchemy import DateTime, Float, ForeignKey, String, Text
from sqlalchemy.orm import Mapped, mapped_column

from app.core.database import Base


def _now() -> datetime:
    return datetime.now(timezone.utc)


class Booking(Base):
    __tablename__ = "bookings"

    id: Mapped[int] = mapped_column(primary_key=True)
    client_id: Mapped[int] = mapped_column(ForeignKey("users.id", ondelete="CASCADE"), index=True)
    musician_id: Mapped[int] = mapped_column(
        ForeignKey("musician_profiles.id", ondelete="CASCADE"), index=True
    )

    service_type: Mapped[str] = mapped_column(String(40), nullable=False)  # slug del catálogo

    # express (ahora) | scheduled (fecha futura)
    mode: Mapped[str] = mapped_column(String(20), default="express", nullable=False)
    scheduled_at: Mapped[datetime | None] = mapped_column(DateTime(timezone=True))

    # pending | accepted | rejected | completed | cancelled
    status: Mapped[str] = mapped_column(String(20), default="pending", nullable=False, index=True)

    # Dónde se realiza el servicio
    location: Mapped[object | None] = mapped_column(Geography(geometry_type="POINT", srid=4326))
    address: Mapped[str | None] = mapped_column(String(255))
    notes: Mapped[str | None] = mapped_column(Text)

    price: Mapped[float | None] = mapped_column(Float)
    currency: Mapped[str] = mapped_column(String(3), default="USD")

    created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), default=_now)
