# Copyright 2013 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

from data_source_registry import CreateDataSources
from third_party.handlebar import Handlebar
from url_constants import GITHUB_BASE, EXTENSIONS_SAMPLES


class TemplateRenderer(object):
  '''Renders templates with the server's available data sources.
  '''

  def __init__(self, server_instance):
    self._server_instance = server_instance

  def Render(self,
             template,
             request,
             data_sources=None,
             additional_context=None):
    '''Renders |template| using |request|.

    Specify |data_sources| to only include the DataSources with the given names
    when rendering the template.

    Specify |additional_context| to inject additional template context when
    rendering the template.
    '''
    assert isinstance(template, Handlebar), type(template)
    render_context = self._CreateDataSources(request)
    if data_sources is not None:
      render_context = dict((name, d) for name, d in render_context.iteritems()
                            if name in data_sources)
    render_context.update({
      'apps_samples_url': GITHUB_BASE,
      'base_path': self._server_instance.base_path,
      'extensions_samples_url': EXTENSIONS_SAMPLES,
      # TODO(kalman): Figure out where "pepperversion" comes from. It's used
      # internally in pepper and unfortunately the syntax appears to be
      # {{pepperversion}} for some reason.
      'pepperversion': '',
      'static': self._server_instance.base_path + 'static',
    })
    if additional_context:
      render_context.update(additional_context)
    render_data = template.Render(render_context)
    return render_data.text, render_data.errors

  def _CreateDataSources(self, request):
    server_instance = self._server_instance
    data_sources = CreateDataSources(server_instance, request=request)
    data_sources.update({
      'samples': server_instance.samples_data_source_factory.Create(request),
    })
    return data_sources