


# core/mixins.py
from app_admin.models import AdminUser
from django.shortcuts import redirect
from django.utils import timezone
from django.db import models
from functools import wraps
from django.contrib.auth.decorators import login_required
from django.core.exceptions import PermissionDenied
from django.shortcuts import get_object_or_404

def normale_user_required(view_func):
    def wrapper(request, *args, **kwargs):
        if isinstance(request.user, AdminUser):
            return redirect('/portal-admin/')
        return view_func(request, *args, **kwargs)
    return wrapper




# core/mixins.py - am Ende ergänzen

from functools import wraps
from django.contrib.auth.decorators import login_required
from django.core.exceptions import PermissionDenied
from django.shortcuts import get_object_or_404

from functools import wraps
from django.contrib.auth.decorators import login_required
from django.core.exceptions import PermissionDenied

def reu_person_access_required(view_func=None, reuid_kwarg='reuid'):
    def decorator(func):
        @wraps(func)
        @login_required
        def wrapper(request, *args, **kwargs):
            user = request.user

            # AdminUser → immer Zugriff
            if isinstance(user, AdminUser):
                return func(request, *args, **kwargs)

            # REUID aus URL-kwargs oder GET-Parametern holen
            reuid = kwargs.get(reuid_kwarg) or request.GET.get(reuid_kwarg)
            if reuid is None:
                raise PermissionDenied

            # Normaler User → Zugriff prüfen
            has_access = _check_reu_access(user, reuid)
            if not has_access:
                raise PermissionDenied

            return func(request, *args, **kwargs)
        return wrapper

    if view_func is not None:
        return decorator(view_func)
    return decorator


def _check_reu_access(user, reuid):
    """
    Prüft ob der Nutzer Zugriff auf die angegebene REUID hat.

    Zugriff besteht, wenn der Nutzer für die REUID ein laufendes
    Nutzungsverhältnis hat – als Mieter ODER als Eigentümer. Die Vereinigung
    beider Tabellen passiert ausschließlich in core.services.
    """
    # Import hier um Zirkular-Importe zu vermeiden
    from core.services.nutzungsverhaeltnisse import hat_zugriff

    return hat_zugriff(user, reuid)





# core/mixins.py  (am Ende der Datei ergänzen)
from django.contrib import admin

class ReadOnlyAdmin(admin.ModelAdmin):
    def has_change_permission(self, request, obj=None):
        return False
    def has_add_permission(self, request):
        return False
    def has_delete_permission(self, request, obj=None):
        return False


def get_accessible_reuids(user):
    """
    Gibt eine Liste von REUID-Integern zurück, auf die der User Zugriff hat.

    - AdminUser: alle RealEstateUnit-PKs (ohne N+1, single Query)
    - User: alle REUIDs mit laufendem Nutzungsverhältnis – Miet- wie
            Eigentumsverhältnisse
    """
    from app_real_estate.models import RealEstateUnit
    from core.services.nutzungsverhaeltnisse import reuids_fuer_user

    if isinstance(user, AdminUser):
        return list(
            RealEstateUnit.objects
            .values_list('REUID', flat=True)
            .order_by('REUID')
        )

    return reuids_fuer_user(user)