/*
 * 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();

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

    /**
     * Checks if the type of this instance is the specified type.
     *
     * @param type type of resource to be checked
     * @return true if this resource is the type of the specified type. Otherwise, false.
     */
    boolean isTypeOf(Class<?> type);

    /**
     * Checks if the type of this instance is the sub-type of the specified type.
     *
     * @param ancestor type of resource to be checked.
     * @return true if this resource is under the resource whose type is the given type.
     */
    boolean isSubTypeOf(Class<?> ancestor);

    /**
     * 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 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 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);
}
