
from django.shortcuts import redirect
from django.conf import settings
from django.utils.deprecation import MiddlewareMixin
import datetime

class SessionTimeoutMiddleware(MiddlewareMixin):
    def process_request(self, request):
        if request.session.get('user_type') == 'wholesale_customer':
            return
            
        if not request.user.is_authenticated:
            return

        current_datetime = datetime.datetime.now()
        print('current_datetime',current_datetime)
        last_activity = request.session.get('last_activity')

        timeout_seconds = getattr(settings, 'SESSION_INACTIVITY_TIMEOUT', 604800)  # 1 hour default

        if last_activity:
            elapsed_time = (current_datetime - datetime.datetime.fromisoformat(last_activity)).total_seconds()
            if elapsed_time > timeout_seconds:
                from django.contrib.auth import logout
                logout(request)
                return redirect('/')  # your login view name

        request.session['last_activity'] = current_datetime.isoformat()




# middleware.py
from django.shortcuts import render

class ForceErrorMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        try:
            response = self.get_response(request)

            if response.status_code == 404:
                # Do not intercept if it's an AJAX request or if the response is already JSON
                is_ajax = request.headers.get('x-requested-with') == 'XMLHttpRequest'
                content_type = response.get('Content-Type', '')
                
                if not is_ajax and 'application/json' not in content_type:
                    return render(request, "errors/404.html", status=404)

            return response

        except Exception:
            return render(request, "errors/500.html", status=500)


# middleware.py
from django.conf import settings
from django.shortcuts import render

class MaintenanceModeMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):

        # ✅ Allow admin even during maintenance
        if request.path.startswith('/admin/'):
            return self.get_response(request)

        # ✅ If maintenance mode ON → force 500 page
        if getattr(settings, 'MAINTENANCE_MODE', False):
            return render(request, "errors/maintanence.html", status=500)

        return self.get_response(request)


class CustomErrorMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        return self.get_response(request)

    def process_exception(self, request, exception):
        from django.conf import settings
        import traceback
        if getattr(settings, 'LIVE_SERVER', False):
            context = {
                'error': str(exception),
                'traceback': traceback.format_exc()
            }
            return render(request, 'errors/500.html', context, status=500)
        # Otherwise, Django handles it normally
        return None


class WholesaleCustomerAccessMiddleware:
    """
    Middleware to restrict wholesale customers from accessing unauthorized URLs.
    Wholesale customers can only access /wholesale/* URLs.
    """
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        # Get user type from session
        user_type = request.session.get('user_type')
        
        # If user is a wholesale customer
        if user_type == 'wholesale_customer':
            # Define allowed paths for wholesale customers
            allowed_paths = [
                '/wholesale/',
                '/static/',
                '/media/',
                '/logout',
                '/user_login/',
                '/get_imei_details/',
                '/load-brands/',
                '/load-models/',
                '/load-variants/',
                '/load-colors/',
                '/get_imei_price_details/',
            ]
            
            # Check if the current path is allowed
            is_allowed = any(request.path.startswith(path) for path in allowed_paths)
            
            # If not allowed, return 403 Forbidden page
            if not is_allowed:
                return render(request, 'errors/403.html', status=403)
        
        return self.get_response(request)
