import razorpay
from django.conf import settings
from django.contrib.auth.mixins import LoginRequiredMixin
from django.shortcuts import render
from django.views import View
from django.db.models import Q

from payments.models import PaymentTransaction  # adjust if different app path

class PaymentInspectView(LoginRequiredMixin, View):
    """
    Simple page to look up a payment by VP order_id or Razorpay order id.
    GET  -> form
    POST -> perform lookup and display local + Razorpay info
    """
    template_name = "payments/payment_inspect.html"

    def get(self, request):
        return render(request, self.template_name, {"q": "", "result": None, "error": None})

    def post(self, request):
        q = (request.POST.get("q") or "").strip()
        context = {"q": q, "result": None, "error": None}

        if not q:
            context["error"] = "Please enter an order_id or a razorpay_order_id."
            return render(request, self.template_name, context)

        # Heuristics: Razorpay order ids usually start with "order_"
        looks_like_rzp_order = q.startswith("order_")

        # 1) Find local PaymentTransaction
        tx = (PaymentTransaction.objects
              .filter(Q(order_id=q) | Q(razorpay_order_id=q))
              .order_by("-created_at")  # newest match first if multiple
              .first())

        # 2) Prepare Razorpay client
        client = razorpay.Client(auth=(settings.RAZORPAY_API_KEY, settings.RAZORPAY_API_SECRET))

        rzp_order_id = None
        rzp_order = None
        rzp_payments = []
        rzp_error = None

        try:
            if looks_like_rzp_order:
                rzp_order_id = q
            elif tx and tx.razorpay_order_id:
                rzp_order_id = tx.razorpay_order_id

            # 3) Fetch Razorpay order and its payments (if we have rzp_order_id)
            if rzp_order_id:
                rzp_order = client.order.fetch(rzp_order_id)  # may raise if not found
                # payments associated with this order
                rzp_payments = client.order.payments(rzp_order_id).get("items", [])
                # show latest first
                rzp_payments = sorted(rzp_payments, key=lambda p: p.get("created_at", 0), reverse=True)

        except razorpay.errors.BadRequestError as e:
            rzp_error = f"Razorpay BadRequestError: {e}"
        except Exception as e:
            rzp_error = f"Razorpay error: {e}"

        context["result"] = {
            "local_tx": tx,
            "rzp_order_id": rzp_order_id,
            "rzp_order": rzp_order,
            "rzp_payments": rzp_payments,
            "rzp_error": rzp_error,
        }
        return render(request, self.template_name, context)


