/*
 * Copyright 2017-present 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.mapping;

import org.onosproject.net.DeviceId;
import org.onosproject.store.Store;

/**
 * Interface of a distributed store for managing mapping information.
 */
public interface MappingStore extends Store<MappingEvent, MappingStoreDelegate> {

    /**
     * Represents the type of mapping store.
     */
    enum Type {

        /**
         * Signifies that mapping information should be stored in map database.
         */
        MAP_DATABASE,

        /**
         * Signifies that mapping information should be stored in map cache.
         */
        MAP_CACHE
    }

    /**
     * Obtains the number of mapping in the specified store.
     *
     * @param type store type
     * @return number of mapping
     */
    int getMappingCount(Type type);

    /**
     * Obtains the stored mapping from the specified store.
     *
     * @param type    store type
     * @param mapping the mapping to look for
     * @return a mapping
     */
    MappingEntry getMappingEntry(Type type, Mapping mapping);

    /**
     * Obtains the mapping entries associated with a device from the
     * specified store.
     *
     * @param type     store type
     * @param deviceId device identifier
     * @return the mapping entries
     */
    Iterable<MappingEntry> getMappingEntries(Type type, DeviceId deviceId);

    /**
     * Stores a new mapping.
     *
     * @param type    store type
     * @param mapping the mapping to add
     */
    void storeMapping(Type type, Mapping mapping);

    /**
     * Marks a mapping for deletion. Actual deletion will occur when the
     * provider indicates that the mapping has been removed.
     *
     * @param type    store type
     * @param mapping the mapping to be marked as delete
     */
    void pendingDeleteMapping(Type type, Mapping mapping);

    /**
     * Removes an existing mapping from the specified store.
     *
     * @param type    store type
     * @param mapping the mapping to remove
     * @return mapping_removed event, or null if nothing removed
     */
    MappingEvent removeMapping(Type type, Mapping mapping);

    /**
     * Stores a new mapping or updates an existing entry from/to the
     * specified store.
     *
     * @param type  store type
     * @param entry the mapping to add or update
     * @return mapping_added event, or null if just an update
     */
    MappingEvent addOrUpdateMappingEntry(Type type, MappingEntry entry);

    /**
     * Marks a mapping as PENDING_ADD during retry.
     * <p>
     * Emits mapping_update event if the state is changed
     *
     * @param type  store type
     * @param entry the mapping that is retrying
     * @return mapping_updated event, or null if nothing updated
     */
    MappingEvent pendingMappingEntry(Type type, MappingEntry entry);

    /**
     * Removes all mapping entries of given device from the specified store.
     *
     * @param type     store type
     * @param deviceId device identifier
     */
    default void purgeMappingEntry(Type type, DeviceId deviceId) {
    }

    /**
     * Removes all mapping entries from the specified store.
     *
     * @param type store type
     */
    void purgeMappingEntries(Type type);
}
