from django.contrib import admin
from django.urls import reverse, NoReverseMatch


def card(kind, row):
    """Explicit field allowlist: never dump model dictionaries, contacts or notes."""
    state = getattr(row, "status", "")
    if kind == "cases":
        title, subtitle = row.job_number, str(row.service_center)
        facts = [("Customer", row.customer.display_name), ("Device", str(row.device.product_model)), ("Accepted", row.received_at)]
    elif kind == "customers":
        title, subtitle = row.customer_number, row.display_name
        facts = [("Company", str(row.company)), ("Active", row.is_active)]
    elif kind == "devices":
        title, subtitle = str(row.pk), str(row.product_model)
        facts = [("Variant", str(row.product_variant) if row.product_variant else "Not recorded"), ("Active", row.is_active)]
    elif kind == "quotations":
        title, subtitle = str(row), str(row.family.service_case.service_center)
        facts = [("Case", row.family.service_case.job_number), ("Currency", row.currency), ("Quotation total", row.grand_total)]
    elif kind == "invoices":
        title, subtitle = row.number, str(row.service_center)
        facts = [("Case", row.service_case.job_number), ("Currency", row.currency), ("Invoice value (not revenue)", row.grand_total)]
    elif kind == "payments":
        receipt = getattr(row, "receipt", None)
        title, subtitle = receipt.number if receipt else str(row.pk), str(row.service_center)
        facts = [("Invoice", row.invoice.number), ("Currency", row.currency), ("Amount", row.amount), ("Received", row.received_at)]
    elif kind == "parts":
        title, subtitle = row.part_code, row.name
        facts = [("Category", str(row.category)), ("Serialization policy", row.serialization_policy)]
    elif kind == "inventory":
        title, subtitle = row.code, row.name
        facts = [("Company", str(row.company)), ("Center", str(row.service_center) if row.service_center else "Company location"), ("Type", row.location_type)]
    else:
        title, subtitle = str(row.pk), str(row.service_center)
        facts = [("Customer", row.customer.display_name), ("Date", row.slot.date), ("Start", row.slot.start_time)]
    return {"title": title, "subtitle": subtitle, "facts": facts, "state": state,
            "url": reverse("operations:detail", args=[kind, row.pk]), "kind": kind}


def admin_link(request, row):
    if not request.user.is_staff:
        return None
    registered = admin.site._registry.get(type(row))
    if not registered or not registered.has_view_permission(request, row):
        return None
    try:
        return reverse(f"admin:{row._meta.app_label}_{row._meta.model_name}_change", args=[row.pk])
    except NoReverseMatch:
        return None
