/*
 * Copyright 2016-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.roadm;

import org.onosproject.net.DeviceId;
import org.onosproject.net.PortNumber;

/**
 * Interface for the ROADM store. Currently used to store target power only.
 * This should be removed if target power could be read port annotations.
 */
public interface RoadmStore {

    /**
     * Adds the device to the store.
     *
     * <p>The device needs to be added to the store
     * before setTargetPower and getTargetPower can be used. This does not initialize
     * any of the target powers.
     *
     * @param deviceId DeviceId of the device to add
     */
    void addDevice(DeviceId deviceId);

    /**
     * Returns true if the device has been added to the store.
     *
     * @param deviceId DeviceId of the device to check
     * @return true if device has been added to the store, false otherwise
     */
    boolean deviceAvailable(DeviceId deviceId);

    /**
     * Stores the targetPower for a port on a device. The device needs to be added
     * to the store before this can be called. This does nothing if the device is
     * not added.
     *
     * @param deviceId DeviceId of the device
     * @param portNumber PortNumber of the port
     * @param targetPower target port power to store
     */
    void setTargetPower(DeviceId deviceId, PortNumber portNumber, double targetPower);

    /**
     * Returns the targetPower for a port on a device. The device needs to be added
     * to the store before this can be called. Returns null if the port's target
     * power has not yet been initialized using setTargetPower.
     *
     * @param deviceId DeviceId of the device
     * @param portNumber PortNumber of the port
     * @return target power if target power has already been set, null otherwise
     */
    Double getTargetPower(DeviceId deviceId, PortNumber portNumber);

    /**
     * Remove the targetPower for a port on a device. The power value is removed,
     * however, the device isn't.
     * @param deviceId DeviceId of the device
     * @param portNumber PortNumber of the port
     */
    void removeTargetPower(DeviceId deviceId, PortNumber portNumber);
}
