/*
 * Copyright 2015 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.pim.impl;

import org.onlab.packet.IpAddress;
import org.onlab.packet.MacAddress;
import org.onlab.packet.pim.PIMHelloOption;
import org.slf4j.Logger;

import java.nio.ByteBuffer;
import java.util.Calendar;
import java.util.Date;
import java.util.Map;

import static org.slf4j.LoggerFactory.getLogger;

public class PIMNeighbor {

    private final Logger log = getLogger(getClass());

    // IP Address of this neighbor
    private IpAddress ipAddr;

    // MAC Address of the neighbor (Need for sending J/P)
    private MacAddress macAddr;

    // Hello Options
    // Our hello opt holdTime
    private short holdTime;

    // Our hello opt prune delay
    private int pruneDelay;

    // Neighbor priority
    private int priority;

    // Our current genId
    private int genId;

    // Our timestamp for this neighbor
    private Date lastRefresh;

    /**
     * Construct a new PIM Neighbor.
     *
     * @param ipAddr the IP Address of our new neighbor
     */
    public PIMNeighbor(IpAddress ipAddr, Map<Short, PIMHelloOption> opts) {
        this.ipAddr = ipAddr;
        this.addOptions(opts);
    }

    /**
     * Construct a new PIM neighbor.
     *
     * @param ipAddr the neighbors IP addr
     */
    public PIMNeighbor(IpAddress ipAddr, MacAddress macAddr) {
        this.ipAddr = ipAddr;
        this.macAddr = macAddr;
    }

    /**
     * Get the MAC address of this neighbor.
     *
     * @return the mac address
     */
    public MacAddress getMacaddr() {
        return macAddr;
    }

    /**
     * Get the IP Address of our neighbor.
     *
     * @return the IP address of our neighbor
     */
    public IpAddress getIpaddr() {
        return ipAddr;
    }

    /**
     * Set the IP address of our neighbor.
     *
     * @param ipAddr our neighbors IP address
     */
    public void setIpaddr(IpAddress ipAddr) {
        this.ipAddr = ipAddr;
    }

    /**
     * Get our neighbors holdTime.
     *
     * @return the holdTime
     */
    public short getHoldtime() {
        return holdTime;
    }

    /**
     * Set our neighbors holdTime.
     *
     * @param holdTime the holdTime
     */
    public void setHoldtime(short holdTime) {
        this.holdTime = holdTime;
    }

    /**
     * Get our neighbors prune delay.
     *
     * @return our neighbors prune delay
     */
    public int getPruneDelay() {
        return pruneDelay;
    }

    /**
     * Set our neighbors prune delay.
     *
     * @param pruneDelay the prune delay
     */
    public void setPruneDelay(int pruneDelay) {
        this.pruneDelay = pruneDelay;
    }

    /**
     * Get our neighbors priority.
     *
     * @return our neighbors priority
     */
    public int getPriority() {
        return priority;
    }

    /**
     * Set our neighbors priority.
     *
     * @param priority our neighbors priority
     */
    public void setPriority(int priority) {
        this.priority = priority;
    }

    /**
     * Get our neighbors Genid.
     *
     * @return our neighbor Genid
     */
    public int getGenid() {
        return genId;
    }

    /**
     * Set our neighbors GenId.
     *
     * @param genId our neighbors GenId
     */
    public void setGenid(int genId) {
        this.genId = genId;
    }

    /**
     * Add the options for this neighbor if needed.
     *
     * @param opts the options to be added/modified
     * @return true if options changed, false if no option has changed
     */
    public boolean addOptions(Map<Short, PIMHelloOption> opts) {

        boolean changed = false;

        for (PIMHelloOption opt : opts.values()) {
            Short otype = opt.getOptType();
            ByteBuffer val = ByteBuffer.wrap(opt.getValue());

            if (otype == PIMHelloOption.OPT_ADDRLIST) {
                // TODO: Will implement someday
            } else if (otype == PIMHelloOption.OPT_GENID) {
                int newval = val.getInt();
                if (newval != genId) {
                    genId = newval;
                    changed = true;
                }
            } else if (otype == PIMHelloOption.OPT_HOLDTIME) {
                short newval = val.getShort();
                if (newval != holdTime) {
                    holdTime = newval;
                    changed = true;
                }
            } else if (otype == PIMHelloOption.OPT_PRIORITY) {
                int newval = val.getInt();
                if (newval != priority) {
                    priority = newval;
                    changed = true;
                }
            } else if (otype == PIMHelloOption.OPT_PRUNEDELAY) {
                int newval = val.getInt();
                if (newval != pruneDelay) {
                    pruneDelay = newval;
                    changed = true;
                }
            } else {
                log.warn("received unknown pim hello options" + otype);
            }
        }
        return changed;
    }

    /**
     * Refresh this neighbors timestamp.
     */
    public void refreshTimestamp() {
        lastRefresh = Calendar.getInstance().getTime();
    }
}
