"""
app_admin/views.py

Custom-Views für die Portal-Administration (admin_site).

nutzer_suche_view: Drilldown-Suche Immobilie -> Nutzungseinheit -> Nutzer
mit Direktlinks in die Portal-Ansichten (Übersicht, Verbrauch, Nutzerdaten).
"""

from django.db.models import Q
from django.shortcuts import render
from django.urls import reverse
from django.utils import timezone

from app_nutzer.models import ReuMietV, User
from app_real_estate.models import RealEstate, RealEstateUnit

# Maximale Trefferzahl der Immobiliensuche
MAX_RESULTS = 50


def _int_or_none(value):
    try:
        return int(value)
    except (TypeError, ValueError):
        return None


def _display_name(user):
    """Anzeigename eines Nutzers – fällt auf Rohdaten zurück, falls
    get_name() wegen fehlender/unbekannter SalutationID scheitert."""
    if user is None:
        return '(kein Nutzer-Datensatz)'
    try:
        return user.fullName
    except Exception:
        parts = ' '.join(p for p in (user.firstname, user.lastname) if p).strip()
        return parts or user.companyname or user.email


def _portal_links(reuid, nutzer_id):
    return [
        ('Übersicht', reverse('app_verbrauch:uebersicht',
                              kwargs={'reuid': reuid, 'nutzer_id': nutzer_id})),
        ('Verbrauch', reverse('app_verbrauch:verbrauch_chart',
                              kwargs={'reuid': reuid, 'nutzer_id': nutzer_id})),
        ('Verbrauch (normiert)', reverse('app_verbrauch:verbrauch_chart_spez',
                                         kwargs={'reuid': reuid, 'nutzer_id': nutzer_id})),
        ('Nutzerdaten', reverse('app_nutzer:nutzerdaten',
                                kwargs={'reuid': reuid, 'nutzer_id': nutzer_id})),
    ]


def nutzer_suche_view(request):
    """GET /portal-admin/nutzer-suche/ – Drilldown Immobilie → Einheit → Nutzer."""
    from app_admin.admin import admin_site  # lazy: vermeidet Zirkular-Import

    q = (request.GET.get('q') or '').strip()
    reid = _int_or_none(request.GET.get('reid'))
    reuid = _int_or_none(request.GET.get('reuid'))
    nutzer_id = _int_or_none(request.GET.get('nutzer_id'))

    # ── 1. Immobiliensuche ────────────────────────────────────────────────
    immobilien = []
    truncated = False
    if q:
        filters = (
            Q(Street__icontains=q)
            | Q(HouseNumber__icontains=q)
            | Q(PostalCode__icontains=q)
            | Q(City__icontains=q)
        )
        if q.isdigit():
            filters |= Q(REID=int(q))
        immobilien = list(
            RealEstate.objects.filter(filters)
            .order_by('City', 'Street', 'HouseNumber')[:MAX_RESULTS + 1]
        )
        truncated = len(immobilien) > MAX_RESULTS
        immobilien = immobilien[:MAX_RESULTS]

    # ── 2. Einheiten der gewählten Immobilie ──────────────────────────────
    einheit = None
    if reuid:
        einheit = RealEstateUnit.objects.select_related('REID').filter(REUID=reuid).first()
        if einheit is None:
            reuid = None
        elif reid is None and einheit.REID_id:
            reid = einheit.REID_id

    immobilie = RealEstate.objects.filter(REID=reid).first() if reid else None

    einheiten = []
    if immobilie:
        einheiten = list(
            RealEstateUnit.objects.filter(REID=immobilie).order_by('REUDesc', 'REUID')
        )

    # Einheit muss zur gewählten Immobilie gehören
    if einheit and immobilie and einheit.REID_id != immobilie.REID:
        einheit, reuid = None, None

    # ── 3. Nutzer / Mietverhältnisse der gewählten Einheit ────────────────
    mietverhaeltnisse = []
    nutzer_auswahl = None
    if einheit:
        # Miet- UND Eigentumsverhaeltnisse in einer Liste. Gemergt wird im
        # Service, nicht hier - sonst laufen Admin-Sicht und Portal-Sicht
        # auseinander. nur_aktive=False, damit auch beendete pruefbar bleiben.
        from core.services.nutzungsverhaeltnisse import lade_verhaeltnisse

        verhaeltnisse = lade_verhaeltnisse(reuids=[einheit.REUID], nur_aktive=False)
        verhaeltnisse.reverse()  # juengstes zuerst

        users = {
            u.PersonenID: u
            for u in User.objects.filter(
                PersonenID__in=[nv.personen_id for nv in verhaeltnisse]
            )
        }
        vertraege_nach_id = {
            mv.MietVID: mv for mv in ReuMietV.objects.filter(REUID=einheit)
        }
        today = timezone.now().date()
        for nv in verhaeltnisse:
            nutzer = users.get(nv.personen_id)
            eintrag = {
                # 'vertrag' nur bei Mietverhaeltnissen - das Template verlinkt
                # darueber auf die ReuMietV-Aenderungsseite.
                'vertrag': None if nv.ist_eigentuemer else vertraege_nach_id.get(nv.quell_id),
                'verhaeltnis': nv,
                'art': nv.art,
                'ist_eigentuemer': nv.ist_eigentuemer,
                'nutzer': nutzer,
                'nutzer_id': nv.personen_id,
                'name': _display_name(nutzer),
                'email': nutzer.email if nutzer else '',
                'aktiv': nv.ist_aktiv(today),
                'selected': nv.personen_id == nutzer_id,
            }
            mietverhaeltnisse.append(eintrag)
            if eintrag['selected'] and nutzer_auswahl is None:
                nutzer_auswahl = eintrag

    # ── 4. Portal-Links für die getroffene Auswahl ────────────────────────
    portal_links = []
    if einheit and nutzer_auswahl:
        portal_links = _portal_links(einheit.REUID, nutzer_auswahl['nutzer_id'])

    context = {
        **admin_site.each_context(request),
        'title': 'Nutzer-Suche',
        'q': q,
        'immobilien': immobilien,
        'truncated': truncated,
        'max_results': MAX_RESULTS,
        'immobilie': immobilie,
        'einheiten': einheiten,
        'einheit': einheit,
        'mietverhaeltnisse': mietverhaeltnisse,
        'nutzer_auswahl': nutzer_auswahl,
        'portal_links': portal_links,
    }
    return render(request, 'app_admin/nutzer_suche.html', context)
