from datetime import datetime
from models.EducoinsTopup import EducoinsTopup
from models.Coupon import Coupon
from mongoengine import Document, ReferenceField, IntField, StringField, DateTimeField


class PaymentOrder(Document):
    user_id = StringField(required=True)
    topup = ReferenceField(EducoinsTopup, required=True)
    coupon = ReferenceField(Coupon, required=False, null=True)

    subtotal = IntField(required=True, min_value=1)
    discount = IntField(required=True, min_value=0)
    amount= IntField(required=True, min_value=1)

    razorpay_order_id = StringField(required=True, unique=True)
    
    status = StringField(default="created", choices=["created", "paid", "failed", "cancelled"])
    receipt = StringField()

    created_at = DateTimeField(default=datetime.utcnow)

    meta = {
        'collection': 'payment_orders',
        'indexes': ['razorpay_order_id', 'status', 'created_at']
    }

    def to_json(self):
        return {
            "id": str(self.id),
            "user_id": self.user_id,
            "topup": str(self.topup.id),
            "coupon": str(self.coupon.id) if self.coupon else None,
            "subtotal": self.subtotal,
            "discount": self.discount,
            "amount": self.amount,
            "status": self.status,
            "razorpay_order_id": self.razorpay_order_id,
            "receipt": self.receipt,
            "created_at": self.created_at.isoformat() if self.created_at else None
        }