# payments/views.py
from django.contrib.auth.decorators import login_required
from django.shortcuts import render, redirect
from django.http import JsonResponse
from .forms import DarajaAPIConfigurationForm, PaymentForm
import requests
from requests.auth import HTTPBasicAuth
from django.utils import timezone
import base64
import datetime


@login_required(login_url='/auth/login/')
def configure_daraja_api(request):
    if request.method == 'POST':
        form = DarajaAPIConfigurationForm(request.POST)
        if form.is_valid():
            form.save()
            return redirect('configure_daraja_api')
    else:
        form = DarajaAPIConfigurationForm()
    return render(request, 'payments/configure_daraja_api.html', {'form': form})


@login_required(login_url='/auth/login/')
def initiate_payment(request):
    if request.method == 'POST':
        form = PaymentForm(request.POST)
        if form.is_valid():
            payment = form.save(commit=False)
            payment.status = 'pending'
            payment.save()

            daraja_config = DarajaAPIConfiguration.objects.first()
            if daraja_config:
                access_token = get_access_token(daraja_config)
                if access_token:
                    response = initiate_stk_push(payment, daraja_config, access_token)
                    if response.get('ResponseCode') == '0':
                        payment.transaction_id = response.get('CheckoutRequestID')
                        payment.status = 'success'
                    else:
                        payment.status = 'failed'
                    payment.save()
            return redirect('payment_status', payment_id=payment.id)
    else:
        form = PaymentForm()
    return render(request, 'payments/initiate_payment.html', {'form': form})


@login_required(login_url='/auth/login/')
def get_access_token(config):
    api_url = 'https://sandbox.safaricom.co.ke/oauth/v1/generate?grant_type=client_credentials' if config.environment == 'sandbox' else 'https://api.safaricom.co.ke/oauth/v1/generate?grant_type=client_credentials'
    response = requests.get(api_url, auth=HTTPBasicAuth(config.consumer_key, config.consumer_secret))
    if response.status_code == 200:
        return response.json()['access_token']
    return None


@login_required(login_url='/auth/login/')
def initiate_stk_push(payment, config, access_token):
    timestamp = timezone.now().strftime('%Y%m%d%H%M%S')
    password = base64.b64encode(f"{config.business_short_code}{config.lipa_na_mpesa_online_passkey}{timestamp}".encode()).decode('utf-8')

    api_url = 'https://sandbox.safaricom.co.ke/mpesa/stkpush/v1/processrequest' if config.environment == 'sandbox' else 'https://api.safaricom.co.ke/mpesa/stkpush/v1/processrequest'
    headers = {'Authorization': f"Bearer {access_token}"}
    payload = {
        "BusinessShortCode": config.business_short_code,
        "Password": password,
        "Timestamp": timestamp,
        "TransactionType": "CustomerPayBillOnline" if config.shortcode_type == 'Paybill' else "CustomerBuyGoodsOnline",
        "Amount": payment.amount,
        "PartyA": payment.phone_number,
        "PartyB": config.business_short_code,
        "PhoneNumber": payment.phone_number,
        "CallBackURL": config.callback_url,
        "AccountReference": "Payment",
        "TransactionDesc": "Payment"
    }
    response = requests.post(api_url, json=payload, headers=headers)
    return response.json()


@login_required(login_url='/auth/login/')
def payment_status(request, payment_id):
    payment = PaymentTransaction.objects.get(id=payment_id)
    return render(request, 'payments/payment_status.html', {'payment': payment})
