from django.contrib import admin
from django.db.models import Sum
from django.urls import reverse
from django.utils.html import format_html

from ..models import Foerderung


@admin.register(Foerderung)
class FoerderungAdmin(admin.ModelAdmin):
    list_display = [
        "destinataer",
        "jahr",
        "betrag",
        "verwendungsnachweis_link",
        "total_for_destinataer",
    ]
    list_filter = ["jahr", "destinataer__familienzweig"]
    search_fields = [
        "destinataer__nachname",
        "destinataer__vorname",
        "destinataer__familienzweig",
    ]
    ordering = ["-jahr", "-betrag"]
    readonly_fields = ["id"]

    fieldsets = (
        (
            "Förderung",
            {
                "fields": (
                    "destinataer",
                    "person",
                    "jahr",
                    "betrag",
                    "kategorie",
                    "status",
                )
            },
        ),
        ("Dokumentation", {"fields": ("verwendungsnachweis", "bemerkungen")}),
        ("Daten", {"fields": ("antragsdatum", "entscheidungsdatum")}),
        ("System", {"fields": ("id",), "classes": ("collapse",)}),
    )

    def verwendungsnachweis_link(self, obj):
        if obj.verwendungsnachweis:
            return format_html(
                '<a href="{}">{}</a>',
                reverse(
                    "admin:stiftung_dokumentlink_change",
                    args=[obj.verwendungsnachweis.id],
                ),
                obj.verwendungsnachweis.titel,
            )
        return "-"

    verwendungsnachweis_link.short_description = "Verwendungsnachweis"

    def total_for_destinataer(self, obj):
        total = (
            Foerderung.objects.filter(destinataer=obj.destinataer).aggregate(
                Sum("betrag")
            )["betrag__sum"]
            or 0
        )
        return f"€{total:,.2f}"

    total_for_destinataer.short_description = "Gesamt für Destinatär"
