/*
 * Licensed to the Apache Software Foundation (ASF) under one or more contributor license
 * agreements. See the NOTICE file distributed with this work for additional information regarding
 * copyright ownership. The ASF licenses this file to You 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 org.apache.geode.management.api;

import java.util.concurrent.CompletableFuture;

import org.apache.geode.annotations.Experimental;
import org.apache.geode.management.configuration.AbstractConfiguration;
import org.apache.geode.management.runtime.OperationResult;
import org.apache.geode.management.runtime.RuntimeInfo;

/**
 * this is responsible for applying and persisting cache configuration changes on locators and/or
 * servers.
 */
@Experimental
public interface ClusterManagementService extends AutoCloseable {
  /**
   * This method will create the element on all the applicable members in the cluster and persist
   * the configuration in the cluster configuration if persistence is enabled.
   *
   * @param config this holds the configuration attributes of the element to be created on the
   *        cluster, as well as the group this config belongs to
   * @return a {@link ClusterManagementRealizationResult} indicating the success of the creation
   * @throws ClusterManagementRealizationException if unsuccessful
   */
  <T extends AbstractConfiguration<?>> ClusterManagementRealizationResult create(T config);

  /**
   * This method will delete the element on all the applicable members in the cluster and update the
   * configuration in the cluster configuration if persistence is enabled.
   *
   * @param config this holds the name or id of the element to be deleted on the cluster
   * @return a {@link ClusterManagementRealizationResult} indicating the success of the deletion
   * @throws ClusterManagementRealizationException if unsuccessful
   */
  <T extends AbstractConfiguration<?>> ClusterManagementRealizationResult delete(T config);

  /**
   * This method will update the element on all the applicable members in the cluster and persist
   * the updated configuration in the cluster configuration if persistence is enabled.
   *
   * @param config this holds the configuration attributes of the element to be updated on the
   *        cluster, as well as the group this config belongs to
   * @return a {@link ClusterManagementRealizationResult} indicating the success of the update
   * @throws ClusterManagementRealizationException if unsuccessful
   */
  <T extends AbstractConfiguration<?>> ClusterManagementRealizationResult update(T config);

  /**
   * This method will list instances of the element type in the cluster configuration, along with
   * additional runtime information from cluster members
   *
   * @param filter the filterable attributes are used to identify the elements to list. Any
   *        non-filterable attributes will be ignored.
   * @return a {@link ClusterManagementListResult} holding a list of matching instances in
   *         {@link ClusterManagementListResult#getResult()}
   * @throws ClusterManagementException if unsuccessful
   */
  <T extends AbstractConfiguration<R>, R extends RuntimeInfo> ClusterManagementListResult<T, R> list(
      T filter);

  /**
   * This method will get a single instance of the element type in the cluster configuration, along
   * with additional runtime information from cluster members
   *
   * @param config this holds the name or id of the element to be retrieved
   * @return a {@link ClusterManagementGetResult}
   * @throws ClusterManagementException if unsuccessful or, no matching element is found, or
   *         multiple matches are found
   */
  <T extends AbstractConfiguration<R>, R extends RuntimeInfo> ClusterManagementGetResult<T, R> get(
      T config);

  /**
   * This method will launch a cluster management operation asynchronously.
   *
   * @param op the operation plus any parameters.
   * @param <A> the operation type (a subclass of {@link ClusterManagementOperation}
   * @param <V> the return type of the operation
   * @return a {@link ClusterManagementOperationResult} holding a {@link CompletableFuture} (if the
   *         operation was launched successfully) or an error code otherwise.
   * @throws ClusterManagementException if unsuccessful
   */
  <A extends ClusterManagementOperation<V>, V extends OperationResult> ClusterManagementOperationResult<V> start(
      A op);

  /**
   * This method will list the status of all asynchronous cluster management operations in progress
   * or recently completed.
   *
   * @param <A> the operation type (a subclass of {@link ClusterManagementOperation}
   * @param <V> the return type of the operation
   * @param opType the operation type to list
   * @return a list of {@link ClusterManagementOperationResult}
   * @throws ClusterManagementException if unsuccessful
   */
  <A extends ClusterManagementOperation<V>, V extends OperationResult> ClusterManagementListOperationsResult<V> list(
      A opType);

  /**
   * Test to see if this instance of ClusterManagementService retrieved from the client side is
   * properly connected to the locator or not
   *
   * @return true if connected
   */
  boolean isConnected();

  /**
   * release any resources controlled by this service
   */
  @Override
  void close();
}
