# app/modules/loyalty/models/apple_device.py
"""
Apple device registration database model.

Tracks devices that have added an Apple Wallet pass for push
notification updates when the pass changes.
"""

from sqlalchemy import (
    Column,
    ForeignKey,
    Index,
    Integer,
    String,
)
from sqlalchemy.orm import relationship

from app.core.database import Base
from models.database.base import TimestampMixin


class AppleDeviceRegistration(Base, TimestampMixin):
    """
    Apple Wallet device registration.

    When a user adds a pass to Apple Wallet, the device registers
    with us to receive push notifications when the pass updates.

    This implements the Apple Wallet Web Service for passbook updates:
    https://developer.apple.com/documentation/walletpasses/
    """

    __tablename__ = "apple_device_registrations"

    id = Column(Integer, primary_key=True, index=True)

    # Card relationship
    card_id = Column(
        Integer,
        ForeignKey("loyalty_cards.id", ondelete="CASCADE"),
        nullable=False,
        index=True,
    )

    # Device identification
    device_library_identifier = Column(
        String(100),
        nullable=False,
        index=True,
        comment="Unique identifier for the device/library",
    )

    # Push notification token
    push_token = Column(
        String(100),
        nullable=False,
        comment="APNs push token for this device",
    )

    # =========================================================================
    # Relationships
    # =========================================================================
    card = relationship("LoyaltyCard", back_populates="apple_devices")

    # Indexes - unique constraint on device + card combination
    __table_args__ = (
        Index(
            "idx_apple_device_card",
            "device_library_identifier",
            "card_id",
            unique=True,
        ),
    )

    def __repr__(self) -> str:
        return (
            f"<AppleDeviceRegistration(id={self.id}, "
            f"device='{self.device_library_identifier[:8]}...', card_id={self.card_id})>"
        )
