/*
 * Copyright 2015 Open Networking Laboratory
 *
 * 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 org.onosproject.store.primitives.impl;

import net.kuujo.copycat.state.Command;
import net.kuujo.copycat.state.Initializer;
import net.kuujo.copycat.state.Query;
import net.kuujo.copycat.state.StateContext;

import org.onlab.util.Match;
import org.onosproject.store.service.Versioned;

import java.util.Collection;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

/**
 * Database state.
 *
 */
public interface DatabaseState<K, V> {

  /**
   * Initializes the database state.
   *
   * @param context The map state context.
   */
  @Initializer
  void init(StateContext<DatabaseState<K, V>> context);

  @Query
  Set<String> maps();

  @Query
  Map<String, Long> counters();

  @Query
  int mapSize(String mapName);

  @Query
  boolean mapIsEmpty(String mapName);

  @Query
  boolean mapContainsKey(String mapName, K key);

  @Query
  boolean mapContainsValue(String mapName, V value);

  @Query
  Versioned<V> mapGet(String mapName, K key);

  @Command
  Result<UpdateResult<K, V>> mapUpdate(String mapName, K key, Match<V> valueMatch, Match<Long> versionMatch, V value);

  @Command
  Result<Void> mapClear(String mapName);

  @Query
  Set<K> mapKeySet(String mapName);

  @Query
  Collection<Versioned<V>> mapValues(String mapName);

  @Query
  Set<Entry<K, Versioned<V>>> mapEntrySet(String mapName);

  @Command
  Long counterAddAndGet(String counterName, long delta);

  @Command
  Boolean counterCompareAndSet(String counterName, long expectedValue, long updateValue);

  @Command
  Long counterGetAndAdd(String counterName, long delta);

  @Query
  Long queueSize(String queueName);

  @Query
  byte[] queuePeek(String queueName);

  @Command
  byte[] queuePop(String queueName);

  @Command
  void queuePush(String queueName, byte[] entry);

  @Query
  Long counterGet(String counterName);

  @Command
  void counterSet(String counterName, long value);

  @Command
  CommitResponse prepareAndCommit(Transaction transaction);

  @Command
  boolean prepare(Transaction transaction);

  @Command
  CommitResponse commit(Transaction transaction);

  @Command
  boolean rollback(Transaction transaction);
}
