"""
Web views – migrated from app/Http/Controllers/ (web routes)

Mapping:
  UserController.create           → register_view
  UserController.store            → register_store
  MietVController.erste_uebersicht → erste_uebersicht
  MietVController.uebersicht      → mietve_uebersicht
  MietVController.verbrauch       → mietve_verbrauch
  MietVController.verbrauch_spez  → mietve_verbrauch_spez
  MietVController.mietvdaten      → mietve_daten
  Inline route /stammdaten        → stammdaten_view  (stub)

Auth, password management, and einstellungen have moved to app_nutzer/views.py.
"""

import re

from django.shortcuts import render, redirect
from django.contrib.auth import login
from django.contrib.auth.decorators import login_required
from django.contrib import messages
from django.http import HttpResponse, Http404
from django.db import connection

from app_nutzer.models import User


# ---------------------------------------------------------------------------
# MietV Views – migrated from MietVController
# ---------------------------------------------------------------------------

@login_required
def erste_uebersicht(request):
    """GET / – redirect to first tenancy. Migrated from MietVController.erste_uebersicht()."""
    from core.services.nutzungsverhaeltnisse import verhaeltnisse_fuer_user

    verhaeltnisse = verhaeltnisse_fuer_user(request.user)
    if verhaeltnisse:
        erste = verhaeltnisse[0]
        return redirect(
            f'/verbrauch/reu/{erste.reuid}/nu/{erste.personen_id}/uebersicht'
        )

    return HttpResponse(
        'Ungültige Anfrage #2334. Wenden Sie sich an den Administrator von Xandas',
        status=404
    )


# ---------------------------------------------------------------------------
# Stammdaten view – migrated from inline route (stub)
# ---------------------------------------------------------------------------

@login_required
def stammdaten_view(request):
    """GET /stammdaten."""
    return render(request, 'stammdaten.html')


# ---------------------------------------------------------------------------
# Error views
# ---------------------------------------------------------------------------

def error_404(request):
    """GET /404."""
    return HttpResponse('<h1>Fehler 404. Ziel nicht vorhanden</h1>', status=404)


# ---------------------------------------------------------------------------
# REUID-Wechsel mit Validierung der reuid+nutzer_id-Kombination
# ---------------------------------------------------------------------------

@login_required
def switch_reuid(request):
    """GET /switch-reuid/ – wechselt REUID und validiert die Kombination mit nutzer_id."""
    from app_admin.mixins import get_accessible_reuids
    from core.services.nutzungsverhaeltnisse import lade_verhaeltnisse

    next_url = request.GET.get('next', '/')
    try:
        new_reuid = int(request.GET.get('reuid', ''))
    except (ValueError, TypeError):
        return redirect(next_url)

    # Zugriffsprüfung
    if new_reuid not in get_accessible_reuids(request.user):
        messages.error(request, 'Kein Zugriff auf die gewählte Einheit.')
        return redirect(next_url)

    # Nutzungsverhältnisse der Zieleinheit – Mieter wie Eigentümer
    verhaeltnisse = lade_verhaeltnisse(reuids=[new_reuid])

    # Gewünschte nutzer_id beibehalten, falls Kombination gültig ist
    valid_nuid = None
    try:
        requested_nuid = int(request.GET.get('nutzer_id', ''))
        if any(nv.personen_id == requested_nuid for nv in verhaeltnisse):
            valid_nuid = requested_nuid
    except (ValueError, TypeError):
        pass

    # Fallback: ersten Nutzer der neuen Einheit nehmen
    if valid_nuid is None and verhaeltnisse:
        valid_nuid = verhaeltnisse[0].personen_id

    if valid_nuid is None:
        messages.error(request, 'Für die gewählte Einheit wurden keine Nutzerdaten gefunden.')
        return redirect(next_url)

    # REUID und nutzer_id in der Ziel-URL ersetzen
    updated = re.sub(r'/reu/\d+/', f'/reu/{new_reuid}/', next_url)
    updated = re.sub(r'/nu/\d+/', f'/nu/{valid_nuid}/', updated)

    if updated == next_url:
        updated = f'/verbrauch/reu/{new_reuid}/nu/{valid_nuid}/uebersicht'

    return redirect(updated)
