/*
 * 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.Map;
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 IntIntent ID corresponding to given intIntent
     */
    IntIntentId installIntIntent(IntIntent intIntent);

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

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

    /**
     * Returns all IntIntents installed in the network.
     *
     * @return an IntIntent
     */
    Map<IntIntentId, IntIntent> getIntIntents();

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