from django.contrib.admin.views.decorators import staff_member_required
from django.contrib.auth.decorators import login_required
from django.shortcuts import render, get_object_or_404, redirect
from django.contrib import messages
from django.views.decorators.http import require_POST
from django.utils import timezone

from .models import (
    Investment, 
    PaymentTransaction, 
    UserSubscription,
    create_notification
)
from core.views import activate_user_subscription
from core.view_admin import send_transaction_email


@staff_member_required
def admin_approvals(request):
    """
    Main admin page to approve:
    - Pending subscription payments
    - Pending / Active investments that need review
    """
    pending_subscriptions = PaymentTransaction.objects.all().select_related("user", "plan").order_by("-created_at")

    pending_investments = Investment.objects.filter(
        status=Investment.Status.ACTIVE,
        is_withdrawn=False
    ).select_related("user", "plan").order_by("-started_at")[:50]

    # Optional: recently completed for reference
    recent_completed_subs = PaymentTransaction.objects.filter(
        status=PaymentTransaction.Status.COMPLETED
    ).select_related("user", "plan").order_by("-updated_at")[:10]

    context = {
        "pending_subscriptions": pending_subscriptions,
        "pending_investments": pending_investments,
        "recent_completed_subs": recent_completed_subs,
        "pending_subs_count": pending_subscriptions.count(),
        "active_investments_count": pending_investments.count(),
    }
    return render(request, "admin/admin_approvals.html", context)


@staff_member_required
@require_POST
def approve_subscription_payment(request, transaction_id):
    """Manually approve a subscription payment"""
    transaction = get_object_or_404(
        PaymentTransaction, 
        pk=transaction_id,
        status=PaymentTransaction.Status.PENDING
    )

    # Mark as completed
    transaction.status = PaymentTransaction.Status.COMPLETED
    transaction.save(update_fields=["status", "updated_at"])

    # Activate the subscription
    activate_user_subscription(
        user=transaction.user,
        plan=transaction.plan,
        provider=transaction.provider,
        transaction=transaction
    )

    # Notify user
    create_notification(
        user=transaction.user,
        verb=f"Your {transaction.plan.name} subscription has been approved and activated.",
        target_url="/subscriptions/"
    )

    send_transaction_email(
        transaction.user,
        "✅ Subscription Activated",
        f"Your payment for {transaction.plan.name} has been approved. Your subscription is now active."
    )

    messages.success(
        request, 
        f"Subscription for {transaction.user.username} ({transaction.plan.name}) approved."
    )
    return redirect("core:admin_approvals")


@staff_member_required
@require_POST
def reject_subscription_payment(request, transaction_id):
    """Reject a subscription payment"""
    transaction = get_object_or_404(
        PaymentTransaction, 
        pk=transaction_id,
        status=PaymentTransaction.Status.PENDING
    )

    transaction.status = PaymentTransaction.Status.FAILED
    transaction.save(update_fields=["status", "updated_at"])

    create_notification(
        user=transaction.user,
        verb=f"Your payment for {transaction.plan.name} was rejected. Please contact support.",
    )

    send_transaction_email(
        transaction.user,
        "❌ Subscription Payment Rejected",
        f"Your payment for {transaction.plan.name} could not be approved. Please contact support."
    )

    messages.warning(request, f"Payment for {transaction.user.username} rejected.")
    return redirect("core:admin_approvals")


@staff_member_required
@require_POST
def approve_investment(request, investment_id):
    """Manually mark an investment as reviewed / confirmed"""
    investment = get_object_or_404(Investment, pk=investment_id)

    # You can add a custom field like `is_approved` if needed.
    # For now we just send a confirmation notification.
    create_notification(
        user=investment.user,
        verb=f"Your investment in {investment.plan.name} has been confirmed by admin.",
        target_url="/investments/dashboard/"
    )

    send_transaction_email(
        investment.user,
        "✅ Investment Confirmed",
        f"Your investment of ${investment.amount} in {investment.plan.name} has been confirmed."
    )

    messages.success(
        request, 
        f"Investment #{investment.id} for {investment.user.username} confirmed."
    )
    return redirect("core:admin_approvals")


@staff_member_required
@require_POST
def delete_subscription_payment(request, transaction_id):
    """Permanently delete a subscription payment record"""
    transaction = get_object_or_404(PaymentTransaction, pk=transaction_id)
    
    username = transaction.user.username
    plan_name = transaction.plan.name
    
    transaction.delete()
    
    messages.success(request, f"Subscription payment for {username} ({plan_name}) has been deleted.")
    return redirect("core:admin_approvals")


@staff_member_required
@require_POST
def delete_investment(request, investment_id):
    """Permanently delete an investment record"""
    investment = get_object_or_404(Investment, pk=investment_id)
    
    username = investment.user.username
    plan_name = investment.plan.name
    
    investment.delete()
    
    messages.success(request, f"Investment for {username} ({plan_name}) has been deleted.")
    return redirect("core:admin_approvals")