"""
topup_order.py — Model untuk mencatat order top-up saldo via Midtrans.

Lifecycle status:
  pending  → dibuat, menunggu user membayar di Snap popup
  paid     → notifikasi Midtrans diterima & diverifikasi, saldo sudah ditambah
  failed   → pembayaran gagal/ditolak
  expired  → user tidak bayar sebelum batas waktu (1 jam default Midtrans)
  refunded → (opsional) refund manual oleh admin
"""

from sqlalchemy import Column, Integer, String, DateTime, ForeignKey
from datetime import datetime, timezone

from app.core.database import Base


def _utcnow():
    return datetime.now(timezone.utc)


class TopupOrder(Base):
    __tablename__ = "topup_orders"

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

    # ID unik yang dikirim ke Midtrans: "TOPUP-{user_id}-{timestamp}-{random}"
    order_id    = Column(String, unique=True, nullable=False, index=True)

    user_id     = Column(
        Integer,
        ForeignKey("users.id", ondelete="CASCADE"),
        nullable=False,
        index=True,
    )

    # Jumlah yang dibayar (dalam Rupiah, integer)
    amount      = Column(Integer, nullable=False)

    # Status order
    status      = Column(String, default="pending", nullable=False)
    # pending | paid | failed | expired | refunded

    # Token dari Midtrans Snap — dipakai frontend untuk membuka popup
    snap_token  = Column(String, nullable=True)

    # Data tambahan dari notifikasi Midtrans (opsional, untuk audit)
    payment_type      = Column(String, nullable=True)   # gopay, bank_transfer, dll.
    transaction_id    = Column(String, nullable=True)   # ID transaksi Midtrans
    fraud_status      = Column(String, nullable=True)   # accept | challenge | deny

    created_at  = Column(DateTime(timezone=True), default=_utcnow)
    updated_at  = Column(DateTime(timezone=True), default=_utcnow, onupdate=_utcnow)