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:
    username = getattr(_request_ctx_stack.top, 'authenticated_username', None)
    if not username:
      logger.debug('No authenticated user or deferred username.')
      return None

    logger.debug('Loading deferred authenticated user.')
    loaded = model.get_user(username)
    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):
  ctx = _request_ctx_stack.top
  ctx.authenticated_user = user_or_robot


def set_authenticated_user_deferred(username_or_robotname):
  logger.debug('Deferring loading of authenticated user object: %s', username_or_robotname)
  ctx = _request_ctx_stack.top
  ctx.authenticated_username = username_or_robotname


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_token():
  return getattr(_request_ctx_stack.top, 'validated_token', None)


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