from django.contrib import admin
from django.utils.html import format_html
from django.urls import reverse
from django.db.models import F
from .models import EventType, Event, Registration, PaymentProof
from .views import send_registration_email


@admin.register(EventType)
class EventTypeAdmin(admin.ModelAdmin):
    list_display = ('name', 'description', 'created_at', 'updated_at')
    search_fields = ('name', 'description')
    list_filter = ('created_at',)


@admin.register(Event)
class EventAdmin(admin.ModelAdmin):
    list_display = ('name', 'event_type', 'start_date', 'end_date', 'location', 
                   'is_paid', 'amount', 'is_active', 'is_archived', 'created_at')
    list_filter = ('event_type', 'is_paid', 'is_active', 'is_archived', 'start_date')
    search_fields = ('name', 'description', 'location')
    date_hierarchy = 'start_date'
    autocomplete_fields = ['event_type']
    fieldsets = (
        ('Event Information', {
            'fields': ('name', 'event_type', 'description', 'is_active', 'is_archived')
        }),
        ('Schedule', {
            'fields': ('start_date', 'end_date', 'location')
        }),
        ('Payment', {
            'fields': ('is_paid', 'amount')
        }),
    )


class PaymentProofInline(admin.StackedInline):
    model = PaymentProof
    extra = 0
    readonly_fields = ('uploaded_at',)
    can_delete = False


@admin.register(Registration)
class RegistrationAdmin(admin.ModelAdmin):
    list_display = ('registration_code', 'full_name', 'email', 'organisation', 'event_link', 
                   'status', 'payment_status', 'has_attended', 'registered_at')
    list_filter = ('status', 'payment_status', 'has_attended', 'event', 'organisation', 'registered_at')
    search_fields = ('registration_code', 'full_name', 'email', 'organisation')
    readonly_fields = ('registration_code', 'registered_at', 'updated_at', 'attendance_timestamp')
    date_hierarchy = 'registered_at'
    inlines = [PaymentProofInline]
    actions = ['approve_registrations', 'approve_payments', 'reject_registrations', 'reject_payments']
    
    fieldsets = (
        ('Participant Information', {
            'fields': ('registration_code', 'full_name', 'email', 'organisation')
        }),
        ('Event Details', {
            'fields': ('event',)
        }),
        ('Status Information', {
            'fields': ('status', 'payment_status')
        }),
        ('Attendance Information', {
            'fields': ('has_attended', 'attendance_timestamp')
        }),
        ('Timestamps', {
            'fields': ('registered_at', 'updated_at')
        }),
    )
    
    def event_link(self, obj):
        url = reverse('admin:registration_event_change', args=[obj.event.id])
        return format_html('<a href="{}">{}</a>', url, obj.event.name)
    event_link.short_description = 'Event'
    
    def approve_registrations(self, request, queryset):
        # Track which registrations were updated from 'pending' to 'approved'
        pending_registrations = list(queryset.filter(status='pending').values_list('id', flat=True))
        
        # Update all selected registrations
        queryset.update(status='approved')
        
        # Send email notifications for newly approved registrations
        newly_approved = Registration.objects.filter(id__in=pending_registrations)
        for registration in newly_approved:
            try:
                send_registration_email(registration, payment_pending=registration.payment_status=='pending')
            except Exception as e:
                self.message_user(request, f"Error sending email to {registration.email}: {str(e)}", level='ERROR')
        
        self.message_user(request, f"{queryset.count()} registrations have been approved. Notification emails sent to {newly_approved.count()} participants.")
    approve_registrations.short_description = "Approve selected registrations"
    
    def reject_registrations(self, request, queryset):
        queryset.update(status='rejected')
        self.message_user(request, f"{queryset.count()} registrations have been rejected.")
    reject_registrations.short_description = "Reject selected registrations"
    
    def approve_payments(self, request, queryset):
        # Get registrations with pending payments first
        registrations_with_payment = list(queryset.filter(payment_status='pending').values_list('id', flat=True))
        
        # Update the status
        queryset.filter(payment_status='pending').update(payment_status='approved', status='approved')
        
        # Send email notifications
        newly_approved = Registration.objects.filter(id__in=registrations_with_payment)
        for registration in newly_approved:
            try:
                send_registration_email(registration, payment_pending=False)
            except Exception as e:
                self.message_user(request, f"Error sending email to {registration.email}: {str(e)}", level='ERROR')
                
        self.message_user(request, f"{len(registrations_with_payment)} payments have been approved. Notification emails sent to approved participants.")
    approve_payments.short_description = "Approve payment for selected registrations"
    
    def reject_payments(self, request, queryset):
        registrations_with_payment = queryset.filter(payment_status='pending')
        registrations_with_payment.update(payment_status='rejected')
        self.message_user(request, f"{registrations_with_payment.count()} payments have been rejected.")
    reject_payments.short_description = "Reject payment for selected registrations"


@admin.register(PaymentProof)
class PaymentProofAdmin(admin.ModelAdmin):
    list_display = ('registration', 'file_preview', 'uploaded_at')
    search_fields = ('registration__full_name', 'registration__email', 'registration__registration_code')
    readonly_fields = ('uploaded_at',)
    
    def file_preview(self, obj):
        return format_html('<a href="{}" target="_blank">View Payment Proof</a>', obj.file.url)
    file_preview.short_description = 'Payment Proof'
