package org.projectfloodlight.openflow.types;

import org.jboss.netty.buffer.ChannelBuffer;
import org.projectfloodlight.openflow.exceptions.OFParseError;

public class VlanPcp implements OFValueType<VlanPcp> {

    private static final byte VALIDATION_MASK = 0x07;
    private static final byte NONE_VAL = 0x00;
    static final int LENGTH = 1;

    private final byte pcp;

    public static final VlanPcp NONE = new VlanPcp(NONE_VAL);
    public static final VlanPcp NO_MASK = new VlanPcp((byte)0xFF);
    public static final VlanPcp FULL_MASK = VlanPcp.of((byte)0x0);

    private VlanPcp(byte pcp) {
        this.pcp = pcp;
    }

    public static VlanPcp of(byte pcp) {
        if ((pcp & VALIDATION_MASK) != pcp)
            throw new IllegalArgumentException("Illegal VLAN PCP value: " + pcp);
        return new VlanPcp(pcp);
    }

    @Override
    public boolean equals(Object obj) {
        if (!(obj instanceof VlanPcp))
            return false;
        VlanPcp other = (VlanPcp)obj;
        if (other.pcp != this.pcp)
            return false;
        return true;
    }

    @Override
    public int hashCode() {
        int prime = 20173;
        return this.pcp * prime;
    }

    @Override
    public String toString() {
        return "0x" + Integer.toHexString(pcp);
    }

    public byte getValue() {
        return pcp;
    }

    @Override
    public int getLength() {
        return LENGTH;
    }

    public void writeByte(ChannelBuffer c) {
        c.writeByte(this.pcp);
    }

    public static VlanPcp readByte(ChannelBuffer c) throws OFParseError {
        return VlanPcp.of((byte)(c.readUnsignedByte() & 0xFF));
    }

    @Override
    public VlanPcp applyMask(VlanPcp mask) {
        return VlanPcp.of((byte)(this.pcp & mask.pcp));
    }

}
