import requests
from django.contrib import admin
from django.contrib import messages
from .models import PushDevice, ContactQuery, PushNotification
from .push import send_push_message, DeviceNotRegisteredError

@admin.action(description="Send test push notification to selected devices")
def send_test_push_notification(modeladmin, request, queryset):
    success_count = 0
    fail_count = 0
    for device in queryset:
        if device.is_active:
            # We can use the push.py utility
            success = send_push_message(
                device.device_token, 
                "Test Notification", 
                "This is a test message from CashFlow Admin."
            )
            if success:
                success_count += 1
            else:
                fail_count += 1
    
    messages.info(request, f"Push notifications sent. Success: {success_count}, Failed: {fail_count}")

@admin.register(PushDevice)
class PushDeviceAdmin(admin.ModelAdmin):
    list_display = ('device_token', 'user', 'platform', 'is_active', 'created_at', 'last_seen_at')
    list_filter = ('platform', 'is_active', 'created_at')
    search_fields = ('device_token', 'user__username', 'device_id')
    actions = [send_test_push_notification]
    
    # Optional: Customize the admin for this model
    readonly_fields = ('created_at', 'updated_at', 'last_seen_at')

@admin.register(ContactQuery)
class ContactQueryAdmin(admin.ModelAdmin):
    list_display = ('name', 'email', 'subject', 'is_resolved', 'created_at')
    list_filter = ('is_resolved', 'created_at')
    search_fields = ('name', 'email', 'subject', 'message')
    readonly_fields = ('created_at',)
    list_editable = ('is_resolved',)

@admin.action(description="Send again (Resend selected broadcasts)")
def resend_push_notifications(modeladmin, request, queryset):
    total_success = 0
    total_fail = 0
    for obj in queryset:
        extra = obj.extra_data if obj.extra_data else {}
        if obj.media_file:
            extra['image'] = request.build_absolute_uri(obj.media_file.url)
        if obj.action_link:
            extra['url'] = obj.action_link
        
        category_id = "update_cta" if obj.action_link else None
        
        if obj.target_device:
            success = send_push_message(obj.target_device.device_token, obj.title, obj.message, extra=extra, category=category_id)
            if success:
                total_success += 1
            else:
                total_fail += 1
        else:
            devices = PushDevice.objects.filter(is_active=True)
            for device in devices:
                success = send_push_message(device.device_token, obj.title, obj.message, extra=extra, category=category_id)
                if success:
                    total_success += 1
                else:
                    total_fail += 1
                    device.is_active = False
                    device.save(update_fields=['is_active'])
                    
        # Update tracking counts
        obj.success_count += total_success
        obj.failure_count += total_fail
        obj.save(update_fields=['success_count', 'failure_count'])

    messages.info(request, f"Resent push notifications. Total Success: {total_success}, Total Failed: {total_fail}")

@admin.register(PushNotification)
class PushNotificationAdmin(admin.ModelAdmin):
    list_display = ('title', 'sent_at', 'target_device', 'success_count', 'failure_count')
    readonly_fields = ('sent_at', 'success_count', 'failure_count')
    list_filter = ('sent_at',)
    search_fields = ('title', 'message')
    actions = [resend_push_notifications]

    def save_model(self, request, obj, form, change):
        if not change:
            # Only send the notification on creation, not on edits
            extra = obj.extra_data if obj.extra_data else {}
            
            # Embed image and action link into the extra data payload
            if obj.media_file:
                # Build an absolute URL for the image
                extra['image'] = request.build_absolute_uri(obj.media_file.url)
            if obj.action_link:
                extra['url'] = obj.action_link

            success_count = 0
            failure_count = 0

            category_id = "update_cta" if obj.action_link else None

            if obj.target_device:
                # Send to a single device
                success = send_push_message(obj.target_device.device_token, obj.title, obj.message, extra=extra, category=category_id)
                if success:
                    success_count += 1
                else:
                    failure_count += 1
            else:
                # Send to all active devices
                devices = PushDevice.objects.filter(is_active=True)
                for device in devices:
                    success = send_push_message(device.device_token, obj.title, obj.message, extra=extra, category=category_id)
                    if success:
                        success_count += 1
                    else:
                        failure_count += 1
                        device.is_active = False
                        device.save(update_fields=['is_active'])
            
            obj.success_count = success_count
            obj.failure_count = failure_count
            
            # Inform admin
            messages.info(request, f"Push sent. Success: {success_count}, Failed: {failure_count}")

        super().save_model(request, obj, form, change)
