from django.contrib import admin
from django.utils import timezone
from django.contrib import messages
from django.http import HttpResponse, HttpResponseRedirect
from django.template.response import TemplateResponse
from django.urls import path
from django import forms
import csv
from datetime import datetime
from .models import Membership

class MembershipAdminForm(forms.ModelForm):
    class Meta:
        model = Membership
        fields = '__all__'
        widgets = {
            'date_of_birth': forms.DateInput(attrs={
                'type': 'date',
                'class': 'form-control',
            }),
            'graduation_year': forms.NumberInput(attrs={
                'type': 'number',
                'class': 'form-control',
                'min': '1950',
                'max': str(timezone.now().year),
            }),
            'membership_valid_until': forms.DateInput(attrs={
                'type': 'date',
                'class': 'form-control',
            }),
        }

@admin.register(Membership)
class MembershipAdmin(admin.ModelAdmin):
    form = MembershipAdminForm
    list_display = ('full_name', 'email', 'membership_number', 'membership_type', 'membership_status', 'payment_verified', 'is_active')
    
    def export_as_csv(self, request, queryset):
        field_names = [
            'membership_number', 'first_name', 'last_name', 'email',
            'phone_number', 'membership_type', 'membership_status',
            'payment_verified', 'membership_valid_until', 'occupation',
            'employer', 'highest_qualification', 'field_of_study',
            'created_at'
        ]

        response = HttpResponse(content_type='text/csv')
        response['Content-Disposition'] = f'attachment; filename=membership_list_{datetime.now().strftime("%Y%m%d_%H%M%S")}.csv'
        writer = csv.writer(response)

        # Write header
        writer.writerow(field_names)
        
        # Write data
        for obj in queryset:
            row_data = []
            for field in field_names:
                value = getattr(obj, field)
                if isinstance(value, datetime):
                    value = value.strftime('%Y-%m-%d %H:%M:%S')
                row_data.append(value)
            writer.writerow(row_data)

        return response
    export_as_csv.short_description = "Export selected members to CSV"
    list_filter = ('membership_status', 'membership_type', 'payment_verified')
    search_fields = ('first_name', 'last_name', 'email', 'nrc_number', 'membership_number')
    readonly_fields = ('created_at', 'updated_at', 'membership_number', 'base_number')
    
    fieldsets = (
        ('Membership Details', {
            'fields': (
                'user',
                'membership_type',
                'membership_status',
                'rejection_reason',
                'membership_fee',
                'membership_valid_until',
            ),
            'description': 'Set membership type, status, and validity period.'
        }),
        ('Personal Information', {
            'fields': (
                'first_name',
                'last_name',
                'email',
                'phone_number',
                'date_of_birth',
                'nationality',
                'nrc_number',
                'nrc_file',
                'residential_address',
                'postal_address',
            ),
            'description': 'Member\'s personal information and contact details.'
        }),
        ('Professional Information', {
            'fields': (
                'occupation',
                'employer',
                'highest_qualification',
                'field_of_study',
                'institution',
                'graduation_year',
            ),
            'description': 'Academic and professional background.'
        }),
        ('Documents', {
            'fields': (
                'profile_picture',
                'cv',
            ),
            'description': 'Upload required documents.'
        }),
        ('Payment Information', {
            'fields': (
                'payment_proof',
                'payment_verified',
                'payment_verified_at',
                'payment_verified_by',
            ),
            'description': 'Payment details and verification status.'
        }),
        ('Timestamps', {
            'fields': ('created_at', 'updated_at'),
            'classes': ('collapse',),
            'description': 'Timestamps for membership creation and updates.'
        }),
    )

    def full_name(self, obj):
        return f"{obj.first_name} {obj.last_name}"
    full_name.short_description = 'Name'

    def save_model(self, request, obj, form, change):
        # Set payment verification details when payment is verified
        if 'payment_verified' in form.changed_data and obj.payment_verified:
            obj.payment_verified_at = timezone.now()
            obj.payment_verified_by = request.user
            
            # If membership was expired, reactivate it
            if obj.membership_status == 'expired':
                obj.membership_status = 'approved'
                obj.membership_valid_until = timezone.now().date() + timezone.timedelta(days=365)
                messages.success(request, f'Membership renewed for {obj.first_name} {obj.last_name}')

        # Set membership validity when status changes to approved
        if 'membership_status' in form.changed_data and obj.membership_status == 'approved':
            obj.membership_valid_until = timezone.now().date() + timezone.timedelta(days=365)

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

    actions = ['approve_membership', 'reject_membership_with_reason', 'mark_payment_verified', 'export_as_csv']
    
    def get_urls(self):
        urls = super().get_urls()
        custom_urls = [
            path(
                '<int:membership_id>/reject/',
                self.admin_site.admin_view(self.reject_membership_view),
                name='membership-reject',
            ),
        ]
        return custom_urls + urls

    def reject_membership_view(self, request, membership_id):
        membership = self.get_object(request, membership_id)
        
        if request.method == 'POST':
            rejection_reason = request.POST.get('rejection_reason')
            if rejection_reason:
                membership.membership_status = 'rejected'
                membership.rejection_reason = rejection_reason
                membership.save()
                self.message_user(request, 'Membership application has been rejected.')
                return HttpResponseRedirect('../../')
            else:
                self.message_user(request, 'Please provide a reason for rejection.', level=messages.ERROR)
        
        context = {
            'title': 'Reject Membership Application',
            'membership': membership,
            'opts': self.model._meta,
            'app_label': self.model._meta.app_label,
        }
        return TemplateResponse(request, 'admin/membership/reject_form.html', context)

    def approve_membership(self, request, queryset):
        for membership in queryset:
            membership.membership_status = 'approved'
            membership.membership_valid_until = timezone.now().date() + timezone.timedelta(days=365)
            membership.save()
    approve_membership.short_description = "Approve selected memberships"

    def reject_membership_with_reason(self, request, queryset):
        if len(queryset) == 1:
            membership = queryset.first()
            return HttpResponseRedirect(
                f'reject/{membership.id}/'
            )
        self.message_user(request, 'Please select only one membership to reject at a time.', level=messages.WARNING)
    reject_membership_with_reason.short_description = "Reject membership (with reason)"

    def mark_payment_verified(self, request, queryset):
        for membership in queryset:
            membership.payment_verified = True
            membership.payment_verified_at = timezone.now()
            membership.payment_verified_by = request.user
            membership.save()
    mark_payment_verified.short_description = "Mark payment as verified"