/**
 * 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.kafkaintegration.api;

import java.util.List;

import org.onosproject.kafkaintegration.api.dto.EventSubscriber;
import org.onosproject.kafkaintegration.api.dto.OnosEvent.Type;
import org.onosproject.kafkaintegration.api.dto.RegistrationResponse;
import org.onosproject.kafkaintegration.errors.InvalidApplicationException;
import org.onosproject.kafkaintegration.errors.InvalidGroupIdException;

import com.google.common.annotations.Beta;

/**
 * APIs for subscribing to Onos Event Messages.
 */
@Beta
public interface EventSubscriptionService {

    /**
     * Registers the external application to receive events generated in ONOS.
     *
     * @param appName Application Name
     * @return Registration Response DTO.
     */
    RegistrationResponse registerListener(String appName);

    /**
     * Removes the Registered Listener.
     *
     * @param appName Application Name
     */
    void unregisterListener(String appName);

    /**
     * Allows registered listener to subscribe for a specific event type.
     *
     * @param subscriber Subscription data containing the event type
     * @throws InvalidGroupIdException
     * @throws InvalidApplicationException
     */
    void subscribe(EventSubscriber subscriber)
            throws InvalidGroupIdException, InvalidApplicationException;

    /**
     * Allows the registered listener to unsubscribe for a specific event.
     *
     * @param subscriber Subscription data containing the event type
     * @throws InvalidGroupIdException
     * @throws InvalidApplicationException
     */
    void unsubscribe(EventSubscriber subscriber)
            throws InvalidGroupIdException, InvalidApplicationException;

    /**
     * Returns the event subscriber for various event types.
     *
     * @param type ONOS event type.
     * @return List of event subscribers
     */
    List<EventSubscriber> getEventSubscribers(Type type);
}
