from datetime import datetime
from sqlalchemy import Integer, Boolean, DateTime, ForeignKey, UniqueConstraint
from sqlalchemy.orm import Mapped, mapped_column, relationship
from sqlalchemy.sql import func
from src.apps.base.models.base import Base


class UserRole(Base):
    """
    UserRole Model: Maps a user to a role within a merchant context.
    Enforces one role per user per merchant via unique constraint.
    """

    __tablename__ = "user_roles"
    __table_args__ = (UniqueConstraint("user_id", "merchant_id", name="uq_user_role_per_merchant"),)

    id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
    user_id: Mapped[int] = mapped_column(Integer, ForeignKey("users.id"), nullable=False, index=True)
    role_id: Mapped[int] = mapped_column(Integer, ForeignKey("roles.id"), nullable=False)
    merchant_id: Mapped[int] = mapped_column(Integer, ForeignKey("merchants.id"), nullable=False, index=True)
    is_primary: Mapped[bool] = mapped_column(Boolean, default=True, nullable=False)
    created_at: Mapped[datetime] = mapped_column(DateTime, server_default=func.now())

    user: Mapped["User"] = relationship("User", foreign_keys=[user_id], uselist=False)
    role: Mapped["Role"] = relationship("Role", foreign_keys=[role_id], uselist=False, lazy="joined")
