from django.contrib import admin
from rangefilter.filters import DateRangeFilter
from django.utils.timezone import now
from django.utils import timezone
from django.contrib.admin.actions import delete_selected


from .exporters import export_payments_to_excel
from .models import Payment, ExternalApp

# Mark payments as claimed
@admin.action(description="Mark selected payments as claimed (C2B only)")
def mark_as_claimed(modeladmin, request, queryset):
    
    # Restricting to C2B payments ONLY
    c2b_payments = queryset.filter(payment_type="C2B", claimed=False, status='SUCCESS')

    updated_count = c2b_payments.update(
        claimed=True,
        claimed_at=timezone.now()
    )

    modeladmin.message_user(
        request,
        f"{updated_count} C2B payment(s) successfully marked as claimed."
    )
    ignored_count = queryset.count() - updated_count
    if ignored_count:
        modeladmin.message_user(
            request,
            f"{ignored_count} payment(s) were skipped (not C2B or already claimed).",
            level="warning"
        )



# Payment reporting start
def export_selected(modeladmin, request, queryset):
    return export_payments_to_excel(queryset, "selected_payments.xlsx")


export_selected.short_description = "Export selected to Excel"



@admin.register(ExternalApp)
class ExternalAppAdmin(admin.ModelAdmin):
    list_display = ("name", "api_key", "is_active", "created_at")
    readonly_fields = ("api_key", "created_at")
    search_fields = ("name",)
    list_filter = ("is_active", "created_at")


@admin.register(Payment)
class PaymentAdmin(admin.ModelAdmin):
    list_display = (
       "mpesa_receipt_number",
        "external_reference",
        "payment_type",
        "phone_number",
        "amount",
        "status",
        "claimed",
        "created_at",
    )

    list_filter = ("status", "claimed", "payment_type", ("created_at", DateRangeFilter))
    search_fields = (
        "external_reference",
        "phone_number",
        "mpesa_receipt_number",
        "checkout_request_id",
    )

    readonly_fields = (
        "external_reference",
        "amount",
        "status",
        "mpesa_receipt_number",
        "phone_number",
        "payment_type",
        "app",
        "app_name",
        "failure_reason",
        "checkout_request_id",
        "merchant_request_id",
        "raw_callback",
        "created_at",
               
    )
    # Remove the "delete selected" bulk action
    def get_actions(self, request):
        actions = super().get_actions(request)
        actions.pop("delete_selected", None)
        return actions

    # Block the individual delete view for ALL users including superuser
    def has_delete_permission(self, request, obj=None):
        return False


    ordering = ("-created_at",)

    actions = [export_selected, mark_as_claimed]
