/*
 * Copyright 2015-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.onosproject.inbandtelemetry.api;

import com.google.common.annotations.Beta;
import org.onosproject.net.DeviceId;

import java.util.Set;

/**
 * Service for controlling INT-capable pipelines.
 */
@Beta
public interface IntService {
    /**
     * Represents the role of INT-capable devices.
     */
    enum IntDeviceRole {
        /**
         * Intermediate device to add its own INT metadata to an INT packet by
         * following the INT instruction in the INT header.
         */
        TRANSIT,
        /**
         * A device that creates, inserts INT headers into the packet, and
         * extracts the INT headers.
         */
        SOURCE_SINK
    }

    /**
     * Starts the INT functionalities in all INT-capable devices.
     * This will include populating tables to process INT packets.
     */
    void startInt();

    /**
     * Starts the INT functionalities in specified set of INT transit devices.
     * <p>
     * Note: this is an experimental API, which can be either changed or removed.
     *
     * @param transitDevices set of devices to start INT functionalities
     */
    void startInt(Set<DeviceId> transitDevices);

    /**
     * Stops the INT functionalities in all INT-capable devices.
     */
    void stopInt();

    /**
     * Stops the INT functionalities in specified set of INT transit devices.
     * <p>
     * Note: this is an experimental API, which can be either changed or removed.
     *
     * @param transitDevices set of devices to stop INT functionalities
     */
    void stopInt(Set<DeviceId> transitDevices);

    /**
     * Configures all INT-capable devices with given configuration.
     *
     * @param cfg configuration to set up
     */
    void setConfig(IntConfig cfg);

    /**
     * Retrieves the INT configuration.
     *
     * @return configuration
     */
    IntConfig getConfig();

    /**
     * Installs an IntIntent to devices.
     *
     * @param intIntent an IntIntent
     * @return an ID corresponding to given intIntent
     */
    int installIntIntent(IntIntent intIntent);

    /**
     * Removes an IntIntent from devices.
     *
     * @param intentId ID of the intIntent to remove
     */
    void removeIntIntent(int intentId);

    /**
     * Returns an intIntent for given intent ID.
     *
     * @param intentId id of the intIntent to retrieve
     * @return an IntIntent
     */
    IntIntent getIntIntent(int intentId);

    //TODO: [ONOS-7616] Design IntEvent and related APIs
}