package net.onrc.onos.core.intent;

import net.onrc.onos.core.topology.Path;

/**
 * @author Toshio Koide (t-koide@onlab.us)
 */
public class PathIntent extends Intent {
    protected Path path;
    protected double bandwidth;
    protected Intent parentIntent;

    public static String createFirstId(String parentId) {
        return String.format("%s___0", parentId);
    }

    public static String createNextId(String currentId) {
        String parts[] = currentId.split("___");
        return String.format("%s___%d", parts[0], Long.valueOf(parts[1]) + 1);
    }

    /**
     * Default constructor for Kryo deserialization
     */
    protected PathIntent() {
    }

    /**
     * @param graph
     * @param path
     * @param bandwidth    bandwidth which should be allocated for the path.
     *                     If 0, no intent for bandwidth allocation (best effort).
     * @param parentIntent parent intent. If null, this is root intent.
     * @param id
     */
    public PathIntent(String id, Path path, double bandwidth, Intent parentIntent) {
        super(id);
        this.path = path;
        this.bandwidth = bandwidth;
        this.parentIntent = parentIntent;
    }

    public double getBandwidth() {
        return bandwidth;
    }

    public Path getPath() {
        return path;
    }

    public Intent getParentIntent() {
        return parentIntent;
    }

    @Override
    public String toString() {
        return String.format("%s, %s, %s", getId(), getState(), getPath());
    }
}
