# # myapp/middleware.py

import threading
from django.contrib.auth.models import AnonymousUser
from django.utils.functional import SimpleLazyObject
from django.contrib.auth import get_user_model
from django.utils.functional import lazy

User = get_user_model()
_user = threading.local()

def get_current_user():
    user = getattr(_user, 'value', None)
    if isinstance(user, AnonymousUser) or user is None:
        return None
    return user

class CurrentUserMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        user = request.user

        # Safely unwrap SimpleLazyObject if needed
        try:
            if isinstance(user, SimpleLazyObject):
                user = user._wrapped  # This forces evaluation
        except Exception:
            user = None

        if isinstance(user, (User, AnonymousUser)):
            _user.value = user
        else:
            _user.value = None

        response = self.get_response(request)
        _user.value = None  # Clean up thread-local
        return response
