package net.onrc.onos.core.util;

import org.codehaus.jackson.annotate.JsonProperty;

/**
 * The class representing the Flow Path flags.
 */
public class FlowPathFlags {
    private long flags;

    // Discard the first-hop Flow Entry
    public static final long DISCARD_FIRST_HOP_ENTRY = (1 << 0);

    // Keep only the first-hop Flow Entry
    public static final long KEEP_ONLY_FIRST_HOP_ENTRY = (1 << 1);

    /**
     * Default constructor.
     */
    public FlowPathFlags() {
        this.flags = 0;
    }

    /**
     * Constructor for given flags.
     *
     * @param flags the flags value to set.
     */
    public FlowPathFlags(long flags) {
        this.flags = flags;
    }

    /**
     * Constructor for given flags as a string.
     * <p/>
     * The string value should contain the name of each flags to set. E.g.:
     * "DISCARD_FIRST_HOP_ENTRY,KEEP_ONLY_FIRST_HOP_ENTRY"
     *
     * @param flagsStr the string value of the flags to set.
     */
    public FlowPathFlags(String flagsStr) {
        this.setFlagsStr(flagsStr);
    }

    /**
     * Get the flags.
     *
     * @return the flags.
     */
    @JsonProperty("flags")
    public long flags() {
        return flags;
    }

    /**
     * Set the flags.
     *
     * @param flags the flags value to set.
     */
    @JsonProperty("flags")
    public void setFlags(long flags) {
        this.flags = flags;
    }

    /**
     * Set the flags as a string.
     * <p/>
     * The string value should contain the name of each flags to set. E.g.:
     * "DISCARD_FIRST_HOP_ENTRY,KEEP_ONLY_FIRST_HOP_ENTRY"
     *
     * @param flagsStr the string value of the flags to set.
     */
    @JsonProperty("flagsStr")
    public void setFlagsStr(String flagsStr) {
        this.flags = 0L;

        // Test all flags
        if (flagsStr.contains("DISCARD_FIRST_HOP_ENTRY")) {
            this.flags |= DISCARD_FIRST_HOP_ENTRY;
        }
        if (flagsStr.contains("KEEP_ONLY_FIRST_HOP_ENTRY")) {
            this.flags |= KEEP_ONLY_FIRST_HOP_ENTRY;
        }
    }

    /**
     * Test whether the DISCARD_FIRST_HOP_ENTRY flag is set.
     *
     * @return true if the DISCARD_FIRST_HOP_ENTRY flag is set,
     * otherwise false.
     */
    public boolean isDiscardFirstHopEntry() {
        return ((flags & DISCARD_FIRST_HOP_ENTRY) != 0);
    }

    /**
     * Test whether the KEEP_ONLY_FIRST_HOP_ENTRY flag is set.
     *
     * @return true if the KEEP_ONLY_FIRST_HOP_ENTRY flag is set,
     * otherwise false.
     */
    public boolean isKeepOnlyFirstHopEntry() {
        return ((flags & KEEP_ONLY_FIRST_HOP_ENTRY) != 0);
    }

    /**
     * Convert the Flow Path Flags to a string.
     * <p/>
     * The string has the following form:
     * [flags=DISCARD_FIRST_HOP_ENTRY,KEEP_ONLY_FIRST_HOP_ENTRY]
     *
     * @return the Flow Path flags as a string.
     */
    @Override
    public String toString() {
        String flagsStr = null;
        String ret = "[flags=";

        // Test all flags
        if ((this.flags & DISCARD_FIRST_HOP_ENTRY) != 0) {
            flagsStr += "DISCARD_FIRST_HOP_ENTRY";
        }
        if ((this.flags & KEEP_ONLY_FIRST_HOP_ENTRY) != 0) {
            if (flagsStr != null) {
                flagsStr += ",";
            }
            flagsStr += "KEEP_ONLY_FIRST_HOP_ENTRY";
        }
        if (flagsStr != null) {
            ret += flagsStr;
        }
        ret += "]";

        return ret;
    }

}
