/*
 * Copyright 2018-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.opencord.dhcpl2relay;

import org.onosproject.event.AbstractEvent;
import org.onosproject.net.ConnectPoint;

import java.util.Map;
import java.util.concurrent.atomic.AtomicLong;

/**
 * Dhcp L2 relay event.
 */
public class DhcpL2RelayEvent extends AbstractEvent<DhcpL2RelayEvent.Type, DhcpAllocationInfo> {

    private final ConnectPoint connectPoint;

    private final Map.Entry<String, AtomicLong> countersEntry;

    private final String dhcpCountersTopic;

    private final String subscriberId;

    /**
     * Type of the event.
     */
    public enum Type {
        /**
         * DHCP lease was updated.
         */
        UPDATED,

        /**
         * DHCP lease was removed.
         */
        REMOVED,

        /**
         * DHCP stats update.
         */
        STATS_UPDATE
    }

    /**
     * Creates a new event used for STATS.
     *
     * @param type type of the event
     * @param allocationInfo DHCP allocation info
     * @param connectPoint connect point the client is on
     * @param countersEntry an entry that represents the counters (used for STATS events)
     * @param dhcpCountersTopic Kafka topic where the dhcp counters are published
     * @param subscriberId the subscriber identifier information
     */
    public DhcpL2RelayEvent(Type type, DhcpAllocationInfo allocationInfo, ConnectPoint connectPoint,
                            Map.Entry<String, AtomicLong> countersEntry,
                            String dhcpCountersTopic, String subscriberId) {
        super(type, allocationInfo);
        this.connectPoint = connectPoint;
        this.countersEntry = countersEntry;
        this.dhcpCountersTopic = dhcpCountersTopic;
        this.subscriberId = subscriberId;
    }

    /**
     * Creates a new event.
     *
     * @param type type of the event
     * @param allocationInfo DHCP allocation info
     * @param connectPoint connect point the client is on
     */
    public DhcpL2RelayEvent(Type type, DhcpAllocationInfo allocationInfo, ConnectPoint connectPoint) {
        super(type, allocationInfo);
        this.connectPoint = connectPoint;
        this.countersEntry = null;
        this.dhcpCountersTopic = null;
        this.subscriberId = null;
    }

    /**
     * Gets the DHCP client connect point.
     *
     * @return connect point
     */
    public ConnectPoint connectPoint() {
        return connectPoint;
    }

    /**
     * Gets the counters map entry.
     *
     * @return counters map entry
     */
    public Map.Entry<String, AtomicLong> getCountersEntry() {
        return countersEntry;
    }

    /**
     * Gets the Kafka topic where the dhcp counters are published.
     *
     * @return the dhcp kafka topic
     */
    public String getDhcpCountersTopic() {
        return dhcpCountersTopic;
    }

    /**
     * Gets the subscriber identifier information.
     *
     * @return the Id from subscriber
     */
    public String getSubscriberId() {
        return subscriberId;
    }
}
