/*
 * Copyright 2017-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.routing.fpm.protocol;

import com.google.common.base.MoreObjects;
import org.onlab.packet.DeserializationException;

import java.nio.ByteBuffer;

/**
 * Output interface route attribute.
 */
public final class RouteAttributeOif extends RouteAttribute {

    private static final int VALUE_LENGTH = 4;

    private final long outputInterface;

    /**
     * Class constructor.
     *
     * @param length length
     * @param type type
     * @param outputInterface output interface
     */
    private RouteAttributeOif(int length, int type, long outputInterface) {
        super(length, type);

        this.outputInterface = outputInterface;
    }

    /**
     * Returns the output interface.
     *
     * @return output interface
     */
    public long outputInterface() {
        return outputInterface;
    }

    @Override
    public String toString() {
        return MoreObjects.toStringHelper(getClass())
                .add("type", type())
                .add("length", length())
                .add("outputInterface", outputInterface)
                .toString();
    }

    /**
     * Returns a decoder for a output interface route attribute.
     *
     * @return output interface route attribute decoder
     */
    public static RouteAttributeDecoder<RouteAttributeOif> decoder() {
        return (int length, int type, byte[] value) -> {
            if (value.length != VALUE_LENGTH) {
                throw new DeserializationException("Wrong value length");
            }

            long outputInterface = Integer.reverseBytes(ByteBuffer.wrap(value).getInt());

            return new RouteAttributeOif(length, type, outputInterface);
        };
    }
}
