package net.onrc.onos.api.intent;

import com.google.common.base.Objects;
import net.onrc.onos.api.batchoperation.IBatchOperationTarget;

import static com.google.common.base.Preconditions.checkNotNull;

/**
 * The base class of an intent type.
 *
 * <p>
 * This class is sub-classed to provide other intent types like shortest path
 * connectivity and bandwidth constrained shortest path connectivity.
 * </p>
 *
 * <p>
 * The reasoning behind "intent" is that the applications can provide some
 * abstract representation of how traffic should flow be handled by the
 * networking, allowing the network OS to compile, reserve and optimize the
 * data-plane to satisfy those constraints.
 * </p>
 *
 * <p>
 * It is assumed that any kinds of intents are immutable.
 * Developers that will define a new intent type should ensure its immutability.
 * </p>
 */
public abstract class Intent implements IBatchOperationTarget {
    private final IntentId id;

    /**
     * Constructs an intent, which is activated permanently until it is removed explicitly.
     *
     * @param id ID for this intent object.
     */
    protected Intent(IntentId id) {
        this.id = checkNotNull(id);
    }

    /**
     * Returns ID for this Intent object.
     *
     * @return ID for this Intent object.
     */
    public IntentId getId() {
        return id;
    }

    @Override
    public int hashCode() {
        return id.hashCode();
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == this) {
            return true;
        }

        if (!(obj instanceof Intent)) {
            return false;
        }

        Intent that = (Intent) obj;
        return Objects.equal(this.id, that.id);
    }

    @Override
    public String toString() {
        return Objects.toStringHelper(this)
                .add("id", id)
                .toString();
    }
}
