/*
 * Copyright 2014 Fluo authors (see AUTHORS)
 * 
 * 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 io.fluo.api.client;

import org.apache.commons.configuration.Configuration;
import org.apache.commons.configuration.SubsetConfiguration;

/**
 * Client interface for Fluo. Fluo clients will have shared resources used by all objects created by
 * the client. Therefore, {@link FluoClient#close()} must called when you are finished using the
 * client.
 */
public interface FluoClient extends AutoCloseable {

  /**
   * Creates a {@link LoaderExecutor} for loading data into Fluo. Use within a try-with-resources
   * statement or call {@link LoaderExecutor#close()} when you are finished using it.
   */
  public LoaderExecutor newLoaderExecutor();

  /**
   * Creates a {@link Snapshot} for reading data from Fluo. Use within a try-with-resources
   * statement or call {@link Snapshot#close()} when you are finished using it.
   */
  public Snapshot newSnapshot();

  /**
   * Creates a {@link Transaction} for reading and writing data to Fluo. Unlike the transactions
   * provided by the {@link Loader} and {@link Observer}, users will need to call
   * {@link Transaction#commit()}. Use within a try-with-resources statement or call
   * {@link Transaction#close()} when you are finished.
   */
  public Transaction newTransaction();

  /**
   * @return All properties w/ the prefix {@value io.fluo.api.config.FluoConfiguration#APP_PREFIX}
   *         that were set at initialization time. The configuration returned is a
   *         {@link SubsetConfiguration} using the prefix
   *         {@value io.fluo.api.config.FluoConfiguration#APP_PREFIX} The reason these properties
   *         are stored and read from zookeeper is to offer a consistent view of application config
   *         across all nodes in the cluster. So there is no need to worry w/ keeping config files
   *         consistent across a cluster. To update this configuration, use
   *         {@link FluoAdmin#updateSharedConfig()}. Changes made to the returned Configuration will
   *         not update Zookeeper.
   */

  public Configuration getAppConfiguration();

  /**
   * Closes client resources
   */
  @Override
  public void close();
}
