from django.contrib.sessions.models import Session

from apps.process.utils import get_client_ip
from apps.accounts.models import User, LoginInUser
from django.middleware import csrf


class OneSessionPerUserMiddleware:
    # Called only once when the web server starts
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        # Code to be executed for each request before the view (and later middleware) are called.
        if isinstance(request.user, User) and request.user.is_authenticated:
            try:
                stored_session_key = request.user.login_in_user.session_key
                # if there is a stored_session_key in the database and it is different from the current session,
                # delete the stored_session_key session_key with from the Session table
                if stored_session_key and stored_session_key != request.session.session_key:
                    try:
                        Session.objects.get(session_key=stored_session_key).delete()
                    except Session.DoesNotExist:
                        pass
                request.user.login_in_user.session_key = request.session.session_key
                request.user.login_in_user.ip_address  = get_client_ip(request)
                request.user.login_in_user.save()
            except LoginInUser.DoesNotExist:
                LoginInUser.objects.create(user=request.user, session_key=session_key, ip_address=get_client_ip(request))
        response = self.get_response(request)
        # This is where you add any extra code to be executed for each request/response after the view is called.
        return response

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

    def __call__(self, request):
        response = self.get_response(request)
        response["Referrer-Policy"] = "no-referrer-when-downgrade"
        return response