from django.shortcuts import render, redirect
from django.utils.deprecation import MiddlewareMixin
from ai_features.models import AIConfiguration
from django.utils import timezone
from datetime import timedelta

class MaintenanceModeMiddleware(MiddlewareMixin):
    def process_request(self, request):
        try:
            config = AIConfiguration.get_settings()
        except Exception:
            return None
        if not config or not getattr(config, 'maintenance_mode', False):
            return None
        path_lower = (request.path or '').lower()
        if path_lower.startswith('/static/') or path_lower.startswith('/media/') or path_lower == '/favicon.ico':
            return None
        if 'admin' in path_lower:
            return None
        user = getattr(request, 'user', None)
        access_mode = getattr(config, 'maintenance_access_mode', 'SUPERUSER_ONLY')
        allowed_paths = [
            '/staff/login/',
            '/accounts/login/',
            '/login/',
            '/healthz',
            '/maintenance/off/',
            '/maintenance/off',
            '/AiBiMagics/maintenance/off/',
        ]
        for ap in allowed_paths:
            apl = ap.lower()
            if path_lower.startswith(apl) or ('/maintenance/off' in path_lower):
                return None
        end_time = getattr(config, 'maintenance_end_time', None) or (timezone.now() + timedelta(hours=3))
        mode_str = 'superuser_only' if access_mode == 'SUPERUSER_ONLY' else ('staff_only' if access_mode == 'STAFF_ONLY' else 'registered_only')
        context = {
            'site_name': getattr(config, 'site_name', 'AiBiMagics'),
            'meta_keywords': getattr(config, 'meta_keywords', ''),
            'meta_description': getattr(config, 'meta_description', ''),
            'maintenance_message': getattr(config, 'maintenance_message', ''),
            'maintenance_mode': mode_str,
            'is_authenticated': bool(user and getattr(user, 'is_authenticated', False)),
            'show_countdown': True,
            'end_time': end_time,
        }
        return render(request, 'maintenance.html', context, status=503)
