/*
 * 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;

/**
 * Priority route attribute.
 */
public final class RouteAttributePriority extends RouteAttribute {

    private static final int VALUE_LENGTH = 4;

    private final long priority;

    /**
     * Class constructor.
     *
     * @param length length
     * @param type type
     * @param priority priority
     */
    private RouteAttributePriority(int length, int type, long priority) {
        super(length, type);

        this.priority = priority;
    }

    /**
     * Returns the priority.
     *
     * @return priority
     */
    public long priority() {
        return priority;
    }

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

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

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

            return new RouteAttributePriority(length, type, priority);
        };
    }

}
