"""passbook decorators"""
from time import time as timestamp

from django.conf import settings
from django.shortcuts import redirect
from django.urls import reverse
from django.utils.functional import wraps
from django.utils.http import urlencode

RE_AUTH_KEY = getattr(settings, 'RE_AUTH_KEY', 'passbook_require_re_auth_done')
RE_AUTH_MARGAIN = getattr(settings, 'RE_AUTH_MARGAIN', 300)


def reauth_required(view_function):
    """Decorator to force a re-authentication before continuing"""

    @wraps(view_function)
    def wrap(*args, **kwargs):
        """check if user just authenticated or not"""

        request = args[0] if args else None
        # Check if user is authenticated at all
        if not request or not request.user or not request.user.is_authenticated:
            return redirect(reverse('account-login'))

        now = timestamp()

        if RE_AUTH_KEY in request.session and \
                request.session[RE_AUTH_KEY] < (now - RE_AUTH_MARGAIN):
            # Timestamp in session but expired
            del request.session[RE_AUTH_KEY]

        if RE_AUTH_KEY not in request.session:
            # Timestamp not in session, force user to reauth
            return redirect(reverse('account-reauth') + '?' +
                            urlencode({'next': request.path}))

        if RE_AUTH_KEY in request.session and \
                request.session[RE_AUTH_KEY] >= (now - RE_AUTH_MARGAIN) and \
                request.session[RE_AUTH_KEY] <= now:
            # Timestamp in session and valid
            return view_function(*args, **kwargs)

        # This should never be reached, just return False
        return False  # pragma: no cover
    return wrap