from django.contrib import admin
from django.contrib import messages
from .models import Invoice, InvoicePayment
from .scoring import InvoiceScoringAlgorithm

@admin.register(Invoice)
class InvoiceAdmin(admin.ModelAdmin):
    list_display = ['invoice_number', 'client_company', 'invoice_amount', 'discounting_amount', 'status', 'due_date']
    list_filter = ['status', 'invoice_date', 'due_date']
    search_fields = ['invoice_number', 'client_company']
    readonly_fields = ['id', 'created_at', 'updated_at', 'discounting_amount', 'interest_rate', 'interest_amount']
    
    fieldsets = (
        ('Invoice Details', {
            'fields': ('credit_application', 'invoice_number', 'client_company', 'invoice_date', 'due_date', 'invoice_amount')
        }),
        ('Funding Details', {
            'fields': ('discounting_amount', 'interest_rate', 'interest_amount')
        }),
        ('Status', {
            'fields': ('status', 'notes')
        }),
        ('Supporting Documents', {
            'fields': ('supporting_document',)
        }),
    )
    
    actions = ['calculate_scores', 'approve_invoices', 'process_funding']
    
    def calculate_scores(self, request, queryset):
        for invoice in queryset:
            scorer = InvoiceScoringAlgorithm(invoice, invoice.credit_application)
            score = scorer.calculate_score()
            decision, message = scorer.make_decision()
            
            invoice.notes = f"Score: {score}% - {message}\n{invoice.notes}"
            invoice.save()
            
        self.message_user(request, f"Calculated scores for {queryset.count()} invoices")
    calculate_scores.short_description = "Calculate risk scores for selected invoices"
    
    def approve_invoices(self, request, queryset):
        for invoice in queryset:
            if invoice.status == 'SUBMITTED':
                scorer = InvoiceScoringAlgorithm(invoice, invoice.credit_application)
                score = scorer.calculate_score()
                decision, message = scorer.make_decision()
                
                if decision:
                    invoice.status = 'APPROVED'
                    invoice.save()
                    self.message_user(request, f"Approved {invoice.invoice_number} - {message}", level=messages.SUCCESS)
                else:
                    self.message_user(request, f"Refer {invoice.invoice_number} - {message}", level=messages.WARNING)
                    
    approve_invoices.short_description = "Score and approve selected invoices"
    
    def process_funding(self, request, queryset):
        count = queryset.filter(status='APPROVED').update(status='FUNDED')
        self.message_user(request, f"Processed funding for {count} invoices")
    process_funding.short_description = "Process funding for approved invoices"

@admin.register(InvoicePayment)
class InvoicePaymentAdmin(admin.ModelAdmin):
    list_display = ['invoice', 'amount_paid', 'payment_date', 'transaction_reference', 'status']
    list_filter = ['status', 'payment_date']
    search_fields = ['transaction_reference', 'invoice__invoice_number']