package org.openflow.types;

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

public enum IpEcn implements OFValueType<IpEcn> {
    ECN_00((byte)0),
    ECN_01((byte)1),
    ECN_10((byte)2),
    ECN_11((byte)3);
    
    static final int LENGTH = 1;
    
    private final byte ecn;
    
    private IpEcn(byte ecn) {
        this.ecn = ecn;
    }
    
    public static IpEcn of(byte ecn) {
        switch (ecn) {
            case 0:
                return ECN_00;
            case 1:
                return ECN_01;
            case 2:
                return ECN_10;
            case 3:
                return ECN_11;
            default:
                throw new IllegalArgumentException("Illegal IP ECN value: " + ecn);
        }
    }

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

    @Override
    public String toString() {
        return (ecn < 3 ? "0" : "") + Integer.toBinaryString(ecn);
    }

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

    public static IpEcn readByte(ChannelBuffer c) throws OFParseError {
        return IpEcn.of((byte)(c.readUnsignedByte()));
    }

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

    public byte getEcnValue() {
        return ecn;
    }
}
