from __future__ import annotations

from datetime import datetime
from typing import Optional

from sqlalchemy import DateTime, ForeignKey, Integer, UniqueConstraint
from sqlalchemy.orm import Mapped, mapped_column, relationship
from sqlalchemy.sql import func

from src.apps.base.models.base import Base


class AgentMerchantAssignment(Base):
    __tablename__ = "agent_merchant_assignments"

    id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
    agent_user_id: Mapped[int] = mapped_column(
        Integer, ForeignKey("users.id", ondelete="CASCADE"),
        nullable=False, index=True,
    )
    merchant_id: Mapped[int] = mapped_column(
        Integer, ForeignKey("merchants.id", ondelete="CASCADE"),
        nullable=False, index=True,
    )
    assigned_by_id: Mapped[int] = mapped_column(
        Integer, ForeignKey("users.id"), nullable=False
    )
    created_at: Mapped[datetime] = mapped_column(
        DateTime(timezone=True), server_default=func.now()
    )
    deleted_at: Mapped[Optional[datetime]] = mapped_column(
        DateTime(timezone=True), nullable=True
    )

    __table_args__ = (
        UniqueConstraint("agent_user_id", "merchant_id", name="uq_agent_merchant"),
    )

    agent: Mapped["User"] = relationship(  # type: ignore[name-defined]
        "User", foreign_keys=[agent_user_id], uselist=False
    )
    merchant: Mapped["Merchant"] = relationship(  # type: ignore[name-defined]
        "Merchant", foreign_keys=[merchant_id], uselist=False
    )
    assigned_by: Mapped["User"] = relationship(  # type: ignore[name-defined]
        "User", foreign_keys=[assigned_by_id], uselist=False
    )
