# osmo_gsm_tester: automated cellular network hardware tests
# Proxy to templating engine to handle files
#
# Copyright (C) 2016-2017 by sysmocom - s.f.m.c. GmbH
#
# Author: Neels Hofmeyr <neels@hofmeyr.de>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.

import os
from mako.lookup import TemplateLookup, Template

from . import log
from .util import dict2obj

_lookup = None
_logger = log.Origin(log.C_CNF, 'no templates dir set')

def set_templates_dir(*templates_dirs):
    global _lookup
    global _logger
    if not templates_dirs:
        # default templates dir is relative to this source file
        templates_dirs = [os.path.join(os.path.dirname(__file__), 'templates')]
    for d in templates_dirs:
        if not os.path.isdir(d):
            raise RuntimeError('templates dir is not a dir: %r'
                               % os.path.abspath(d))
    _lookup = TemplateLookup(directories=templates_dirs)
    _logger = log.Origin(log.C_CNF, 'Templates')

def render(name, values):
    '''feed values dict into template and return rendered result.
       ".tmpl" is added to the name to look it up in the templates dir.'''
    global _lookup
    if _lookup is None:
        set_templates_dir()
    tmpl_name = name + '.tmpl'
    log.ctx(tmpl_name)
    template = _lookup.get_template(tmpl_name)
    _logger.dbg('rendering', tmpl_name)

    return template.render(**dict2obj(values))

def render_strbuf_inline(strbuf, values):
    '''Receive a string containing template syntax, and generate output using
       passed values.'''
    mytemplate = Template(strbuf)
    return mytemplate.render(**dict2obj(values))

# vim: expandtab tabstop=4 shiftwidth=4
