package net.onrc.onos.intent;

import java.util.LinkedList;

import com.esotericsoftware.kryo.serializers.FieldSerializer.Optional;

/**
 * @author Toshio Koide (t-koide@onlab.us)
 */
public class Intent {
	public enum IntentState {
		CREATED,
		INST_REQ,
		INST_NACK,
		INST_ACK,
		DEL_REQ,
		DEL_PENDING,
		DEL_ACK,
		REROUTE_REQ,
	}

	private String id;
	private IntentState state = IntentState.CREATED;
	private boolean pathFrozen = false;

	@Optional(value="logs")
	private LinkedList<String> logs = new LinkedList<>();

	/**
	 * Default constructor for Kryo deserialization
	 */
	protected Intent() {
		logs.add(String.format("created, time:%d", System.nanoTime())); // for measurement
	}

	public Intent(String id) {
		logs.add(String.format("created, time:%d", System.nanoTime())); // for measurement
		this.id = id;
	}

	public Intent(String id, IntentState state) {
		logs.add(String.format("created, time:%d", System.nanoTime())); // for measurement
		setState(state);
		this.id = id;
	}

	public String getId() {
		return id;
	}

	public IntentState getState() {
		return state;
	}

	public IntentState setState(IntentState newState) {
		logs.add(String.format("setState, oldState:%s, newState:%s, time:%d",
				state, newState, System.nanoTime())); // for measurement
		if (logs.size() > 20) { // TODO this size should be configurable
			logs.removeFirst();
		}
		IntentState oldState = state;
		state = newState;
		return oldState;
	}

	public boolean isPathFrozen() {
		return pathFrozen;
	}

	public void setPathFrozen(boolean isFrozen) {
		pathFrozen = isFrozen;
	}

	public LinkedList<String> getLogs() {
		return logs;
	}

	@Override
	public int hashCode() {
		return (id == null) ? 0 : id.hashCode();
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if ((obj == null) || (getClass() != obj.getClass()))
			return false;
		Intent other = (Intent) obj;
		if (id == null) {
			if (other.id != null)
				return false;
		} else if (!id.equals(other.id))
			return false;
		return true;
	}

	@Override
	public String toString() {
		return id.toString() + ", " + state.toString();
	}
}
