/*
 * Copyright 2017-present Open Networking Foundation
 *
 * 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.resource.impl;

import org.onosproject.net.resource.DiscreteResourceId;
import org.onosproject.net.resource.Resource;
import org.onosproject.net.resource.ResourceAllocation;
import org.onosproject.net.resource.ResourceConsumerId;
import org.onosproject.net.resource.ResourceId;
import org.onosproject.store.service.TransactionContext;

import java.util.List;
import java.util.Set;
import java.util.stream.Stream;

/**
 * Interface for consistent resource substores.
 */
interface ConsistentResourceSubStore
        <T extends ResourceId, U extends Resource, V extends TransactionalResourceSubStore> {

    /**
     * Returns a new transactional substore.
     *
     * @param tx the transaction context
     * @return a transactional resource substore
     */
    V transactional(TransactionContext tx);

    /**
     * Returns a list of resource allocations for the given resource ID.
     *
     * @param resourceId the resource ID
     * @return a list of resource allocations for the given ID
     */
    List<ResourceAllocation> getResourceAllocations(T resourceId);

    /**
     * Returns a set of child resources for the given discrete resource.
     *
     * @param resourceId the parent resource ID
     * @return a set of child resources for the given discrete parent
     */
    Set<U> getChildResources(DiscreteResourceId resourceId);

    /**
     * Returns a set of child resources cast to the given type.
     *
     * @param resourceId the parent resource ID
     * @param type the type to which to cast resources
     * @return a set of child resources for the given discrete parent
     */
    Set<U> getChildResources(DiscreteResourceId resourceId, Class<?> type);

    /**
     * Returns a boolean indicating whether the given resource is available.
     *
     * @param resource the resource to check
     * @return indicates whether the given resource is available
     */
    boolean isAvailable(U resource);

    /**
     * Returns a stream of allocated resources for the given parent.
     *
     * @param parent the parent resource ID for which to return allocated resources
     * @param type the type to which to cast allocated resources
     * @return a stream of allocated resources for the given parent
     */
    Stream<U> getAllocatedResources(DiscreteResourceId parent, Class<?> type);

    /**
     * Returns a stream of resources for the given consumer.
     *
     * @param consumerId the consumer ID for which to return resources
     * @return a stream of resources for the given consumer
     */
    Stream<U> getResources(ResourceConsumerId consumerId);

}