/*
 *  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.ui.impl.topo.model;

import com.fasterxml.jackson.databind.node.ObjectNode;
import org.onosproject.event.AbstractEvent;
import org.onosproject.ui.model.topo.UiElement;

/**
 * UI Topology model events.
 */
public class UiModelEvent extends AbstractEvent<UiModelEvent.Type, UiElement> {

    /**
     * Enumeration of event types.
     */
    enum Type {
        CLUSTER_MEMBER_ADDED_OR_UPDATED,
        CLUSTER_MEMBER_REMOVED,

        REGION_ADDED_OR_UPDATED,
        REGION_REMOVED,

        DEVICE_ADDED_OR_UPDATED,
        DEVICE_REMOVED,

        LINK_ADDED_OR_UPDATED,
        LINK_REMOVED,

        HOST_ADDED_OR_UPDATED,
        HOST_MOVED,
        HOST_REMOVED
    }

    private final ObjectNode data;
    private final String memo;

    /**
     * Creates a UI model event. Note that the memo field can be used to
     * pass a hint to the listener about the event.
     *
     * @param type    event type
     * @param subject subject of the event
     * @param data    data containing details of the subject
     * @param memo    a note about the event
     */
    protected UiModelEvent(Type type, UiElement subject, ObjectNode data,
                           String memo) {
        super(type, subject);
        this.data = data;
        this.memo = memo;
    }

    /**
     * Returns the data of the subject.
     *
     * @return the subject data
     */
    public ObjectNode data() {
        return data;
    }

    /**
     * Returns the memo.
     *
     * @return the memo
     */
    public String memo() {
        return memo;
    }

}
