from django.contrib import admin
from django.utils.html import format_html
from django.utils import timezone
from .models import (
    LoanProduct, LoanApplication, Loan, Repayment, 
    RolloverRequest, MpesaTransaction
)


@admin.register(LoanProduct)
class LoanProductAdmin(admin.ModelAdmin):
    list_display = [
        'name', 'product_type', 'min_amount', 'max_amount', 
        'interest_rate', 'processing_fee', 'is_active'
    ]
    list_filter = ['product_type', 'is_active', 'requires_guarantor', 'requires_collateral']
    search_fields = ['name', 'description']
    ordering = ['name']
    
    fieldsets = (
        ('Basic Information', {
            'fields': ('name', 'product_type', 'description')
        }),
        ('Loan Amounts', {
            'fields': ('min_amount', 'max_amount')
        }),
        ('Interest & Fees', {
            'fields': ('interest_rate', 'processing_fee', 'late_payment_penalty')
        }),
        ('Terms', {
            'fields': ('min_duration', 'max_duration')
        }),
        ('Requirements', {
            'fields': ('requires_guarantor', 'requires_collateral', 'minimum_income')
        }),
        ('Status', {
            'fields': ('is_active',)
        }),
    )


@admin.register(LoanApplication)
class LoanApplicationAdmin(admin.ModelAdmin):
    list_display = [
        'application_number', 'borrower', 'loan_product', 'requested_amount',
        'requested_duration', 'status', 'submitted_at', 'auto_approved'
    ]
    list_filter = [
        'status', 'loan_product__product_type', 'auto_approved', 
        'submitted_at', 'reviewed_at'
    ]
    search_fields = [
        'application_number', 'borrower__username', 'borrower__first_name',
        'borrower__last_name', 'borrower__phone_number'
    ]
    ordering = ['-submitted_at']
    
    fieldsets = (
        ('Application Details', {
            'fields': ('application_number', 'borrower', 'loan_product')
        }),
        ('Loan Request', {
            'fields': ('requested_amount', 'requested_duration', 'purpose')
        }),
        ('Calculated Amounts', {
            'fields': ('interest_amount', 'processing_fee_amount', 'total_amount'),
            'classes': ('collapse',)
        }),
        ('Status & Workflow', {
            'fields': ('status', 'submitted_at', 'reviewed_by', 'reviewed_at', 'approval_notes')
        }),
        ('Auto-Approval', {
            'fields': ('auto_approved', 'credit_score'),
            'classes': ('collapse',)
        }),
        ('Documents', {
            'fields': ('supporting_documents',)
        }),
    )
    
    readonly_fields = [
        'application_number', 'submitted_at', 'interest_amount', 
        'processing_fee_amount', 'total_amount'
    ]
    
    actions = ['approve_applications', 'reject_applications']
    
    def approve_applications(self, request, queryset):
        for application in queryset.filter(status='pending'):
            application.approve(request.user, "Bulk approved via admin")
        self.message_user(request, f"{queryset.count()} applications approved.")
    approve_applications.short_description = "Approve selected applications"
    
    def reject_applications(self, request, queryset):
        for application in queryset.filter(status='pending'):
            application.reject(request.user, "Bulk rejected via admin")
        self.message_user(request, f"{queryset.count()} applications rejected.")
    reject_applications.short_description = "Reject selected applications"


@admin.register(Loan)
class LoanAdmin(admin.ModelAdmin):
    list_display = [
        'loan_number', 'borrower', 'principal_amount', 'total_amount',
        'status', 'disbursement_date', 'due_date', 'is_overdue', 'outstanding_amount'
    ]
    list_filter = [
        'status', 'disbursement_date', 'due_date', 'is_rolled_over'
    ]
    search_fields = [
        'loan_number', 'borrower__username', 'borrower__first_name',
        'borrower__last_name', 'borrower__phone_number'
    ]
    ordering = ['-created_at']
    
    fieldsets = (
        ('Loan Details', {
            'fields': ('loan_number', 'application', 'borrower')
        }),
        ('Amounts', {
            'fields': ('principal_amount', 'interest_amount', 'processing_fee', 'total_amount')
        }),
        ('Terms', {
            'fields': ('disbursement_date', 'due_date', 'duration_days')
        }),
        ('Status', {
            'fields': ('status', 'is_rolled_over', 'original_loan')
        }),
        ('Repayment Tracking', {
            'fields': ('amount_paid', 'last_payment_date'),
            'classes': ('collapse',)
        }),
    )
    
    readonly_fields = [
        'loan_number', 'outstanding_amount', 'is_overdue', 'days_overdue'
    ]
    
    def outstanding_amount(self, obj):
        return obj.outstanding_amount
    outstanding_amount.short_description = 'Outstanding Amount'
    
    def is_overdue(self, obj):
        return obj.is_overdue
    is_overdue.boolean = True
    is_overdue.short_description = 'Overdue'


@admin.register(Repayment)
class RepaymentAdmin(admin.ModelAdmin):
    list_display = [
        'receipt_number', 'loan', 'get_borrower', 'amount', 'payment_method',
        'payment_date', 'mpesa_transaction_id'
    ]
    list_filter = ['payment_method', 'payment_date']
    search_fields = [
        'receipt_number', 'loan__loan_number', 'loan__borrower__username',
        'loan__borrower__first_name', 'loan__borrower__last_name', 'mpesa_transaction_id'
    ]
    ordering = ['-payment_date']
    
    fieldsets = (
        ('Payment Details', {
            'fields': ('receipt_number', 'loan', 'amount', 'payment_method')
        }),
        ('M-Pesa Details', {
            'fields': ('mpesa_transaction_id', 'mpesa_phone_number'),
            'classes': ('collapse',)
        }),
        ('Timestamps', {
            'fields': ('payment_date', 'created_at')
        }),
    )
    
    readonly_fields = ['receipt_number', 'payment_date', 'created_at']
    
    def get_borrower(self, obj):
        return obj.loan.borrower.get_full_name()
    get_borrower.short_description = 'Borrower'


@admin.register(RolloverRequest)
class RolloverRequestAdmin(admin.ModelAdmin):
    list_display = [
        'loan', 'borrower', 'requested_duration', 'status', 
        'requested_at', 'reviewed_by'
    ]
    list_filter = ['status', 'requested_at', 'reviewed_at']
    search_fields = [
        'loan__loan_number', 'borrower__username', 'borrower__first_name',
        'borrower__last_name'
    ]
    ordering = ['-requested_at']
    
    fieldsets = (
        ('Request Details', {
            'fields': ('loan', 'borrower', 'requested_duration', 'reason', 'rollover_fee')
        }),
        ('Status', {
            'fields': ('status', 'reviewed_by', 'reviewed_at', 'review_notes')
        }),
        ('Timestamps', {
            'fields': ('requested_at',)
        }),
    )
    
    readonly_fields = ['requested_at']
    
    actions = ['approve_rollovers', 'reject_rollovers']
    
    def approve_rollovers(self, request, queryset):
        for rollover in queryset.filter(status='pending'):
            rollover.approve(request.user, "Bulk approved via admin")
        self.message_user(request, f"{queryset.count()} rollover requests approved.")
    approve_rollovers.short_description = "Approve selected rollover requests"
    
    def reject_rollovers(self, request, queryset):
        for rollover in queryset.filter(status='pending'):
            rollover.reject(request.user, "Bulk rejected via admin")
        self.message_user(request, f"{queryset.count()} rollover requests rejected.")
    reject_rollovers.short_description = "Reject selected rollover requests"


@admin.register(MpesaTransaction)
class MpesaTransactionAdmin(admin.ModelAdmin):
    list_display = [
        'transaction_type', 'amount', 'phone_number', 'status',
        'mpesa_transaction_id', 'created_at'
    ]
    list_filter = ['transaction_type', 'status', 'created_at']
    search_fields = [
        'phone_number', 'mpesa_transaction_id', 'merchant_request_id',
        'checkout_request_id'
    ]
    ordering = ['-created_at']
    
    fieldsets = (
        ('Transaction Details', {
            'fields': ('transaction_type', 'amount', 'phone_number')
        }),
        ('M-Pesa Response', {
            'fields': (
                'mpesa_transaction_id', 'merchant_request_id', 
                'checkout_request_id'
            )
        }),
        ('Status', {
            'fields': ('status', 'result_code', 'result_description')
        }),
        ('Related Objects', {
            'fields': ('loan', 'repayment'),
            'classes': ('collapse',)
        }),
        ('Timestamps', {
            'fields': ('created_at', 'updated_at')
        }),
    )
    
    readonly_fields = ['created_at', 'updated_at']
