from sqlalchemy import Column, Integer, Boolean, DateTime, ForeignKey, Text, Table
from sqlalchemy.orm import relationship, Mapped, mapped_column
from sqlalchemy.sql import func
from typing import Optional, List
from src.apps.base.models.base import Base

roles_permissions_map = Table(
    "roles_permissions",
    Base.metadata,
    Column("role_id", ForeignKey("roles.id", onupdate="CASCADE", ondelete="CASCADE")),
    Column(
        "permission_id",
        ForeignKey("permissions.id", onupdate="CASCADE", ondelete="CASCADE"),
    ),
)


class Role(Base):
    """
    Role Model: ORM class for Role Entity
    """

    __tablename__ = "roles"

    id: Mapped[int] = mapped_column(Integer, primary_key=True, index=True, autoincrement=True)
    label: Mapped[Optional[str]] = mapped_column(Text)
    slug: Mapped[Optional[str]] = mapped_column(Text)
    is_default: Mapped[bool] = mapped_column(Boolean, default=False)
    created_at: Mapped[DateTime] = mapped_column(DateTime, server_default=func.now())

    permissions: Mapped[List["Permission"]] = relationship("Permission", secondary=roles_permissions_map)

    merchant_id: Mapped[Optional[int]] = mapped_column(Integer, ForeignKey("merchants.id"), nullable=True)
    merchant: Mapped[Optional["Merchant"]] = relationship("Merchant", foreign_keys=[merchant_id], uselist=False)

    customer_id: Mapped[Optional[int]] = mapped_column(Integer, ForeignKey("customers.id"), nullable=True)
    customer: Mapped[Optional["Customer"]] = relationship("Customer", foreign_keys=[customer_id], uselist=False)

    created_by_id: Mapped[int] = mapped_column(Integer, ForeignKey("users.id"))
    created_by: Mapped["User"] = relationship("User", foreign_keys=[created_by_id], uselist=False)
