import logging

from flask import _request_ctx_stack
from data import model


logger = logging.getLogger(__name__)


def get_authenticated_user():
  user = getattr(_request_ctx_stack.top, 'authenticated_user', None)
  if not user:
    user_uuid = getattr(_request_ctx_stack.top, 'authenticated_user_uuid', None)
    if not user_uuid:
      logger.debug('No authenticated user or deferred user uuid.')
      return None

    logger.debug('Loading deferred authenticated user.')
    loaded = model.user.get_user_by_uuid(user_uuid)
    if not loaded.enabled:
      return None

    set_authenticated_user(loaded)
    user = loaded

  if user:
    logger.debug('Returning authenticated user: %s', user.username)
  return user


def set_authenticated_user(user_or_robot):
  if not user_or_robot.enabled:
    raise Exception('Attempt to authenticate a disabled user/robot: %s' % user_or_robot.username)

  ctx = _request_ctx_stack.top
  ctx.authenticated_user = user_or_robot


def get_grant_context():
  return getattr(_request_ctx_stack.top, 'grant_context', None)


def set_grant_context(grant_context):
  ctx = _request_ctx_stack.top
  ctx.grant_context = grant_context


def set_authenticated_user_deferred(user_or_robot_db_uuid):
  logger.debug('Deferring loading of authenticated user object with uuid: %s', user_or_robot_db_uuid)
  ctx = _request_ctx_stack.top
  ctx.authenticated_user_uuid = user_or_robot_db_uuid


def get_validated_oauth_token():
  return getattr(_request_ctx_stack.top, 'validated_oauth_token', None)


def set_validated_oauth_token(token):
  ctx = _request_ctx_stack.top
  ctx.validated_oauth_token = token


def get_validated_app_specific_token():
  return getattr(_request_ctx_stack.top, 'validated_app_specific_token', None)


def set_validated_app_specific_token(token):
  ctx = _request_ctx_stack.top
  ctx.validated_app_specific_token = token


def get_validated_token():
  return getattr(_request_ctx_stack.top, 'validated_token', None)


def set_validated_token(token):
  ctx = _request_ctx_stack.top
  ctx.validated_token = token