// 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.xdocs.formatter;

import static com.googlesource.gerrit.plugins.xdocs.XDocGlobalConfig.KEY_ENABLED;
import static com.googlesource.gerrit.plugins.xdocs.XDocGlobalConfig.KEY_EXT;
import static com.googlesource.gerrit.plugins.xdocs.XDocGlobalConfig.KEY_FORMATTER;
import static com.googlesource.gerrit.plugins.xdocs.XDocGlobalConfig.KEY_MIME_TYPE;
import static com.googlesource.gerrit.plugins.xdocs.XDocGlobalConfig.KEY_PREFIX;
import static com.googlesource.gerrit.plugins.xdocs.XDocGlobalConfig.KEY_PRIO;
import static com.googlesource.gerrit.plugins.xdocs.XDocGlobalConfig.SECTION_FORMATTER;

import com.google.gerrit.common.data.PatchScript.FileMode;
import com.google.gerrit.extensions.annotations.PluginName;
import com.google.gerrit.extensions.registration.DynamicMap;
import com.google.gerrit.reviewdb.client.Project;
import com.google.gerrit.server.mime.FileTypeRegistry;
import com.google.gerrit.server.change.FileContentUtil;
import com.google.gerrit.server.config.PluginConfigFactory;
import com.google.gerrit.server.project.ProjectCache;
import com.google.gerrit.server.project.ProjectState;
import com.google.inject.Inject;
import com.google.inject.Provider;
import com.google.inject.Singleton;

import com.googlesource.gerrit.plugins.xdocs.ConfigSection;
import com.googlesource.gerrit.plugins.xdocs.XDocGlobalConfig;

import eu.medsea.mimeutil.MimeType;

import org.apache.commons.io.FilenameUtils;
import org.eclipse.jgit.lib.Config;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.Map.Entry;

@Singleton
public class Formatters {
  private static final Logger log = LoggerFactory.getLogger(Formatters.class);

  public static final String RAW_FORMATTER = "RAW";

  private final String pluginName;
  private final PluginConfigFactory pluginCfgFactory;
  private final FileTypeRegistry fileTypeRegistry;
  private final DynamicMap<Formatter> formatters;
  private final ProjectCache projectCache;

  @Inject
  Formatters(
      @PluginName String pluginName,
      PluginConfigFactory pluginCfgFactory,
      FileTypeRegistry fileTypeRegistry,
      DynamicMap<Formatter> formatters,
      ProjectCache projectCache) {
    this.pluginName = pluginName;
    this.pluginCfgFactory = pluginCfgFactory;
    this.fileTypeRegistry = fileTypeRegistry;
    this.formatters = formatters;
    this.projectCache = projectCache;
  }

  public FormatterProvider get(String projectName, String fileName) {
    ProjectState project = projectCache.get(new Project.NameKey(projectName));
    if (project == null) {
      return null;
    }
    return get(project, fileName);
  }

  public FormatterProvider get(ProjectState project, String fileName) {
    XDocGlobalConfig globalCfg = new XDocGlobalConfig(
        pluginCfgFactory.getGlobalPluginConfig(pluginName));
    MimeType mimeType = fileTypeRegistry.getMimeType(fileName, null);
    mimeType = new MimeType(FileContentUtil.resolveContentType(
        project, fileName, FileMode.FILE, mimeType.toString()));
    String extension = FilenameUtils.getExtension(fileName);
    FormatterProvider formatter = null;
    int formatterPrio = 0;
    for (String pluginName : formatters.plugins()) {
      for (Entry<String, Provider<Formatter>> e :
          formatters.byPlugin(pluginName).entrySet()) {
        if (!globalCfg.getFormatterConfig(e.getKey())
            .getBoolean(KEY_ENABLED, true)) {
          continue;
        }
        ConfigSection formatterCfg = getFormatterConfig(e.getKey(), project);
        String[] prefixes = formatterCfg.getStringList(KEY_PREFIX);
        if (prefixes.length > 0) {
          boolean match = false;
          for (String prefix : prefixes) {
            if (fileName.startsWith(prefix)) {
              match = true;
              break;
            }
          }
          if (!match) {
            continue;
          }
        }
        for (String mt : formatterCfg.getStringList(KEY_MIME_TYPE)) {
          MimeType configuredMimeType = new MimeType(mt);
          if (mimeType.equals(configuredMimeType)
              || ("*".equals(configuredMimeType.getSubType())
                  && mimeType.getMediaType().equals(configuredMimeType.getMediaType()))) {
            int prio = formatterCfg.getInt(KEY_PRIO, 0);
            if (formatter == null || prio > formatterPrio) {
              formatter = new FormatterProvider(e.getKey(), e.getValue());
              formatterPrio = prio;
            }
          }
        }
        for (String ext :
          formatterCfg.getStringList(KEY_EXT)) {
          if (extension.equals(ext) || "*".equals(ext)) {
            int prio = formatterCfg.getInt(KEY_PRIO, 0);
            if (formatter == null || prio > formatterPrio) {
              formatter = new FormatterProvider(e.getKey(), e.getValue());
              formatterPrio = prio;
            }
          }
        }
      }
    }
    return formatter;
  }

  public ConfigSection getFormatterConfig(String formatterName,
      String projectName) {
    ProjectState project = projectCache.get(new Project.NameKey(projectName));
    if (project == null) {
      return null;
    }
    return getFormatterConfig(formatterName, project);
  }

  public ConfigSection getFormatterConfig(String formatterName,
      ProjectState project) {
    for (ProjectState p : project.tree()) {
      Config cfg = pluginCfgFactory.getProjectPluginConfig(p, pluginName);
      if (cfg.getSubsections(SECTION_FORMATTER).contains(formatterName)) {
        return new XDocGlobalConfig(cfg).getFormatterConfig(formatterName);
      }
    }

    return new XDocGlobalConfig(
        pluginCfgFactory.getGlobalPluginConfig(pluginName))
        .getFormatterConfig(formatterName);
  }

  public FormatterProvider getByName(String formatterName) {
    if (formatterName.equals(RAW_FORMATTER)) {
      return resolveRawFormatter();
    }

    for (String pluginName : formatters.plugins()) {
      for (Entry<String, Provider<Formatter>> e :
          formatters.byPlugin(pluginName).entrySet()) {
        if (formatterName.equals(e.getKey())) {
          return new FormatterProvider(formatterName, e.getValue());
        }
      }
    }
    return null;
  }

  public FormatterProvider getRawFormatter() {
    return getByName(RAW_FORMATTER);
  }

  private FormatterProvider resolveRawFormatter() {
    XDocGlobalConfig globalCfg =
        new XDocGlobalConfig(pluginCfgFactory.getGlobalPluginConfig(pluginName));
    String formatterName =
        globalCfg.getFormatterConfig(RAW_FORMATTER)
            .getString(KEY_FORMATTER, PlainTextFormatter.NAME);
    if (formatterName.equals(RAW_FORMATTER)) {
      log.warn(String.format(
          "%s plugin: Invalid '%s' formatter configuration, '%s' formatter cannot be set to '%s', using '%s' formatter",
          pluginName, RAW_FORMATTER, RAW_FORMATTER, formatterName, PlainTextFormatter.NAME));
      formatterName = PlainTextFormatter.NAME;
    }
    FormatterProvider formatter = getByName(formatterName);
    if (formatter == null) {
      log.warn(String.format(
          "%s plugin: Invalid '%s' formatter configuration, formatter '%s' not found, using '%s' formatter",
          pluginName, RAW_FORMATTER, formatterName, PlainTextFormatter.NAME));
      formatter = getByName(PlainTextFormatter.NAME);
    }
    return new FormatterProvider(RAW_FORMATTER, formatter.formatter);
  }

  public static class FormatterProvider {
    private final String name;
    private final Provider<? extends Formatter> formatter;

    FormatterProvider(String name, Provider<? extends Formatter> formatter) {
      this.name = name;
      this.formatter = formatter;
    }

    public Formatter get() {
      return formatter.get();
    }

    public String getName() {
      return name;
    }
  }
}
