// Copyright (C) 2014 The Android Open Source Project
//
// 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.googlesource.gerrit.plugins.scripting.scala;

import com.google.gerrit.server.plugins.AbstractPreloadedPluginScanner;
import com.google.gerrit.server.plugins.InvalidPluginException;
import com.google.gerrit.server.plugins.Plugin;
import com.google.gerrit.server.plugins.PluginEntry;
import com.googlesource.gerrit.plugins.web.WebPluginScanner;
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Path;
import java.util.Enumeration;
import java.util.Optional;
import java.util.Set;

public class ScalaPluginScanner extends AbstractPreloadedPluginScanner {
  private final WebPluginScanner webScanner;

  public ScalaPluginScanner(String pluginName, Path srcFile, ScalaPluginScriptEngine scriptEngine)
      throws InvalidPluginException {
    super(
        pluginName,
        getPluginVersion(srcFile),
        loadScriptClasses(srcFile, scriptEngine),
        Plugin.ApiType.PLUGIN);

    this.webScanner = new WebPluginScanner(srcFile);
  }

  private static String getPluginVersion(Path srcFile) {
    String srcFileName = srcFile.getFileName().toString();
    int startPos = srcFileName.lastIndexOf('-');
    if (startPos == -1) {
      return "0";
    }
    int endPos = srcFileName.lastIndexOf('.');
    return srcFileName.substring(startPos + 1, endPos);
  }

  private static Set<Class<?>> loadScriptClasses(Path srcFile, ScalaPluginScriptEngine scriptEngine)
      throws InvalidPluginException {
    try {
      return scriptEngine.eval(srcFile);
    } catch (ClassNotFoundException | IOException e) {
      throw new InvalidPluginException("Cannot evaluate script file " + srcFile, e);
    }
  }

  @Override
  public Optional<PluginEntry> getEntry(String resourcePath) throws IOException {
    return webScanner.getEntry(resourcePath);
  }

  @Override
  public InputStream getInputStream(PluginEntry entry) throws IOException {
    return webScanner.getInputStream(entry);
  }

  @Override
  public Enumeration<PluginEntry> entries() {
    return webScanner.entries();
  }
}
