/*
 * Copyright 2014 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.onlab.onos.net.resource;

import java.util.Collection;
import java.util.Set;

import org.onlab.onos.net.Link;
import org.onlab.onos.net.intent.Constraint;
import org.onlab.onos.net.intent.IntentId;

/**
 * Representation of a request for link resource.
 */
public interface LinkResourceRequest extends ResourceRequest {

    /**
     * Returns the {@link IntentId} associated with the request.
     *
     * @return the {@link IntentId} associated with the request
     */
    IntentId intendId();

    /**
     * Returns the set of target links.
     *
     * @return the set of target links
     */
    Collection<Link> links();

    /**
     * Returns the set of resource requests.
     *
     * @return the set of resource requests
     */
    Set<ResourceRequest> resources();

    /**
     * Builder of link resource request.
     */
    interface Builder {
         /**
         * Adds lambda request.
         *
         * @return self
         */
        public Builder addLambdaRequest();

        /**
         * Adds bandwidth request with bandwidth value.
         *
         * @param bandwidth bandwidth value to be requested
         * @return self
         */
        public Builder addBandwidthRequest(double bandwidth);

        /**
         * Adds the resources required for a constraint.
         *
         * @param constraint the constraint
         * @return self
         */
        public Builder addConstraint(Constraint constraint);

        /**
         * Returns link resource request.
         *
         * @return link resource request
         */
        public LinkResourceRequest build();
    }
}
