from django.contrib import admin
from django.utils.html import format_html
from django.shortcuts import render, redirect
from django.urls import path
from django.contrib import messages
from django.http import HttpResponse
import csv
import io
from .models import RegisteredMember, AttendanceRecord, ScannerAssignment
from apps.events.models import Event


@admin.register(RegisteredMember)
class RegisteredMemberAdmin(admin.ModelAdmin):
    list_display = ['full_name', 'registration_code', 'email', 'event_category', 'package_name', 'payment_status', 'attendance_status', 'created_at']
    list_filter = ['payment_status', 'status', 'event_category']
    search_fields = ['full_name', 'registration_code', 'email']
    readonly_fields = ['created_at', 'updated_at']
    actions = ['export_as_csv']

    def get_urls(self):
        urls = super().get_urls()
        custom_urls = [
            path('import-csv/', self.admin_site.admin_view(self.import_csv), name='attendance_registeredmember_import_csv'),
        ]
        return custom_urls + urls

    def changelist_view(self, request, extra_context=None):
        extra_context = extra_context or {}
        extra_context['show_import_csv'] = True
        return super().changelist_view(request, extra_context=extra_context)

    def import_csv(self, request):
        if request.method == 'POST':
            csv_file = request.FILES.get('csv_file')

            if not csv_file:
                messages.error(request, 'Please select a CSV file.')
                return redirect('..')

            event_category = None
            category_id = request.POST.get('event_category_id')
            if category_id:
                try:
                    event_category = Event.objects.model._meta.apps.get_model('events', 'EventCategory').objects.get(id=category_id)
                except Exception:
                    messages.error(request, 'Selected event category not found.')
                    return redirect('..')

            try:
                decoded = csv_file.read().decode('utf-8-sig')
                reader = csv.DictReader(io.StringIO(decoded))

                created_count = 0
                updated_count = 0
                errors = []

                for i, row in enumerate(reader, start=2):
                    reg_code = row.get('Registration Code', '').strip()
                    if not reg_code:
                        errors.append(f'Row {i}: Missing registration code, skipped.')
                        continue

                    defaults = {
                        'email': row.get('Email', '').strip(),
                        'full_name': row.get('Full Name', '').strip(),
                        'status': row.get('Status', 'approved').strip(),
                        'payment_status': row.get('Payment Status', 'paid').strip(),
                        'package_name': row.get('Package Name', '').strip(),
                        'package_description': row.get('Package Description', '').strip(),
                        'activity_price': row.get('Activity Price', 0) or 0,
                    }
                    if event_category:
                        defaults['event_category'] = event_category

                    _, created = RegisteredMember.objects.update_or_create(
                        registration_code=reg_code,
                        defaults=defaults,
                    )
                    if created:
                        created_count += 1
                    else:
                        updated_count += 1

                messages.success(request, f'Import complete. {created_count} created, {updated_count} updated.')
                if errors:
                    for err in errors[:10]:
                        messages.warning(request, err)
                return redirect('..')
            except Exception as e:
                messages.error(request, f'Error processing CSV: {str(e)}')
                return redirect('..')

        from apps.events.models import EventCategory
        categories = EventCategory.objects.all().order_by('name')
        return render(request, 'admin/attendance/registeredmember/import_csv.html', {'categories': categories})

    def export_as_csv(self, request, queryset):
        meta = self.model._meta
        response = HttpResponse(content_type='text/csv')
        response['Content-Disposition'] = f'attachment; filename={meta.verbose_name_plural}.csv'
        writer = csv.writer(response)
        writer.writerow(['Registration Code', 'Full Name', 'Email', 'Event Category', 'Status', 'Payment Status', 'Package Name', 'Package Description', 'Activity Price'])
        for obj in queryset:
            writer.writerow([
                obj.registration_code, obj.full_name, obj.email,
                obj.event_category.name if obj.event_category else '',
                obj.status, obj.payment_status,
                obj.package_name, obj.package_description, obj.activity_price
            ])
        return response
    export_as_csv.short_description = 'Export selected as CSV'

    def attendance_status(self, obj):
        scans = set(obj.attendance_records.values_list('scan_type', flat=True))
        if not scans:
            return format_html('<span style="color:gray;">— Not attended</span>')
        if {'CHECK_IN', 'SESSION', 'CHECK_OUT'}.issubset(scans):
            return format_html('<span style="color:#059669;">✓ Verified Full</span>')
        if {'CHECK_IN', 'CHECK_OUT'}.issubset(scans):
            return format_html('<span style="color:#16a34a;">✓ Full Attendance</span>')
        if {'CHECK_IN', 'SESSION'}.issubset(scans):
            return format_html('<span style="color:#2563eb;">~ Partial</span>')
        if 'CHECK_IN' in scans:
            return format_html('<span style="color:#d97706;">~ Briefly</span>')
        return format_html('<span style="color:gray;">— Not attended</span>')
    attendance_status.short_description = 'Attendance'


@admin.register(AttendanceRecord)
class AttendanceRecordAdmin(admin.ModelAdmin):
    list_display = ['member', 'event', 'scan_type', 'scan_time', 'recorded_by']
    list_filter = ['event', 'scan_type']
    search_fields = ['member__full_name', 'member__registration_code']
    readonly_fields = ['scan_time']


@admin.register(ScannerAssignment)
class ScannerAssignmentAdmin(admin.ModelAdmin):
    list_display = ['user', 'event', 'is_active', 'assigned_at']
    list_filter = ['is_active', 'event']
    search_fields = ['user__username', 'event__name']
