/*
 * Copyright 2017-present Open Networking Laboratory
 *
 * 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 org.onlab.packet.Ip4Address;
import org.onlab.packet.Ip6Address;
import org.onlab.packet.IpAddress;

/**
 * Gateway route attribute.
 */
public final class RouteAttributeGateway extends RouteAttribute {

    public static final int VALUE_LENGTH = 4;

    private final IpAddress gateway;

    /**
     * Class constructor.
     *
     * @param length length
     * @param type type
     * @param gateway gateway address
     */
    private RouteAttributeGateway(int length, int type, IpAddress gateway) {
        super(length, type);

        this.gateway = gateway;
    }

    /**
     * Returns the gateway address.
     *
     * @return gateway address
     */
    public IpAddress gateway() {
        return gateway;
    }

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

    /**
     * Returns a decoder for a gateway route attribute.
     *
     * @return gateway route attribute decoder
     */
    public static RouteAttributeDecoder<RouteAttributeGateway> decoder() {
        return (int length, int type, byte[] value) -> {

            IpAddress gateway;
            if (value.length == Ip4Address.BYTE_LENGTH) {
                gateway = IpAddress.valueOf(IpAddress.Version.INET, value);
            } else if (value.length == Ip6Address.BYTE_LENGTH) {
                gateway = IpAddress.valueOf(IpAddress.Version.INET6, value);
            } else {
                throw new DeserializationException("Invalid address length");
            }

            return new RouteAttributeGateway(length, type, gateway);
        };
    }

}
