// Copyright 2012 Google Inc. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package com.google.gitiles;

import static com.google.common.base.Preconditions.checkState;
import static java.util.stream.Collectors.toList;

import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Streams;
import com.google.common.hash.HashCode;
import com.google.template.soy.SoyFileSet;
import com.google.template.soy.tofu.SoyTofu;
import java.io.File;
import java.net.URISyntaxException;
import java.net.URL;

/** Renderer that reloads Soy templates from the filesystem on every request. */
public class DebugRenderer extends Renderer {
  public DebugRenderer(
      String staticPrefix,
      Iterable<String> customTemplatesFilenames,
      final String soyTemplatesRoot,
      String siteTitle) {
    super(
        fileUrlMapper(soyTemplatesRoot + File.separator),
        ImmutableMap.<String, String>of(),
        staticPrefix,
        Streams.stream(customTemplatesFilenames).map(fileUrlMapper()).collect(toList()),
        siteTitle);
  }

  @Override
  public HashCode getTemplateHash(String soyFile) {
    return computeTemplateHash(soyFile);
  }

  @Override
  protected SoyTofu getTofu() {
    SoyFileSet.Builder builder = SoyFileSet.builder().setCompileTimeGlobals(globals);
    for (URL template : templates.values()) {
      try {
        checkState(new File(template.toURI()).exists(), "Missing Soy template %s", template);
      } catch (URISyntaxException e) {
        throw new IllegalStateException(e);
      }
      builder.add(template);
    }
    return builder.build().compileToTofu();
  }
}
