/**
 *    Copyright 2012, Big Switch Networks, Inc.
 *
 *    Licensed under the Apache License, Version 2.0 (the "License"); you may
 *    not use this file except in compliance with the License. You may obtain
 *    a copy of the License at
 *
 *         http://www.apache.org/licenses/LICENSE-2.0
 *
 *    Unless required by applicable law or agreed to in writing, software
 *    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 *    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 *    License for the specific language governing permissions and limitations
 *    under the License.
 **/

/**
 *
 */
package net.onrc.onos.core.packet;

import java.nio.ByteBuffer;
import java.util.Arrays;

import org.apache.commons.lang.ArrayUtils;
import org.openflow.util.HexString;

/**
 * @author Shudong Zhou (shudong.zhou@bigswitch.com)
 */
public class BSNPROBE extends BasePacket {
    protected long controllerId;
    protected int sequenceId;
    protected byte[] srcMac;
    protected byte[] dstMac;
    protected long srcSwDpid;
    protected int srcPortNo;

    public BSNPROBE() {
        srcMac = new byte[6];
        dstMac = new byte[6];
    }


    public long getControllerId() {
        return this.controllerId;
    }

    public BSNPROBE setControllerId(long controllerId) {
        this.controllerId = controllerId;
        return this;
    }

    public int getSequenceId() {
        return sequenceId;
    }

    public BSNPROBE setSequenceId(int sequenceId) {
        this.sequenceId = sequenceId;
        return this;
    }

    public byte[] getSrcMac() {
        return ArrayUtils.clone(this.srcMac);
    }

    public BSNPROBE setSrcMac(byte[] srcMac) {
        this.srcMac = ArrayUtils.clone(srcMac);
        return this;
    }

    public byte[] getDstMac() {
        return ArrayUtils.clone(this.dstMac);
    }

    public BSNPROBE setDstMac(byte[] dstMac) {
        this.dstMac = ArrayUtils.clone(dstMac);
        return this;
    }

    public long getSrcSwDpid() {
        return srcSwDpid;
    }

    public BSNPROBE setSrcSwDpid(long srcSwDpid) {
        this.srcSwDpid = srcSwDpid;
        return this;
    }

    public int getSrcPortNo() {
        return srcPortNo;
    }

    public BSNPROBE setSrcPortNo(int srcPortNo) {
        this.srcPortNo = srcPortNo;
        return this;
    }

    @Override
    public byte[] serialize() {
        short length = 8 /* controllerId */ + 4 /* seqId */
                + 12 /* srcMac dstMac */ + 8 /* srcSwDpid */ + 4 /* srcPortNo */;

        byte[] payloadData = null;
        if (this.payload != null) {
            payload.setParent(this);
            payloadData = payload.serialize();
            length += payloadData.length;
        }

        byte[] data = new byte[length];
        ByteBuffer bb = ByteBuffer.wrap(data);
        bb.putLong(this.controllerId);
        bb.putInt(this.sequenceId);
        bb.put(this.srcMac);
        bb.put(this.dstMac);
        bb.putLong(this.srcSwDpid);
        bb.putInt(this.srcPortNo);
        if (payloadData != null) {
            bb.put(payloadData);
        }

        if (this.parent != null && this.parent instanceof BSN) {
            ((BSN) this.parent).setType(BSN.BSN_TYPE_PROBE);
        }

        return data;
    }

    @Override
    public IPacket deserialize(byte[] data, int offset, int length) {
        ByteBuffer bb = ByteBuffer.wrap(data, offset, length);

        controllerId = bb.getLong();
        sequenceId = bb.getInt();
        bb.get(this.srcMac, 0, 6);
        bb.get(this.dstMac, 0, 6);
        this.srcSwDpid = bb.getLong();
        this.srcPortNo = bb.getInt();

        if (bb.hasRemaining()) {
            this.payload = new Data();
            this.payload = payload.deserialize(data, bb.position(), bb.limit() - bb.position());
            this.payload.setParent(this);
        }

        return this;
    }

    /* (non-Javadoc)
     * @see java.lang.Object#hashCode()
     */
    @Override
    public int hashCode() {
        final int prime = 883;
        int result = super.hashCode();
        result = prime * result + Arrays.hashCode(srcMac);
        result = prime * result + Arrays.hashCode(dstMac);
        result = prime * result + (int) (srcSwDpid >> 32) + (int) srcSwDpid;
        result = prime * result + srcPortNo;
        return result;
    }

    /* (non-Javadoc)
     * @see java.lang.Object#equals(java.lang.Object)
     */
    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (!super.equals(obj)) {
            return false;
        }
        if (!(obj instanceof BSNPROBE)) {
            return false;
        }
        BSNPROBE other = (BSNPROBE) obj;
        if (!Arrays.equals(srcMac, other.srcMac)) {
            return false;
        }
        if (!Arrays.equals(dstMac, other.dstMac)) {
            return false;
        }
        return (sequenceId == other.sequenceId &&
                srcSwDpid == other.srcSwDpid &&
                srcPortNo == other.srcPortNo
        );
    }

    public String toString() {
        StringBuffer sb = new StringBuffer("\n");
        sb.append("BSN Probe packet");
        sb.append("\nSource Mac: ");
        sb.append(HexString.toHexString(srcMac));
        sb.append("\nDestination Mac: ");
        sb.append(HexString.toHexString(dstMac));
        sb.append("\nSource Switch: ");
        sb.append(HexString.toHexString(srcSwDpid));
        sb.append(" port: " + srcPortNo);
        sb.append("\nSequence No.:" + sequenceId);

        return sb.toString();
    }
}
