// Copyright (C) 2018 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.google.gerrit.sshd.commands;

import static com.google.gerrit.sshd.CommandMetaData.Mode.MASTER_OR_SLAVE;

import com.google.gerrit.common.data.GlobalCapability;
import com.google.gerrit.extensions.annotations.RequiresCapability;
import com.google.gerrit.server.config.ConfigUpdatedEvent;
import com.google.gerrit.server.config.ConfigUpdatedEvent.UpdateResult;
import com.google.gerrit.server.config.GerritServerConfigReloader;
import com.google.gerrit.sshd.CommandMetaData;
import com.google.gerrit.sshd.SshCommand;
import com.google.inject.Inject;
import java.util.List;
import java.util.stream.Collectors;

/** Issues a reload of gerrit.config. */
@RequiresCapability(GlobalCapability.ADMINISTRATE_SERVER)
@CommandMetaData(
    name = "reload-config",
    description = "Reloads the Gerrit configuration",
    runsAt = MASTER_OR_SLAVE)
public class ReloadConfig extends SshCommand {

  @Inject private GerritServerConfigReloader gerritServerConfigReloader;

  @Override
  protected void run() throws Failure {
    List<ConfigUpdatedEvent.Update> updates = gerritServerConfigReloader.reloadConfig();
    if (updates.isEmpty()) {
      stdout.println("No config entries updated!");
      return;
    }

    // Print out UpdateResult.{ACCEPTED|REJECTED} entries grouped by their type
    for (UpdateResult updateResult : UpdateResult.values()) {
      List<ConfigUpdatedEvent.Update> filteredUpdates = filterUpdates(updates, updateResult);
      if (filteredUpdates.isEmpty()) {
        continue;
      }
      stdout.println(updateResult.toString() + " configuration changes:");
      filteredUpdates
          .stream()
          .flatMap(update -> update.getConfigUpdates().stream())
          .forEach(cfgEntry -> stdout.println(cfgEntry.toString()));
    }
  }

  public static List<ConfigUpdatedEvent.Update> filterUpdates(
      List<ConfigUpdatedEvent.Update> updates, UpdateResult result) {
    return updates
        .stream()
        .filter(update -> update.getResult() == result)
        .collect(Collectors.toList());
  }
}
