from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
from import_export.admin import ImportExportModelAdmin
from import_export import resources
from django.contrib.auth.hashers import make_password
from .models import (
    User, Alumni, AlumniCategory, AlumniChapter,
    AcademicHistory, Employment,SystemLog,Job,
    AlumniEvent, EventParticipation, Donation, MediaResources
)


    
# =====================================
# Download
# =====================================

@admin.register(MediaResources)
class MediaResourcesAdmin(admin.ModelAdmin):
    list_display = ('file_name', 'file', 'uploaded_at')
    search_fields = ('file_name',)
    list_filter = ('uploaded_at',)
    ordering = ('-uploaded_at',)
    
    
# =====================================
# Jobs
# =====================================
@admin.register(Job)
class JobAdmin(admin.ModelAdmin):
    list_display = (
        "title",
        "company",
        "job_type",
        "location",
        "deadline",
        "is_active",
        "created_at",
    )

    list_filter = (
        "job_type",
        "is_active",
        "deadline",
        "created_at",
    )

    search_fields = (
        "title",
        "company",
        "location",
    )

    ordering = ("-created_at",)

    readonly_fields = ("created_at",)

    fieldsets = (
        ("Job Information", {
            "fields": (
                "title",
                "company",
                "location",
                "job_type",
                "description",
            )
        }),
        ("Application Details", {
            "fields": (
                "application_link",
                "deadline",
            )
        }),
        ("Status", {
            "fields": (
                "is_active",
                "posted_by",
                "created_at",
            )
        }),
    )
    
    def save_model(self, request, obj, form, change):
        if not obj.posted_by:
            obj.posted_by = request.user
        super().save_model(request, obj, form, change)




# =====================================
# Custom User Admin
# =====================================

admin.site.site_header = "UBIDS Alumni Management System"
admin.site.site_title = "UBIDS AMS Admin"
admin.site.index_title = "Administration Dashboard"


@admin.register(SystemLog)
class SystemLogAdmin(admin.ModelAdmin):
    list_display = ('action_type', 'user', 'ip_address', 'created_at')
    list_filter = ('action_type', 'created_at')
    search_fields = ('description', 'user__username')
    readonly_fields = [field.name for field in SystemLog._meta.fields]

    def has_add_permission(self, request):
        return False

    def has_delete_permission(self, request, obj=None):
        return False


class UserResource(resources.ModelResource):

    def before_import_row(self, row, **kwargs):
        # Hash password if provided
        if row.get('password'):
            row['password'] = make_password(row['password'])

    class Meta:
        model = User
        fields = (
            'id',
            'email',
            'password',
            'role',
            'is_staff',
            'is_active',
            'is_superuser',
        )
        export_order = fields


@admin.register(User)
class CustomUserAdmin(ImportExportModelAdmin, UserAdmin):
    resource_class = UserResource
    model = User

    list_display = ('email', 'role', 'is_staff', 'is_active')
    list_filter = ('role', 'is_staff', 'is_active')
    ordering = ('email',)
    search_fields = ('email',)

    fieldsets = (
        (None, {'fields': ('email', 'password')}),
        ('Role Information', {'fields': ('role',)}),
        ('Permissions', {
            'fields': (
                'is_staff',
                'is_active',
                'is_superuser',
                'groups',
                'user_permissions'
            )
        }),
        ('Important Dates', {'fields': ('last_login',)}),
    )

    add_fieldsets = (
        (None, {
            'classes': ('wide',),
            'fields': (
                'email',
                'password1',
                'password2',
                'role',
                'is_staff',
                'is_active'
            ),
        }),
    )

    filter_horizontal = ('groups', 'user_permissions')

# =====================================
# Alumni Inlines (for cleaner admin)
# =====================================

class AcademicHistoryInline(admin.TabularInline):
    model = AcademicHistory
    extra = 1


class EmploymentInline(admin.TabularInline):
    model = Employment
    extra = 1


# =====================================
# Alumni Donation
# =====================================

@admin.register(Donation)
class DonationAdmin(admin.ModelAdmin):
    list_display = (
        'reference',
        'user',
        'amount',
        'status',
        'transaction_id',
        'payment_channel',
        'created_at',
    )
    list_filter = ('status', 'created_at')
    search_fields = ('reference', 'user__email', 'user__username')
    ordering = ('-created_at',)

    # Optional: make some fields read-only for auditing
    readonly_fields = ('reference', 'transaction_id', 'payment_channel', 'created_at')
    
    
    def has_add_permission(self, request):
        return False

    def has_delete_permission(self, request, obj=None):
        return False
        
    def has_change_permission(self, request, obj=None):
        return False

# =====================================
# Alumni Admin
# =====================================

class AlumniResource(resources.ModelResource):

    class Meta:
        model = Alumni
        import_id_fields = ('id',)  # or use 'user' if you prefer
        fields = (
            'id',
            'full_name',
            'user',
            'gender',
            'contact_number',
            'graduation_year',
            'programme',
            'category',
            'chapter',
            'is_active',
        )
        export_order = fields

@admin.register(Alumni)
class AlumniAdmin(ImportExportModelAdmin):
    resource_class = AlumniResource

    list_display = (
        'full_name',
        'user',
        'graduation_year',
        'programme',
        'category',
        'chapter',
        'is_active'
    )

    list_filter = (
        'graduation_year',
        'category',
        'chapter',
        'is_active'
    )

    search_fields = (
        'full_name',
        'programme',
        'user__email'
    )

    inlines = [AcademicHistoryInline, EmploymentInline]


# =====================================
# Simple Model Registrations
# =====================================

@admin.register(AlumniCategory)
class AlumniCategoryAdmin(admin.ModelAdmin):
    list_display = ('name',)


@admin.register(AlumniChapter)
class AlumniChapterAdmin(admin.ModelAdmin):
    list_display = ('name', 'country', 'region', 'city')
    search_fields = ('name', 'country')


@admin.register(AlumniEvent)
class AlumniEventAdmin(admin.ModelAdmin):
    list_display = ('title', 'event_date', 'location')
    list_filter = ('event_date',)
    search_fields = ('title', 'location')


@admin.register(EventParticipation)
class EventParticipationAdmin(admin.ModelAdmin):
    list_display = ('alumni', 'event', 'attended', 'registered_on')
    list_filter = ('attended', 'event')
    search_fields = ('alumni__full_name', 'event__title')


