from django.contrib.auth.decorators import login_required, user_passes_test
from django.shortcuts import render, get_object_or_404, redirect
from django.contrib import messages
from django.views.decorators.http import require_POST
from .models import PaymentGateway


def staff_required(view_func):
    return user_passes_test(lambda u: u.is_staff)(view_func)


@login_required
def payment_gateways_list(request):
    """Public list of available payment gateways"""
    gateways = PaymentGateway.objects.filter(
        is_active=True,
        status=PaymentGateway.Status.ACTIVE
    ).order_by("display_order")

    return render(request, "payments/gateways_list.html", {
        "gateways": gateways
    })


@staff_required
def admin_payment_gateways(request):
    """Admin management of all gateways"""
    gateways = PaymentGateway.objects.all().order_by("display_order")
    
    return render(request, "gateways/admin_gateways.html", {
        "gateways": gateways
    })


@staff_required
@require_POST
def toggle_gateway_status(request, gateway_id):
    gateway = get_object_or_404(PaymentGateway, pk=gateway_id)
    
    if gateway.status == PaymentGateway.Status.ACTIVE:
        gateway.status = PaymentGateway.Status.INACTIVE
        messages.success(request, f"{gateway.name} has been deactivated.")
    else:
        gateway.status = PaymentGateway.Status.ACTIVE
        messages.success(request, f"{gateway.name} has been activated.")
    
    gateway.save()
    return redirect("core:admin_payment_gateways")


@staff_required
@require_POST
def toggle_test_mode(request, gateway_id):
    gateway = get_object_or_404(PaymentGateway, pk=gateway_id)
    gateway.is_test_mode = not gateway.is_test_mode
    gateway.save()
    
    mode = "Test Mode" if gateway.is_test_mode else "Live Mode"
    messages.info(request, f"{gateway.name} is now in {mode}.")
    return redirect("core:admin_payment_gateways")