from django.contrib import admin, messages
from django.utils.translation import ngettext
from .models import CreditProduct, LoanApplication, Loan, Repayment, RepaymentSchedule

@admin.register(CreditProduct)
class CreditProductAdmin(admin.ModelAdmin):
    list_display = ('name', 'interest_rate', 'min_amount', 'max_amount', 'max_duration_months')
    search_fields = ('name',)

@admin.register(LoanApplication)
class LoanApplicationAdmin(admin.ModelAdmin):
    list_display = ('member', 'credit_product', 'requested_amount', 'status', 'application_date')
    list_filter = ('status', 'credit_product')
    search_fields = ('member__user__email',)
    actions = ['approve_applications']

    def approve_applications(self, request, queryset):
        """Action pour approuver les demandes de prêt sélectionnées."""
        # Filtrer uniquement les demandes en attente
        pending_applications = queryset.filter(status=LoanApplication.ApplicationStatus.PENDING)
        
        updated_count = 0
        for application in pending_applications:
            application.approve(by_user=request.user)
            updated_count += 1

        if updated_count > 0:
            self.message_user(request, ngettext(
                '%d demande de prêt a été approuvée avec succès.',
                '%d demandes de prêt ont été approuvées avec succès.',
                updated_count,
            ) % updated_count, messages.SUCCESS)
        else:
            self.message_user(request, "Aucune demande en attente n'a été sélectionnée pour approbation.", messages.WARNING)
    
    approve_applications.short_description = "Approuver les demandes sélectionnées"

from apps.banking.models import Account

@admin.register(Loan)
class LoanAdmin(admin.ModelAdmin):
    list_display = ('member', 'disbursed_amount', 'status', 'disbursement_date')
    list_filter = ('status',)
    search_fields = ('member__user__email', 'loan_application__id')
    actions = ['disburse_loans']

    def disburse_loans(self, request, queryset):
        """Action pour décaisser les prêts sélectionnés."""
        try:
            loan_fund_account = Account.objects.get(type=Account.AccountType.LOAN_FUND)
        except Account.DoesNotExist:
            self.message_user(request, "Erreur : Aucun compte de type 'Fonds de Prêt' n'est configuré. Le décaissement est impossible.", messages.ERROR)
            return
        except Account.MultipleObjectsReturned:
            self.message_user(request, "Erreur : Plusieurs comptes de type 'Fonds de Prêt' existent. Le système ne peut pas décider lequel utiliser.", messages.ERROR)
            return

        updated_count = 0
        error_loans = []
        for loan in queryset:
            try:
                # On ne décaisse que les prêts qui sont actifs et non encore décaissés
                if loan.status == Loan.LoanStatus.ACTIVE and loan.disbursement_date is None:
                    loan.disburse(by_user=request.user, from_account=loan_fund_account)
                    updated_count += 1
            except ValueError as e:
                error_loans.append(f"{loan.id}: {e}")

        if updated_count > 0:
            self.message_user(request, ngettext(
                '%d prêt a été décaissé avec succès.',
                '%d prêts ont été décaissés avec succès.',
                updated_count,
            ) % updated_count, messages.SUCCESS)
        
        if error_loans:
            self.message_user(request, f"Erreurs lors du décaissement des prêts suivants : {', '.join(error_loans)}", messages.ERROR)

    disburse_loans.short_description = "Décaisser les prêts sélectionnés"

# Enregistrer les autres modèles avec une configuration par défaut pour l'instant
admin.site.register(Repayment)
admin.site.register(RepaymentSchedule)