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());
	}
}
