// Copyright (C) 2023 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.replication.api;

import java.io.IOException;
import org.eclipse.jgit.lib.Config;

/**
 * Separates configuration resource from the configuration schema.
 *
 * <p>The {@code ConfigResource} splits configuration source from configuration options. The
 * resource is just an {@code Config} object with its version. The configuration options can be
 * loaded from different sources eg. a single file, multiple files or ZooKeeper.
 *
 * <p>Here we don't assume any configuration options being present in the {@link Config} object,
 * this is the responsibility of {@link ReplicationConfig} interface. Think about {@code
 * ConfigResource} as a "plain text file" and {@code ReplicationConfig} as a XML file.
 */
public interface ConfigResource {

  /**
   * Configuration for the plugin and all replication end points.
   *
   * @return current configuration
   */
  Config getConfig();

  /**
   * Update the configuration resource.
   *
   * <p>Allows to persist changes to the configuration resource.
   *
   * @param config updated configuration
   * @throws IOException when configuration cannot be persisted
   */
  void update(Config config) throws IOException;

  /**
   * Current logical version string of the current configuration loaded in memory, depending on the
   * actual implementation of the configuration on the persistent storage.
   *
   * @return current logical version number.
   */
  String getVersion();
}
