from datetime import datetime

from sqlalchemy import DateTime, ForeignKey, String, UniqueConstraint
from sqlalchemy.orm import Mapped, mapped_column, relationship

from app.db.base import Base, TimestampMixin
from app.db.types import str_enum
from app.models.enums import PushPlatform


class DevicePushToken(Base, TimestampMixin):
    __tablename__ = "device_push_tokens"
    __table_args__ = (UniqueConstraint("user_id", "token", name="uq_device_push_token"),)

    id: Mapped[int] = mapped_column(primary_key=True, autoincrement=True)
    user_id: Mapped[int] = mapped_column(ForeignKey("users.id"), nullable=False, index=True)
    platform: Mapped[PushPlatform] = mapped_column(str_enum(PushPlatform), nullable=False)
    token: Mapped[str] = mapped_column(String(512), nullable=False)
    device_name: Mapped[str | None] = mapped_column(String(255))
    last_used_at: Mapped[datetime | None] = mapped_column(DateTime(timezone=True))

    user: Mapped["User"] = relationship(back_populates="device_push_tokens")


from app.models.user import User  # noqa: E402
