"""
Django Middleware – migrated from app/Http/Middleware/

Mapping:
  SecureHeaders.php     → SecureHeadersMiddleware
  LimitToApiUsers.php   → IsApiUser permission class (see permissions.py)
"""

import os
from django.http import HttpResponseForbidden
import re
from django.http import HttpResponseForbidden
from decouple import config
import ipaddress
from decouple import config, Config, RepositoryEnv

env_file_path = os.environ.get('ENV_FILE') # Für LIVE und SANDBOX System
# Überprüfen, ob der Pfad existiert
if env_file_path:
    # Erstelle eine Instanz von Config und RepositoryEnv mit dem angegebenen Pfad
    config = Config(RepositoryEnv(env_file_path))


class IPAddressRestrictionMiddleware:
    # Absicherungsmechanismus für kritische Seite durch Begrenzung auch bestimmte IP-Adressen
    # 23.03.2024 fhg
    # Übernommen vom xad-Portal
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        # Definiere die regulären Ausdrücke für gesperrte URLs
        blocked_patterns = [
            r'^/.*?/portal-admin//.*$',  # Alle URLs, die /admin/ enthalten, unabhängig vom Pfad davor
            # Füge hier weitere gesperrte Muster hinzu
            # Füge hier weitere gesperrte Muster hinzu
            r'^/api/.*$', # Sperren der API gegen Angriffe
        ]
        
        # Definiere die erlaubten IP-Adressen für den Zugriff auf die gesperrten URLs
        ALLOWED_ADMIN_IPS = config("ALLOWED_ADMIN_IPS")
        IPAdressesList = ALLOWED_ADMIN_IPS.split(",")
        allowed_networks = []
        for IPNetwork in IPAdressesList:
            allowed_networks.append(ipaddress.ip_network(IPNetwork))
        
        # Überprüfe, ob die angeforderte URL einem gesperrten Muster entspricht
        for pattern in blocked_patterns:
            if re.match(pattern, request.path):
                # Überprüfe, ob die IP-Adresse des Clients in einem der erlaubten Netzwerke liegt
                client_ip = ipaddress.ip_address(request.META.get('REMOTE_ADDR'))
                if not any(client_ip in network for network in allowed_networks):
                    return HttpResponseForbidden("Forbidden: You do not have permission to access this page.")
                
        response = self.get_response(request)
        return response

class SecureHeadersMiddleware:
    """
    Migrated from app/Http/Middleware/SecureHeaders.php.

    Removes unwanted response headers and adds security headers.
    Note: X-Content-Type-Options is intentionally omitted (see original comment:
    'stört die nunito css 27.02.2023').
    """

    UNWANTED_HEADERS = ['X-Powered-By', 'Server']

    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        response = self.get_response(request)

        # Remove unwanted headers
        for header in self.UNWANTED_HEADERS:
            if header in response:
                del response[header]

        # Add security headers
        response['Referrer-Policy'] = 'no-referrer-when-downgrade'
        # response['X-Content-Type-Options'] = 'nosniff'  # disabled – see original comment
        response['X-XSS-Protection'] = '1; mode=block'
        response['X-Frame-Options'] = 'DENY'
        response['Strict-Transport-Security'] = 'max-age=31536000; includeSubDomains'
        response['Content-Security-Policy'] = "style-src 'self' 'unsafe-inline' ;"

        return response


class NutzerBesuchMiddleware:
    """Vermerkt pro Portal-Nutzer und Tag einen Besuch (Nutzungsstatistik).

    Muss hinter AuthenticationMiddleware stehen. API und Admin-Bereich
    werden uebersprungen.
    """

    AUSGENOMMEN = ('/api/', '/static/', '/portal-admin')

    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        if not request.path.startswith(self.AUSGENOMMEN) and getattr(request, 'user', None) is not None:
            from core.services.anmeldungen import vermerke_besuch
            vermerke_besuch(request)
        return self.get_response(request)
