package net.onrc.onos.apps.sdnip;

import java.util.Objects;


/**
 * Represents a route update received from BGPd. An update has an operation
 * describing whether the update is adding a route or revoking a route. It also
 * contains the route prefix, and {@link RibEntry} containing next hop and
 * sequence number information for the update.
 */
public class RibUpdate {
    private final Operation operation;
    private final Prefix prefix;
    private final RibEntry ribEntry;

    /**
     * Updates can either add new routes or revoke old routes. The
     * {@link Operation} enum describes which action is being taken.
     */
    public enum Operation {
        /**
         * Represents a route update. ONOS should update its route information
         * for this prefix to the new information provided in this
         * {@link RibUpdate}. This means either add a new prefix, or update
         * the information for an existing prefix.
         */
        UPDATE,
        /**
         * Represents a route delete. ONOS should remove this prefix and route
         * information from its route table.
         */
        DELETE
    }

    /**
     * Class constructor, taking the operation of the update, the route prefix
     * and the {@link RibEntry} describing the update.
     *
     * @param operation the operation of the update
     * @param prefix the route prefix
     * @param ribEntry the update entry
     */
    public RibUpdate(Operation operation, Prefix prefix, RibEntry ribEntry) {
        this.operation = operation;
        this.prefix = prefix;
        this.ribEntry = ribEntry;
    }

    /**
     * Gets the operation of the update.
     *
     * @return the operation
     */
    public Operation getOperation() {
        return operation;
    }

    /**
     * Gets the route prefix of the update.
     *
     * @return the prefix
     */
    public Prefix getPrefix() {
        return prefix;
    }

    /**
     * Gets the {@link RibEntry} of the update.
     *
     * @return the entry
     */
    public RibEntry getRibEntry() {
        return ribEntry;
    }

    @Override
    public boolean equals(Object o) {
        if (!(o instanceof RibUpdate)) {
            return false;
        }

        RibUpdate otherUpdate = (RibUpdate) o;
        return Objects.equals(this.operation, otherUpdate.operation)
                && Objects.equals(this.prefix, otherUpdate.prefix)
                && Objects.equals(this.ribEntry, otherUpdate.ribEntry);
    }

    @Override
    public int hashCode() {
        return Objects.hash(operation, prefix, ribEntry);
    }
}
