/*
 * Copyright 2018-present Open Networking Foundation
 *
 * 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 org.onosproject.openstacktelemetry.codec;

import org.onosproject.openstacktelemetry.api.ByteBufferCodec;
import org.onosproject.openstacktelemetry.api.StatsInfo;
import org.onosproject.openstacktelemetry.impl.DefaultStatsInfo;

import java.nio.ByteBuffer;

/**
 * StatsInfo ByteBuffer Codec.
 */
public class TinaStatsInfoByteBufferCodec extends ByteBufferCodec<StatsInfo> {

    private static final int MESSAGE_SIZE = 48;

    @Override
    public ByteBuffer encode(StatsInfo statsInfo) {

        ByteBuffer byteBuffer = ByteBuffer.allocate(MESSAGE_SIZE);

        byteBuffer.putLong(statsInfo.startupTime())
                .putLong(statsInfo.fstPktArrTime())
                .putInt(statsInfo.lstPktOffset())
                .putLong(statsInfo.prevAccBytes())
                .putInt(statsInfo.prevAccPkts())
                .putLong(statsInfo.currAccBytes())
                .putInt(statsInfo.currAccPkts())
                .putShort(statsInfo.errorPkts())
                .putShort(statsInfo.dropPkts());

        return byteBuffer;
    }

    @Override
    public StatsInfo decode(ByteBuffer byteBuffer) {

        long startupTime = byteBuffer.getLong();
        long fstPktArrTime = byteBuffer.getLong();
        int lstPktOffset = byteBuffer.getInt();
        long prevAccBytes = byteBuffer.getLong();
        int prevAccPkts = byteBuffer.getInt();
        long currAccBytes = byteBuffer.getLong();
        int currAccPkts = byteBuffer.getInt();
        short errorPkts = byteBuffer.getShort();
        short dropPkts = byteBuffer.getShort();

        return new DefaultStatsInfo.DefaultBuilder()
                .withStartupTime(startupTime)
                .withFstPktArrTime(fstPktArrTime)
                .withLstPktOffset(lstPktOffset)
                .withPrevAccBytes(prevAccBytes)
                .withPrevAccPkts(prevAccPkts)
                .withCurrAccBytes(currAccBytes)
                .withCurrAccPkts(currAccPkts)
                .withErrorPkts(errorPkts)
                .withDropPkts(dropPkts)
                .build();
    }
}
