/*
 * Copyright 2016-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.lisp.msg.types;

import io.netty.buffer.ByteBuf;
import org.onlab.packet.IpAddress;
import org.onosproject.lisp.msg.exceptions.LispParseError;
import org.onosproject.lisp.msg.exceptions.LispReaderException;
import org.onosproject.lisp.msg.exceptions.LispWriterException;

/**
 * IP address that is used by LISP Locator.
 */
public abstract class LispIpAddress extends LispAfiAddress {

    protected final IpAddress address;

    /**
     * Initializes LISP locator's IP address with AFI enum.
     *
     * @param address IP address
     * @param afi AFI enum
     */
    protected LispIpAddress(IpAddress address, AddressFamilyIdentifierEnum afi) {
        super(afi);
        this.address = address;
    }

    /**
     * Obtains LISP locator's IP address.
     *
     * @return IP address
     */
    public IpAddress getAddress() {
        return address;
    }

    @Override
    public int hashCode() {
        return address.hashCode();
    }

    @Override
    public boolean equals(Object obj) {
        return address.equals(obj);
    }

    @Override
    public String toString() {
        return address.toString();
    }

    /**
     * IP address reader class.
     */
    public static class IpAddressReader implements LispAddressReader<LispIpAddress> {

        @Override
        public LispIpAddress readFrom(ByteBuf byteBuf) throws LispParseError, LispReaderException {

            // AFI code -> 16 bits
            short afiCode = (short) byteBuf.readUnsignedShort();

            if (afiCode == 1) {
                return new LispIpv4Address.Ipv4AddressReader().readFrom(byteBuf);
            } else if (afiCode == 2) {
                return new LispIpv6Address.Ipv6AddressReader().readFrom(byteBuf);
            }

            return null;
        }
    }

    /**
     * IP address writer class.
     */
    public static class IpAddressWriter implements LispAddressWriter<LispIpAddress> {

        @Override
        public void writeTo(ByteBuf byteBuf, LispIpAddress address) throws LispWriterException {
            if (address.getAddress().isIp4()) {
                new LispIpv4Address.Ipv4AddressWriter().writeTo(byteBuf, (LispIpv4Address) address);
            }
            if (address.getAddress().isIp6()) {
                new LispIpv6Address.Ipv6AddressWriter().writeTo(byteBuf, (LispIpv6Address) address);
            }
        }
    }
}
