/*
 * Copyright 2016 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.ospf.protocol.lsa;

import com.google.common.base.MoreObjects;
import com.google.common.base.Objects;
import com.google.common.primitives.Bytes;
import org.onlab.packet.Ip4Address;
import org.onosproject.ospf.controller.OspfLsa;
import org.onosproject.ospf.controller.OspfLsaType;
import org.onosproject.ospf.protocol.util.OspfUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.net.InetAddress;
import java.util.ArrayList;
import java.util.List;

/**
 * Defines the LSA header, fields and the methods to access them.
 */
public class LsaHeader implements OspfLsa {

    /*
        0                   1                   2                   3
        0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       |            LS age             |    Options    |    LS type    |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       |                        Link State ID                          |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       |                     Advertising Router                        |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       |                     LS sequence number                        |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       |         LS checksum           |             length            |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       LSA header format
       REFERENCE : RFC 2328
     */
    protected static final Logger log = LoggerFactory.getLogger(LsaHeader.class);
    private int age;
    private int options;
    private int lsType;
    private long lsSequenceNo;
    private int lsCheckSum;
    private int lsPacketLen;
    private String linkStateId;
    private Ip4Address advertisingRouter;

    /**
     * Gets LSA age.
     *
     * @return LSA age
     */
    public int age() {
        return age;
    }

    /**
     * Sets LSA age.
     *
     * @param age LSA age
     */
    public void setAge(int age) {
        this.age = age;
    }

    /**
     * Gets options value.
     *
     * @return options header value
     */
    public int options() {
        return options;
    }

    /**
     * Sets options header value.
     *
     * @param options header value
     */
    public void setOptions(int options) {
        this.options = options;
    }

    /**
     * Gets LSA type.
     *
     * @return LSA type
     */
    public int lsType() {
        return lsType;
    }

    /**
     * Sets LSA type.
     *
     * @param lsType LSA type
     */
    public void setLsType(int lsType) {
        this.lsType = lsType;
    }

    /**
     * Gets link state id.
     *
     * @return linkStateId link state id
     */
    public String linkStateId() {
        return linkStateId;
    }

    /**
     * Sets link state id.
     *
     * @param linkStateId link state id
     */
    public void setLinkStateId(String linkStateId) {
        this.linkStateId = linkStateId;
    }

    /**
     * Gets advertising router IP.
     *
     * @return advertising router
     */
    public Ip4Address advertisingRouter() {
        return advertisingRouter;
    }

    /**
     * Sets advertising router.
     *
     * @param advertisingRouter advertising router
     */
    public void setAdvertisingRouter(Ip4Address advertisingRouter) {
        this.advertisingRouter = advertisingRouter;
    }

    /**
     * Gets LSA sequence number.
     *
     * @return LSA sequence number
     */
    public long lsSequenceNo() {
        return lsSequenceNo;
    }

    /**
     * Sets LSA sequence number.
     *
     * @param lsSequenceNo LSA sequence number
     */
    public void setLsSequenceNo(long lsSequenceNo) {
        this.lsSequenceNo = lsSequenceNo;
    }

    /**
     * Gets LSA check sum.
     *
     * @return lsCheckSum LSA checksum
     */
    public int lsCheckSum() {
        return lsCheckSum;
    }

    /**
     * Sets LSA checksum.
     *
     * @param lsCheckSum LSA checksum
     */
    public void setLsCheckSum(int lsCheckSum) {
        this.lsCheckSum = lsCheckSum;
    }

    /**
     * Gets lsa packet length.
     *
     * @return lsPacketLen LSA packet length
     */
    public int lsPacketLen() {
        return lsPacketLen;
    }

    /**
     * Sets LSA packet length.
     *
     * @param lsPacketLen LSA packet length
     */
    public void setLsPacketLen(int lsPacketLen) {
        this.lsPacketLen = lsPacketLen;
    }

    @Override
    public OspfLsaType getOspfLsaType() {
        if (lsType == OspfLsaType.ROUTER.value()) {
            return OspfLsaType.ROUTER;
        } else if (lsType == OspfLsaType.NETWORK.value()) {
            return OspfLsaType.NETWORK;
        } else if (lsType == OspfLsaType.SUMMARY.value()) {
            return OspfLsaType.SUMMARY;
        } else if (lsType == OspfLsaType.ASBR_SUMMARY.value()) {
            return OspfLsaType.ASBR_SUMMARY;
        } else if (lsType == OspfLsaType.EXTERNAL_LSA.value()) {
            return OspfLsaType.EXTERNAL_LSA;
        } else if (lsType == OspfLsaType.LINK_LOCAL_OPAQUE_LSA.value()) {
            return OspfLsaType.LINK_LOCAL_OPAQUE_LSA;
        } else if (lsType == OspfLsaType.AREA_LOCAL_OPAQUE_LSA.value()) {
            return OspfLsaType.AREA_LOCAL_OPAQUE_LSA;
        } else if (lsType == OspfLsaType.AS_OPAQUE_LSA.value()) {
            return OspfLsaType.AS_OPAQUE_LSA;
        }

        return OspfLsaType.UNDEFINED;
    }

    @Override
    public OspfLsa lsaHeader() {
        return this;
    }

    /**
     * Gets the LSA header as bytes.
     *
     * @return LSA header as bytes
     */
    public byte[] getLsaHeaderAsByteArray() {
        List<Byte> headerLst = new ArrayList<>();
        try {
            headerLst.addAll(Bytes.asList(OspfUtil.convertToTwoBytes(this.age())));
            headerLst.add((byte) this.options());
            headerLst.add((byte) this.lsType());
            headerLst.addAll(Bytes.asList(InetAddress.getByName(this.linkStateId()).getAddress()));
            headerLst.addAll(Bytes.asList(this.advertisingRouter().toOctets()));
            headerLst.addAll(Bytes.asList(OspfUtil.convertToFourBytes(this.lsSequenceNo())));
            headerLst.addAll(Bytes.asList(OspfUtil.convertToTwoBytes(this.lsCheckSum())));
            headerLst.addAll(Bytes.asList(OspfUtil.convertToTwoBytes(this.lsPacketLen())));
        } catch (Exception e) {
            log.debug("Error::getLsaHeaderAsByteArray {}", e.getMessage());
            return Bytes.toArray(headerLst);
        }
        return Bytes.toArray(headerLst);
    }

    /**
     * Populates the header from the LSA header instance.
     *
     * @param lsaHeader LSA header instance
     */
    public void populateHeader(LsaHeader lsaHeader) {
        //assign all the header values
        this.setAge(lsaHeader.age());
        this.setOptions(lsaHeader.options());
        this.setLsType(lsaHeader.lsType());
        this.setLinkStateId(lsaHeader.linkStateId());
        this.setAdvertisingRouter(lsaHeader.advertisingRouter());
        this.setLsSequenceNo(lsaHeader.lsSequenceNo());
        this.setLsCheckSum(lsaHeader.lsCheckSum());
        this.setLsPacketLen(lsaHeader.lsPacketLen());
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) {
            return true;
        }
        if (o == null || getClass() != o.getClass()) {
            return false;
        }
        LsaHeader that = (LsaHeader) o;
        return Objects.equal(age, that.age) &&
                Objects.equal(options, that.options) &&
                Objects.equal(lsType, that.lsType) &&
                Objects.equal(lsSequenceNo, that.lsSequenceNo) &&
                Objects.equal(lsCheckSum, that.lsCheckSum) &&
                Objects.equal(lsPacketLen, that.lsPacketLen) &&
                Objects.equal(linkStateId, that.linkStateId) &&
                Objects.equal(advertisingRouter, that.advertisingRouter);
    }

    @Override
    public int hashCode() {
        return Objects.hashCode(age, options, lsType, lsSequenceNo, lsCheckSum,
                                lsPacketLen, linkStateId, advertisingRouter);
    }

    @Override
    public String toString() {
        return MoreObjects.toStringHelper(getClass())
                .omitNullValues()
                .add("age", age)
                .add("options", options)
                .add("lsType", lsType)
                .add("lsSequenceNo", lsSequenceNo)
                .add("lsCheckSum", lsCheckSum)
                .add("lsPacketLen", lsPacketLen)
                .add("linkStateId;", linkStateId)
                .add("advertisingRouter", advertisingRouter)
                .toString();
    }
}