/*
 * Copyright 2015-2016 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.net.newresource;

import com.google.common.annotations.Beta;

import java.util.Optional;

/**
 * An object that represent a resource in a network.
 * A Resource can represents path-like hierarchical structure with its ID. An ID of resource is
 * composed of a sequence of elementary resources that are not globally identifiable. A Resource
 * can be globally identifiable by its ID.
 *
 * Two types of resource are considered. One is discrete type and the other is continuous type.
 * Discrete type resource is a resource whose amount is measured as a discrete unit. VLAN ID and
 * MPLS label are examples of discrete type resource. Continuous type resource is a resource whose
 * amount is measured as a continuous value. Bandwidth is an example of continuous type resource.
 * A double value is associated with a continuous type value.
 *
 * Users of this class must keep the semantics of resources regarding the hierarchical structure.
 * For example, resource, Device:1/Port:1/VLAN ID:100, is valid, but resource,
 * VLAN ID:100/Device:1/Port:1 is not valid because a link is not a sub-component of a VLAN ID.
 */
@Beta
public interface Resource {

    DiscreteResource ROOT = new DiscreteResource();

    /**
     * Checks if the type of this instance is the specified type.
     *
     * @param ancestorType type of resource to be checked.
     * @return true if this resource is under the resource whose type is the given type.
     */
    // TODO: find more proper name
    boolean isTypeOf(Class<?> ancestorType);

    /**
     * Returns the volume of this resource.
     *
     * @param <T> type of return value
     * @return the volume of this resource
     */
    // TODO: think about other naming possibilities. amount? quantity?
    <T> T volume();

    /**
     * Returns the parent resource of this instance.
     * E.g. if this resource is Link:1/VLAN ID:100, the return value is the resource for Link:1.
     *
     * @return the parent resource of this instance.
     * If there is no parent, empty instance will be returned.
     */
    Optional<DiscreteResource> parent();

    /**
     * Returns a child resource of this instance with specifying the child object.
     * It is not allowed that a continuous type resource has a child. If the instance is
     * ContinuousResource, {@link UnsupportedOperationException} is thrown. If the given
     * object is a {@link Class} instance, {@link IllegalArgumentException} is thrown.
     *
     * @param child child object
     * @return a child resource
     * @throws IllegalArgumentException if the given object is a {@link Class} instance.
     */
    DiscreteResource child(Object child);

    /**
     * Returns a child resource of this instance with specifying a child object and
     * value. It is not allowed that a continuous type resource has a child. If the instance is
     * ContinuousResource, {@link UnsupportedOperationException} is thrown.
     *
     * @param child child object
     * @param value value
     * @return a child resource
     */
    ContinuousResource child(Class<?> child, double value);

    /**
     * Returns the last component of this instance.
     *
     * @return the last component of this instance.
     * The return value is equal to the last object of {@code components()}.
     */
    Object last();

    /**
     * Returns the ID of this resource.
     *
     * @return the ID of this resource
     */
    ResourceId id();
}
