"""
Utilities for all views

Ben Adida (12-30-2008)
"""

from django.conf import settings
from django.http import HttpResponse
from django.shortcuts import render_to_response
from django.template import loader
# nicely update the wrapper function
from functools import update_wrapper

import helios
from . import utils
from helios_auth.security import get_user

##
## BASICS
##

SUCCESS = HttpResponse("SUCCESS")

# FIXME: error code
FAILURE = HttpResponse("FAILURE")

##
## template abstraction
##
def prepare_vars(request, values):
  vars_with_user = values.copy() if values is not None else {}
  vars_with_user['user'] = get_user(request)

  # csrf protection
  if 'csrf_token' in request.session:
    vars_with_user['csrf_token'] = request.session['csrf_token']

  vars_with_user['utils'] = utils
  vars_with_user['settings'] = settings
  vars_with_user['HELIOS_STATIC'] = '/static/helios/helios'
  vars_with_user['TEMPLATE_BASE'] = helios.TEMPLATE_BASE
  vars_with_user['CURRENT_URL'] = request.path
  vars_with_user['SECURE_URL_HOST'] = settings.SECURE_URL_HOST

  return vars_with_user


def render_template(request, template_name, values = None, include_user=True):
  vars_with_user = prepare_vars(request, values)

  if not include_user:
    del vars_with_user['user']

  return render_to_response('helios/templates/%s.html' % template_name, vars_with_user)


def render_template_raw(request, template_name, values=None):
  t = loader.get_template(template_name)

  # if there's a request, prep the vars, otherwise can't do it.
  if request:
    full_vars = prepare_vars(request, values)
  else:
    full_vars = values or {}

  return t.render(context=full_vars, request=request)


def render_json(json_txt):
  return HttpResponse(utils.to_json(json_txt), content_type="application/json")


# decorator
def return_json(func):
    """
    A decorator that serializes the output to JSON before returning to the
    web client.
    """
    def convert_to_json(self, *args, **kwargs):
      return_val = func(self, *args, **kwargs)
      try:
        return render_json(return_val)
      except Exception as e:
        import logging
        logging.error("problem with serialization: " + str(return_val) + " / " + str(e))
        raise e

    return update_wrapper(convert_to_json,func)