/*
 * 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.net.region;

import org.onosproject.cluster.NodeId;
import org.onosproject.net.DeviceId;

import java.util.Collection;
import java.util.List;
import java.util.Set;

/**
 * Service for interacting with inventory of network control regions.
 */
public interface RegionAdminService extends RegionService {

    /**
     * Creates a new region using the supplied data.
     *
     * @param regionId      region identifier
     * @param name          friendly name
     * @param type          region type
     * @param masterNodeIds list of sets of master nodes; null implies empty list
     * @return new region descriptor
     * @throws IllegalArgumentException if region already exists
     */
    Region createRegion(RegionId regionId, String name, Region.Type type,
                        List<Set<NodeId>> masterNodeIds);

    /**
     * Update the specified region using the new set of data.
     *
     * @param regionId      region identifier
     * @param name          friendly name
     * @param type          region type
     * @param masterNodeIds list of sets of master nodes; null implies empty list
     * @return new region descriptor
     */
    Region updateRegion(RegionId regionId, String name, Region.Type type,
                        List<Set<NodeId>> masterNodeIds);

    /**
     * Removes the specified region using the new set of data.
     *
     * @param regionId region identifier
     */
    void removeRegion(RegionId regionId);

    /**
     * Adds the specified collection of devices to the region.
     *
     * @param regionId  region identifier
     * @param deviceIds list of device identifiers
     */
    void addDevices(RegionId regionId, Collection<DeviceId> deviceIds);

    /**
     * Removes the specified collection of devices from the region.
     *
     * @param regionId  region identifier
     * @param deviceIds list of device identifiers
     */
    void removeDevices(RegionId regionId, Collection<DeviceId> deviceIds);

}
