package org.openflow.types;

import org.jboss.netty.buffer.ChannelBuffer;

public class ArpOpcode implements OFValueType {

    final static int LENGTH = 2;

    private static final int ARP_OPCODE_VAL_REQUEST   = 1;
    private static final int ARP_OPCODE_VAL_REPLY = 2;
    private static final int ARP_OPCODE_VAL_REQUEST_REVERSE   = 3;
    private static final int ARP_OPCODE_VAL_REPLY_REVERSE = 4;
    private static final int ARP_OPCODE_VAL_DRARP_REQUEST = 5;
    private static final int ARP_OPCODE_VAL_DRARP_REPLY   = 6;
    private static final int ARP_OPCODE_VAL_DRARP_ERROR   = 7;
    private static final int ARP_OPCODE_VAL_INARP_REQUEST = 8;
    private static final int ARP_OPCODE_VAL_INARP_REPLY   = 9;
    private static final int ARP_OPCODE_VAL_ARP_NAK   = 10;
    private static final int ARP_OPCODE_VAL_MARS_REQUEST  = 11;
    private static final int ARP_OPCODE_VAL_MARS_MULTI    = 12;
    private static final int ARP_OPCODE_VAL_MARS_MSERV    = 13;
    private static final int ARP_OPCODE_VAL_MARS_JOIN = 14;
    private static final int ARP_OPCODE_VAL_MARS_LEAVE    = 15;
    private static final int ARP_OPCODE_VAL_MARS_NAK  = 16;
    private static final int ARP_OPCODE_VAL_MARS_UNSERV   = 17;
    private static final int ARP_OPCODE_VAL_MARS_SJOIN    = 18;
    private static final int ARP_OPCODE_VAL_MARS_SLEAVE   = 19;
    private static final int ARP_OPCODE_VAL_MARS_GROUPLIST_REQUEST    = 20;
    private static final int ARP_OPCODE_VAL_MARS_GROUPLIST_REPLY  = 21;
    private static final int ARP_OPCODE_VAL_MARS_REDIRECT_MAP = 22;
    private static final int ARP_OPCODE_VAL_MAPOS_UNARP   = 23;
    private static final int ARP_OPCODE_VAL_OP_EXP1   = 24;
    private static final int ARP_OPCODE_VAL_OP_EXP2   = 25;

    public static ArpOpcode ARP_OPCODE_REQUEST  = new ArpOpcode(ARP_OPCODE_VAL_REQUEST);
    public static ArpOpcode ARP_OPCODE_REPLY    = new ArpOpcode(ARP_OPCODE_VAL_REPLY);
    public static ArpOpcode ARP_OPCODE_REQUEST_REVERSE  = new ArpOpcode(ARP_OPCODE_VAL_REQUEST_REVERSE);
    public static ArpOpcode ARP_OPCODE_REPLY_REVERSE    = new ArpOpcode(ARP_OPCODE_VAL_REPLY_REVERSE);
    public static ArpOpcode ARP_OPCODE_DRARP_REQUEST    = new ArpOpcode(ARP_OPCODE_VAL_DRARP_REQUEST);
    public static ArpOpcode ARP_OPCODE_DRARP_REPLY  = new ArpOpcode(ARP_OPCODE_VAL_DRARP_REPLY);
    public static ArpOpcode ARP_OPCODE_DRARP_ERROR  = new ArpOpcode(ARP_OPCODE_VAL_DRARP_ERROR);
    public static ArpOpcode ARP_OPCODE_INARP_REQUEST    = new ArpOpcode(ARP_OPCODE_VAL_INARP_REQUEST);
    public static ArpOpcode ARP_OPCODE_INARP_REPLY  = new ArpOpcode(ARP_OPCODE_VAL_INARP_REPLY);
    public static ArpOpcode ARP_OPCODE_ARP_NAK  = new ArpOpcode(ARP_OPCODE_VAL_ARP_NAK);
    public static ArpOpcode ARP_OPCODE_MARS_REQUEST = new ArpOpcode(ARP_OPCODE_VAL_MARS_REQUEST);
    public static ArpOpcode ARP_OPCODE_MARS_MULTI   = new ArpOpcode(ARP_OPCODE_VAL_MARS_MULTI);
    public static ArpOpcode ARP_OPCODE_MARS_MSERV   = new ArpOpcode(ARP_OPCODE_VAL_MARS_MSERV);
    public static ArpOpcode ARP_OPCODE_MARS_JOIN    = new ArpOpcode(ARP_OPCODE_VAL_MARS_JOIN);
    public static ArpOpcode ARP_OPCODE_MARS_LEAVE   = new ArpOpcode(ARP_OPCODE_VAL_MARS_LEAVE);
    public static ArpOpcode ARP_OPCODE_MARS_NAK = new ArpOpcode(ARP_OPCODE_VAL_MARS_NAK);
    public static ArpOpcode ARP_OPCODE_MARS_UNSERV  = new ArpOpcode(ARP_OPCODE_VAL_MARS_UNSERV);
    public static ArpOpcode ARP_OPCODE_MARS_SJOIN   = new ArpOpcode(ARP_OPCODE_VAL_MARS_SJOIN);
    public static ArpOpcode ARP_OPCODE_MARS_SLEAVE  = new ArpOpcode(ARP_OPCODE_VAL_MARS_SLEAVE);
    public static ArpOpcode ARP_OPCODE_MARS_GROUPLIST_REQUEST   = new ArpOpcode(ARP_OPCODE_VAL_MARS_GROUPLIST_REQUEST);
    public static ArpOpcode ARP_OPCODE_MARS_GROUPLIST_REPLY = new ArpOpcode(ARP_OPCODE_VAL_MARS_GROUPLIST_REPLY);
    public static ArpOpcode ARP_OPCODE_MARS_REDIRECT_MAP    = new ArpOpcode(ARP_OPCODE_VAL_MARS_REDIRECT_MAP);
    public static ArpOpcode ARP_OPCODE_MAPOS_UNARP  = new ArpOpcode(ARP_OPCODE_VAL_MAPOS_UNARP);
    public static ArpOpcode ARP_OPCODE_OP_EXP1  = new ArpOpcode(ARP_OPCODE_VAL_OP_EXP1);
    public static ArpOpcode ARP_OPCODE_OP_EXP2  = new ArpOpcode(ARP_OPCODE_VAL_OP_EXP2);

    private static final int MIN_OPCODE = 0;
    private static final int MAX_OPCODE = 0xFFFF;

    private final int opcode;

    private ArpOpcode(int opcode) {
        this.opcode = opcode;
    }

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

    public int getOpcode() {
        return this.opcode;
    }

    public static ArpOpcode of(int opcode) {
        if (opcode < MIN_OPCODE || opcode > MAX_OPCODE)
            throw new IllegalArgumentException("Invalid ARP opcode: " + opcode);
        switch (opcode) {
            case ARP_OPCODE_VAL_REQUEST:
                return ARP_OPCODE_REQUEST;
            case ARP_OPCODE_VAL_REPLY:
                return ARP_OPCODE_REPLY;
            case ARP_OPCODE_VAL_REQUEST_REVERSE:
                return ARP_OPCODE_REQUEST_REVERSE;
            case ARP_OPCODE_VAL_REPLY_REVERSE:
                return ARP_OPCODE_REPLY_REVERSE;
            case ARP_OPCODE_VAL_DRARP_REQUEST:
                return ARP_OPCODE_DRARP_REQUEST;
            case ARP_OPCODE_VAL_DRARP_REPLY:
                return ARP_OPCODE_DRARP_REPLY;
            case ARP_OPCODE_VAL_DRARP_ERROR:
                return ARP_OPCODE_DRARP_ERROR;
            case ARP_OPCODE_VAL_INARP_REQUEST:
                return ARP_OPCODE_INARP_REQUEST;
            case ARP_OPCODE_VAL_INARP_REPLY:
                return ARP_OPCODE_INARP_REPLY;
            case ARP_OPCODE_VAL_ARP_NAK:
                return ARP_OPCODE_ARP_NAK;
            case ARP_OPCODE_VAL_MARS_REQUEST:
                return ARP_OPCODE_MARS_REQUEST;
            case ARP_OPCODE_VAL_MARS_MULTI:
                return ARP_OPCODE_MARS_MULTI;
            case ARP_OPCODE_VAL_MARS_MSERV:
                return ARP_OPCODE_MARS_MSERV;
            case ARP_OPCODE_VAL_MARS_JOIN:
                return ARP_OPCODE_MARS_JOIN;
            case ARP_OPCODE_VAL_MARS_LEAVE:
                return ARP_OPCODE_MARS_LEAVE;
            case ARP_OPCODE_VAL_MARS_NAK:
                return ARP_OPCODE_MARS_NAK;
            case ARP_OPCODE_VAL_MARS_UNSERV:
                return ARP_OPCODE_MARS_UNSERV;
            case ARP_OPCODE_VAL_MARS_SJOIN:
                return ARP_OPCODE_MARS_SJOIN;
            case ARP_OPCODE_VAL_MARS_SLEAVE:
                return ARP_OPCODE_MARS_SLEAVE;
            case ARP_OPCODE_VAL_MARS_GROUPLIST_REQUEST:
                return ARP_OPCODE_MARS_GROUPLIST_REQUEST;
            case ARP_OPCODE_VAL_MARS_GROUPLIST_REPLY:
                return ARP_OPCODE_MARS_GROUPLIST_REPLY;
            case ARP_OPCODE_VAL_MARS_REDIRECT_MAP:
                return ARP_OPCODE_MARS_REDIRECT_MAP;
            case ARP_OPCODE_VAL_MAPOS_UNARP:
                return ARP_OPCODE_MAPOS_UNARP;
            case ARP_OPCODE_VAL_OP_EXP1:
                return ARP_OPCODE_OP_EXP1;
            case ARP_OPCODE_VAL_OP_EXP2:
                return ARP_OPCODE_OP_EXP2;
            default:
                return new ArpOpcode(opcode);
        }
    }
    
    public void write2Bytes(ChannelBuffer c) {
        c.writeShort(this.opcode);
    }
    
    public static ArpOpcode read2Bytes(ChannelBuffer c) {
        return ArpOpcode.of(c.readUnsignedShort());
    }
}