// Copyright (C) 2013 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.reviewers;

import static com.google.gerrit.server.project.ProjectResource.PROJECT_KIND;

import com.google.gerrit.extensions.annotations.PluginName;
import com.google.gerrit.extensions.config.FactoryModule;
import com.google.gerrit.extensions.events.RevisionCreatedListener;
import com.google.gerrit.extensions.registration.DynamicSet;
import com.google.gerrit.extensions.restapi.RestApiModule;
import com.google.gerrit.extensions.webui.GwtPlugin;
import com.google.gerrit.extensions.webui.TopMenu;
import com.google.gerrit.extensions.webui.WebUiPlugin;
import com.google.gerrit.server.config.PluginConfigFactory;
import com.google.inject.Inject;
import org.eclipse.jgit.lib.Config;

public class Module extends FactoryModule {
  private final boolean enableUI;
  private final boolean enableREST;

  @Inject
  public Module(@PluginName String pluginName, PluginConfigFactory pluginCfgFactory) {
    Config c = pluginCfgFactory.getGlobalPluginConfig(pluginName);
    this.enableREST = c.getBoolean("reviewers", null, "enableREST", true);
    this.enableUI = enableREST ? c.getBoolean("reviewers", null, "enableUI", true) : false;
  }

  public Module(boolean enableUI, boolean enableREST) {
    this.enableUI = enableUI;
    this.enableREST = enableREST;
  }

  @Override
  protected void configure() {
    if (enableUI) {
      DynamicSet.bind(binder(), TopMenu.class).to(ReviewersTopMenu.class);
      DynamicSet.bind(binder(), WebUiPlugin.class).toInstance(new GwtPlugin("reviewers"));
    }

    DynamicSet.bind(binder(), RevisionCreatedListener.class).to(ChangeEventListener.class);
    factory(DefaultReviewers.Factory.class);
    factory(ReviewersConfig.Factory.class);

    if (enableREST) {
      install(
          new RestApiModule() {
            @Override
            protected void configure() {
              get(PROJECT_KIND, "reviewers").to(GetReviewers.class);
              put(PROJECT_KIND, "reviewers").to(PutReviewers.class);
              get(PROJECT_KIND, "suggest_reviewers").to(SuggestProjectReviewers.class);
            }
          });
    }
  }
}
