from django.shortcuts import render
from django.http import JsonResponse, HttpResponseBadRequest
from django.views.decorators.csrf import csrf_exempt
import json, logging
from datetime import datetime
from .models import MpesaTransaction 
from .utils import MpesaGateWay  


def home(request):
    # Fetch all transactions, newest first
    transactions = MpesaTransaction.objects.all().order_by('-transaction_date')
    
    return render(request, 'home.html', {'transactions': transactions})

def initiate_payment(request):
    if request.method == "POST":
        phone_number = request.POST.get("phone")
        amount = request.POST.get("amount")

        # Initialize your gateway
        gateway = MpesaGateWay()

        try:
            # Trigger the STK Push
            response = gateway.initiate_stk_push(
                phone_number=phone_number,
                amount=amount,
                account_reference="Order_123",
                transaction_desc="Web Payment",
            )
            return JsonResponse(response)
        except Exception as e:
            return JsonResponse({"error": str(e)}, status=400)

    # For GET requests, show the payment form
    return render(request, "pay.html")



@csrf_exempt
def mpesa_callback(request):
    if request.method == "POST":
        try:
            data = json.loads(request.body)
            stk_callback = data["Body"]["stkCallback"]
            
            res_code = stk_callback["ResultCode"]
            res_desc = stk_callback["ResultDesc"]
            merchant_id = stk_callback["MerchantRequestID"]
            checkout_id = stk_callback["CheckoutRequestID"]

            amount = receipt = phone = None

            # Only attempt to get metadata if it exists
            if res_code == 0 and "CallbackMetadata" in stk_callback:
                metadata = stk_callback["CallbackMetadata"]["Item"]
                for item in metadata:
                    name = item.get("Name")
                    value = item.get("Value")
                    if name == "Amount": amount = value
                    elif name == "MpesaReceiptNumber": receipt = value
                    elif name == "PhoneNumber": phone = value
                    elif name == "TransactionDate":transaction_date = datetime.strptime(str(value), "%Y%m%d%H%M%S")

            # Save the result (Successful OR Failed)
            MpesaTransaction.objects.create(
                merchant_request_id=merchant_id,
                checkout_request_id=checkout_id,
                result_code=res_code,
                result_description=res_desc,
                amount=amount,
                mpesa_receipt_number=receipt,
                phone_number=phone,
                transaction_date=transaction_date,
            )
            return JsonResponse({"ResultCode": 0, "ResultDesc": "Success"})
            
        except Exception as e:
            # This will log errors to your cPanel error logs
            print(f"Callback Error: {str(e)}")
            return JsonResponse({"ResultCode": 1, "ResultDesc": "Internal Error"}, status=500)

    return HttpResponseBadRequest()