from django.contrib import admin
from .models import (
    ExternalLoanProduct, ExternalLoanSector, ExternalLoanApplication,
    ExternalLoanApproval, ExternalLoanDisbursement, ExternalLoanWriteOff,
    ExternalLoanTransfer, ExternalLoanSettings, ExternalLoanGuarantors,
    ExternalLoanGuarantorsSecurity, ExternalLoanApplicationSecurity,
    ExternalLoanIncomeSource, ExternalLoanMainTransactions, ExternalLoanRecovery,
    ExternalLoanApplicationMember
)

@admin.register(ExternalLoanProduct)
class ExternalLoanProductAdmin(admin.ModelAdmin):
    list_display = ['product_name', 'int_rate', 'int_method', 'max_loan_amt', 'min_loan_amt', 'organisation', 'is_active', 'date_added']
    list_filter = ['is_active', 'int_method', 'organisation', 'date_added']
    search_fields = ['product_name', 'organisation__name']
    readonly_fields = ['date_added', 'last_updated']
    ordering = ['-date_added']

@admin.register(ExternalLoanSector)
class ExternalLoanSectorAdmin(admin.ModelAdmin):
    list_display = ['name', 'organisation', 'is_active', 'date_added']
    list_filter = ['is_active', 'organisation', 'date_added']
    search_fields = ['name', 'organisation__name']
    readonly_fields = ['date_added', 'last_updated']
    ordering = ['-date_added']

@admin.register(ExternalLoanApplication)
class ExternalLoanApplicationAdmin(admin.ModelAdmin):
    list_display = ['loan_number', 'applicant_organisation', 'loan_provider_organisation', 'loan_amount', 'status', 'external_loan_product', 'loan_officer', 'date_added']
    list_filter = ['status', 'payment_method', 'external_loan_product', 'organisation_branch', 'date_added']
    search_fields = ['loan_number', 'applicant_organisation__name', 'loan_provider_organisation__name', 'loan_purpose']
    readonly_fields = ['date_added', 'last_updated', 'loan_number']
    ordering = ['-date_added']
    
    fieldsets = (
        ('Basic Information', {
            'fields': ('loan_number', 'applicant_organisation', 'loan_provider_organisation', 'loan_amount', 'loan_purpose', 'application_date', 'status')
        }),
        ('Product & Terms', {
            'fields': ('external_loan_product', 'int_rate', 'int_method', 'loan_period', 'period_type')
        }),
        ('Organization & Staff', {
            'fields': ('organisation_branch', 'loan_officer', 'external_loan_sector')
        }),
        ('Payment Details', {
            'fields': ('payment_method', 'bank_account_details', 'mobile_money_details')
        }),
        ('Additional Info', {
            'fields': ('external_loan_provider', 'reason')
        }),
        ('Audit', {
            'fields': ('added_by', 'date_added', 'last_updated', 'is_deleted', 'reason_for_delete'),
            'classes': ('collapse',)
        })
    )

@admin.register(ExternalLoanApproval)
class ExternalLoanApprovalAdmin(admin.ModelAdmin):
    list_display = ['external_loan_application', 'approved_amount', 'approval_status', 'approved_by', 'approval_date']
    list_filter = ['approval_status', 'approved_by', 'approval_date']
    search_fields = ['external_loan_application__applicant_organisation__name', 'approved_purpose']
    readonly_fields = ['created_at', 'updated_at']
    ordering = ['-approval_date']

@admin.register(ExternalLoanDisbursement)
class ExternalLoanDisbursementAdmin(admin.ModelAdmin):
    list_display = ['external_loan_application', 'disbursed_amount', 'disbursement_method', 'approval_status', 'disbursed_by', 'disbursement_date']
    list_filter = ['disbursement_method', 'approval_status', 'disbursed_by', 'disbursement_date']
    search_fields = ['external_loan_application__applicant_organisation__name', 'payment_reference']
    readonly_fields = ['created_at', 'updated_at', 'disbursement_date']
    ordering = ['-disbursement_date']

@admin.register(ExternalLoanWriteOff)
class ExternalLoanWriteOffAdmin(admin.ModelAdmin):
    list_display = ['external_loan_application', 'writeoff_amount', 'interest_at_writeoff', 'writeoff_date', 'added_by']
    list_filter = ['writeoff_date', 'added_by']
    search_fields = ['external_loan_application__applicant_organisation__name', 'description']
    readonly_fields = ['date_added', 'last_updated']
    ordering = ['-writeoff_date']

@admin.register(ExternalLoanTransfer)
class ExternalLoanTransferAdmin(admin.ModelAdmin):
    list_display = ['external_loan_application', 'from_officer', 'to_officer', 'transfer_date', 'transferred_by']
    list_filter = ['from_officer', 'to_officer', 'transfer_date', 'transferred_by']
    search_fields = ['external_loan_application__applicant_organisation__name', 'transfer_reason']
    readonly_fields = ['date_added']
    ordering = ['-transfer_date']

@admin.register(ExternalLoanSettings)
class ExternalLoanSettingsAdmin(admin.ModelAdmin):
    list_display = ['organisation', 'default_payment_method', 'is_active', 'created_at']
    list_filter = ['default_payment_method', 'is_active', 'created_at']
    search_fields = ['organisation__name']
    readonly_fields = ['created_at', 'updated_at']
    ordering = ['-created_at']

@admin.register(ExternalLoanGuarantors)
class ExternalLoanGuarantorsAdmin(admin.ModelAdmin):
    list_display = ['external_loan_application', 'guarantor_type', 'guarantor_customer', 'guarantor_organisation', 'added_by', 'date_added']
    list_filter = ['guarantor_type', 'added_by', 'date_added']
    search_fields = ['external_loan_application__applicant_organisation__name', 'guarantor_customer__name', 'guarantor_organisation__name']
    readonly_fields = ['date_added', 'last_updated']
    ordering = ['-date_added']

@admin.register(ExternalLoanGuarantorsSecurity)
class ExternalLoanGuarantorsSecurityAdmin(admin.ModelAdmin):
    list_display = ['external_loan_guarantor', 'description', 'value', 'buying_date', 'added_by']
    list_filter = ['buying_date', 'added_by', 'date_added']
    search_fields = ['description', 'external_loan_guarantor__guarantor_customer__name', 'external_loan_guarantor__guarantor_organisation__name']
    readonly_fields = ['date_added', 'last_updated']
    ordering = ['-date_added']

@admin.register(ExternalLoanApplicationSecurity)
class ExternalLoanApplicationSecurityAdmin(admin.ModelAdmin):
    list_display = ['external_loan_application', 'description', 'value', 'buying_date', 'added_by']
    list_filter = ['buying_date', 'added_by', 'date_added']
    search_fields = ['description', 'external_loan_application__applicant_organisation__name']
    readonly_fields = ['date_added', 'last_updated']
    ordering = ['-date_added']

@admin.register(ExternalLoanIncomeSource)
class ExternalLoanIncomeSourceAdmin(admin.ModelAdmin):
    list_display = ['external_loan_application', 'source_name', 'estimated_value', 'added_by', 'date_added']
    list_filter = ['added_by', 'date_added']
    search_fields = ['source_name', 'description', 'external_loan_application__applicant_organisation__name']
    readonly_fields = ['date_added', 'last_updated']
    ordering = ['-date_added']

@admin.register(ExternalLoanMainTransactions)
class ExternalLoanMainTransactionsAdmin(admin.ModelAdmin):
    list_display = ['external_loan_application', 'transaction_type', 'amount', 'payment_method', 'transaction_status', 'payment_date']
    list_filter = ['transaction_type', 'payment_method', 'transaction_status', 'payment_date', 'added_by']
    search_fields = ['heading', 'ref_no', 'voucher_no', 'external_loan_application__applicant_organisation__name']
    readonly_fields = ['date_added', 'last_updated']
    ordering = ['-payment_date']

@admin.register(ExternalLoanRecovery)
class ExternalLoanRecoveryAdmin(admin.ModelAdmin):
    list_display = ['external_loan_application', 'recovered_amount', 'recovery_date', 'recovery_added_by']
    list_filter = ['recovery_date', 'recovery_added_by']
    search_fields = ['external_loan_application__applicant_organisation__name']
    readonly_fields = ['date_added', 'last_updated']
    ordering = ['-recovery_date']

@admin.register(ExternalLoanApplicationMember)
class ExternalLoanApplicationMemberAdmin(admin.ModelAdmin):
    list_display = ['external_loan_application', 'member_name', 'member_number', 'loan_amount', 'loan_period', 'customer', 'is_active', 'date_added']
    list_filter = ['is_active', 'date_added', 'added_by']
    search_fields = ['external_loan_application__loan_number', 'member_name', 'member_number', 'customer__name']
    readonly_fields = ['date_added', 'last_updated']
    ordering = ['-date_added']