"""
Middleware pour Flask qui permet de gérer le rechargement des ressources statiques.
"""

import os
import re
from functools import wraps
from flask import request, make_response

class CacheBustingMiddleware:
    """
    Middleware qui ajoute un timestamp aux URLs des images 
    pour forcer le rechargement lors des modifications.
    """
    
    def __init__(self, app=None):
        self.app = app
        if app:
            self.init_app(app)
    
    def init_app(self, app):
        """Initialise le middleware avec l'application Flask"""
        self.app = app
        self.enabled = app.config.get('IMAGE_CACHE_BUSTING', False)
        self.static_folder = app.static_folder
        
        # Si le middleware est activé, enregistrer les fonctions d'interception
        if self.enabled:
            app.after_request(self.process_response)
    
    def process_response(self, response):
        """Ajoute un timestamp aux URLs des images dans les réponses HTML"""
        if not self.enabled:
            return response
        
        # Vérifier si c'est une réponse HTML
        content_type = response.headers.get('Content-Type', '')
        if not content_type.startswith('text/html'):
            return response
        
        # Récupérer le contenu de la réponse
        content = response.get_data(as_text=True)
        
        # Pattern pour trouver les URLs d'images
        img_pattern = re.compile(r'(src|href)=["\']([^"\']*\.(jpg|jpeg|png|gif|svg|css|js))["\']', re.IGNORECASE)
        
        # Fonction pour ajouter un timestamp à l'URL
        def add_timestamp(match):
            attr, url, ext = match.groups()
            
            # Ne pas modifier les URLs externes
            if url.startswith(('http://', 'https://', '//')):
                return match.group(0)
            
            # Vérifier si l'URL correspond à un fichier statique
            if url.startswith('/static/') or url.startswith('static/'):
                # Extraire le chemin relatif
                rel_path = url[url.find('static/') + 7:]
                file_path = os.path.join(self.static_folder, rel_path)
                
                # Vérifier si le fichier existe
                if os.path.exists(file_path):
                    # Obtenir la date de dernière modification
                    mtime = int(os.path.getmtime(file_path))
                    
                    # Ajouter ou mettre à jour le paramètre de timestamp
                    if '?' in url:
                        if 't=' in url:
                            # Remplacer le timestamp existant
                            url = re.sub(r't=\d+', f't={mtime}', url)
                        else:
                            # Ajouter le timestamp comme paramètre supplémentaire
                            url = f"{url}&t={mtime}"
                    else:
                        # Ajouter le timestamp comme premier paramètre
                        url = f"{url}?t={mtime}"
            
            return f'{attr}="{url}"'
        
        # Remplacer toutes les occurrences
        modified_content = img_pattern.sub(add_timestamp, content)
        
        # Créer une nouvelle réponse avec le contenu modifié
        response.set_data(modified_content)
        return response


def setup_middleware(app):
    """Configure tous les middlewares nécessaires pour l'application"""
    # Activer le middleware de cache-busting pour les images
    cache_busting = CacheBustingMiddleware()
    cache_busting.init_app(app)