package net.onrc.onos.core.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();
    }
}
