# coding:utf-8
'''
Created on 2009-12-30

@author: Jason Green
@author-email: guileen@gmail.com
'''
from jinja2 import Environment
from django.conf import settings

def _new_env(env_class):
    from jinja2 import PackageLoader, ChoiceLoader, FileSystemLoader
    loader_array = []
    for pth in getattr(settings, 'TEMPLATE_DIRS', ()):
        loader_array.append(FileSystemLoader(pth))
    
    for app in settings.INSTALLED_APPS:
        loader_array.append(PackageLoader(app))
    
    # Setup environment
    global_exts = getattr(settings, 'JINJA_EXTS', ())
    env = object.__new__(env_class)
    env_class.__init__(env,extensions=global_exts, loader=ChoiceLoader(loader_array))
    return env
    
def _init_env(env):
    from django.core.urlresolvers import get_callable
    from django.utils import translation
    global_exts = getattr(settings, 'JINJA_EXTS', ())
    if 'jinja2.ext.i18n' in global_exts:
        env.install_gettext_translations(translation)
    
    # Add user Globals, Filters, Tests
    global_imports = getattr(settings, 'JINJA_GLOBALS', ())
    for imp in global_imports:
        method = get_callable(imp)
        method_name = getattr(method,'jinja_name',None)
        if not method_name == None:
            env.globals[method_name] = method
        else:
            env.globals[method.__name__] = method
    env.globals['settings'] = settings
    env.globals['get_language'] = translation.get_language
    env.globals['get_language_bidi'] = translation.get_language_bidi
    
    import datetime
    env.globals['datetime'] = datetime
    
    global_filters = getattr(settings, 'JINJA_FILTERS', ())
    for imp in global_filters:
        method = get_callable(imp)
        method_name = getattr(method,'jinja_name',None)
        if not method_name == None:
            env.filters[method_name] = method
        else:
            env.filters[method.__name__] = method
    
    global_tests = getattr(settings, 'JINJA_TESTS', ())
    for imp in global_tests:
        method = get_callable(imp)
        method_name = getattr(method,'jinja_name',None)
        if not method_name == None:
            env.tests[method_name] = method
        else:
            env.tests[method.__name__] = method
    

def install(env=Environment):
    if(isinstance(env,type) and (env==Environment or issubclass(env,Environment))):
        env = _new_env(env)
    _init_env(env)
    
    #override jinja2.Template.render
    from jinja2 import Template
    from django.template.context import Context
    _raw_render = Template.render 
    def _new_render(self, *args, **kwargs):
        if(len(args)>0 and isinstance(args[0],Context)):
            c = {}
            for d in args[0].dicts:
                c.update(d)
            return _raw_render(self,c)
        return _raw_render(self, *args, **kwargs)
    Template.render = _new_render
    
    #override djloader.get_template
    import django.template.loader as djloader
    from django.template.loader import get_template as _original_get_template
    def get_template(template_name):
        for skip_path in getattr(settings, 'KEEP_DJANGO_TEMPLATES', ()):
            if template_name.startswith(skip_path):
                return _original_get_template(template_name)
        return env.get_template(template_name)

    djloader.get_template = get_template