from django.contrib import admin
from django.utils.html import format_html
from .models import (
    LoanScoring, Notification, SystemSettings, 
    ReportTemplate, GeneratedReport
)


@admin.register(LoanScoring)
class LoanScoringAdmin(admin.ModelAdmin):
    list_display = [
        'user', 'total_score', 'risk_level', 'credit_limit', 
        'is_eligible', 'calculated_at'
    ]
    list_filter = ['risk_level', 'is_eligible', 'calculated_at']
    search_fields = [
        'user__username', 'user__first_name', 'user__last_name',
        'user__phone_number'
    ]
    ordering = ['-calculated_at']
    
    fieldsets = (
        ('User Information', {
            'fields': ('user',)
        }),
        ('Scoring Factors', {
            'fields': (
                'repayment_history_score', 'income_score', 
                'rollover_frequency_score', 'employment_stability_score'
            )
        }),
        ('Results', {
            'fields': ('total_score', 'credit_limit', 'risk_level', 'is_eligible')
        }),
        ('Timestamps', {
            'fields': ('calculated_at', 'updated_at')
        }),
    )
    
    readonly_fields = ['calculated_at', 'updated_at']
    
    actions = ['recalculate_scores']
    
    def recalculate_scores(self, request, queryset):
        for scoring in queryset:
            scoring.calculate_score()
        self.message_user(request, f"{queryset.count()} credit scores recalculated.")
    recalculate_scores.short_description = "Recalculate selected credit scores"


@admin.register(Notification)
class NotificationAdmin(admin.ModelAdmin):
    list_display = [
        'user', 'notification_type', 'title', 'channel', 
        'is_sent', 'created_at'
    ]
    list_filter = [
        'notification_type', 'channel', 'is_sent', 'created_at'
    ]
    search_fields = [
        'user__username', 'user__first_name', 'user__last_name',
        'title', 'message'
    ]
    ordering = ['-created_at']
    
    fieldsets = (
        ('Notification Details', {
            'fields': ('user', 'notification_type', 'title', 'message')
        }),
        ('Delivery', {
            'fields': ('channel', 'is_sent', 'sent_at')
        }),
        ('Related Objects', {
            'fields': ('related_loan', 'related_application'),
            'classes': ('collapse',)
        }),
        ('Timestamps', {
            'fields': ('created_at',)
        }),
    )
    
    readonly_fields = ['created_at']
    
    actions = ['mark_as_sent']
    
    def mark_as_sent(self, request, queryset):
        for notification in queryset.filter(is_sent=False):
            notification.mark_as_sent()
        self.message_user(request, f"{queryset.count()} notifications marked as sent.")
    mark_as_sent.short_description = "Mark selected notifications as sent"


@admin.register(SystemSettings)
class SystemSettingsAdmin(admin.ModelAdmin):
    list_display = [
        'default_interest_rate', 'default_processing_fee', 
        'auto_approval_enabled', 'email_notifications_enabled'
    ]
    
    fieldsets = (
        ('Loan Settings', {
            'fields': (
                'default_interest_rate', 'default_processing_fee', 
                'default_late_penalty'
            )
        }),
        ('Rollover Settings', {
            'fields': (
                'rollover_fee_percentage', 'max_rollover_days', 
                'max_rollover_count'
            )
        }),
        ('Auto-Approval Settings', {
            'fields': (
                'auto_approval_enabled', 'auto_approval_min_score',
                'auto_approval_max_amount'
            )
        }),
        ('Notification Settings', {
            'fields': (
                'email_notifications_enabled', 'sms_notifications_enabled'
            )
        }),
        ('M-Pesa Settings', {
            'fields': (
                'mpesa_business_shortcode', 'mpesa_passkey', 'mpesa_environment'
            ),
            'classes': ('collapse',)
        }),
    )
    
    def has_add_permission(self, request):
        # Only allow one system settings instance
        return not SystemSettings.objects.exists()
    
    def has_delete_permission(self, request, obj=None):
        return False


@admin.register(ReportTemplate)
class ReportTemplateAdmin(admin.ModelAdmin):
    list_display = [
        'name', 'report_type', 'is_active', 'created_at'
    ]
    list_filter = ['report_type', 'is_active', 'created_at']
    search_fields = ['name', 'description']
    ordering = ['report_type', 'name']
    
    fieldsets = (
        ('Basic Information', {
            'fields': ('name', 'report_type', 'description')
        }),
        ('Template Configuration', {
            'fields': ('template_file', 'is_active')
        }),
    )


@admin.register(GeneratedReport)
class GeneratedReportAdmin(admin.ModelAdmin):
    list_display = [
        'report_name', 'report_type', 'format', 'generated_by',
        'file_size', 'generated_at'
    ]
    list_filter = ['report_type', 'format', 'generated_at']
    search_fields = [
        'report_name', 'report_type', 'generated_by__username',
        'generated_by__first_name', 'generated_by__last_name'
    ]
    ordering = ['-generated_at']
    
    fieldsets = (
        ('Report Details', {
            'fields': ('report_name', 'report_type', 'format')
        }),
        ('File Information', {
            'fields': ('file_path', 'file_size')
        }),
        ('Generation Details', {
            'fields': ('generated_by', 'parameters')
        }),
        ('Timestamps', {
            'fields': ('generated_at',)
        }),
    )
    
    readonly_fields = ['generated_at']
    
    def has_add_permission(self, request):
        return False
    
    def has_change_permission(self, request, obj=None):
        return False
