/*
 * Copyright 2015 Open Networking Laboratory
 * Originally created by Pengfei Lu, Network and Cloud Computing Laboratory, Dalian University of Technology, China
 * Advisers: Keqiu Li, Heng Qi and Haisheng Yu
 * This work is supported by the State Key Program of National Natural Science of China(Grant No. 61432002)
 * and Prospective Research Project on Future Networks in Jiangsu Future Networks Innovation Institute.
 *
 * 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.acl;

import org.onosproject.net.DeviceId;
import org.onosproject.net.flow.FlowRule;
import org.onosproject.store.Store;

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

/**
 * Service interface exported by ACL distributed store.
 */
public interface AclStore extends Store {

    /**
     * Gets a list containing all ACL rules.
     *
     * @return a list containing all ACL rules
     */
    List<AclRule> getAclRules();

    /**
     * Adds a new ACL rule.
     *
     * @param rule new ACL rule
     */
    void addAclRule(AclRule rule);

    /**
     * Gets an existing ACL rule.
     *
     * @param ruleId ACL rule id
     * @return ACL rule with the given id
     */
    AclRule getAclRule(RuleId ruleId);

    /**
     * Removes an existing ACL rule by rule id.
     *
     * @param ruleId ACL rule id
     */
    void removeAclRule(RuleId ruleId);

    /**
     * Clears ACL and reset all.
     */
    void clearAcl();

    /**
     * Gets the current priority for new ACL flow rule by device id.
     *
     * @param deviceId device id
     * @return new ACL flow rule's priority in the given device
     */
    int getPriorityByDevice(DeviceId deviceId);

    /**
     * Gets a set containing all ACL flow rules belonging to a given ACL rule.
     *
     * @param ruleId ACL rule id
     * @return a set containing all ACL flow rules belonging to the given ACL rule
     */
    Set<FlowRule> getFlowByRule(RuleId ruleId);

    /**
     * Adds a new mapping from ACL rule to ACL flow rule.
     *
     * @param ruleId   ACL rule id
     * @param flowRule ACL flow rule
     */
    void addRuleToFlowMapping(RuleId ruleId, FlowRule flowRule);

    /**
     * Removes an existing mapping from ACL rule to ACL flow rule.
     *
     * @param ruleId ACL rule id
     */
    void removeRuleToFlowMapping(RuleId ruleId);

    /**
     * Gets a list containing all allowing ACL rules matching a given denying ACL rule.
     *
     * @param denyingRuleId denying ACL rule id
     * @return a list containing all allowing ACL rules matching the given denying ACL rule
     */
    List<RuleId> getAllowingRuleByDenyingRule(RuleId denyingRuleId);

    /**
     * Adds a new mapping from denying ACL rule to allowing ACL rule.
     *
     * @param denyingRuleId  denying ACL rule id
     * @param allowingRuleId allowing ACL rule id
     */
    void addDenyToAllowMapping(RuleId denyingRuleId, RuleId allowingRuleId);

    /**
     * Removes an exsiting mapping from denying ACL rule to allowing ACL rule.
     *
     * @param denyingRuleId denying ACL rule id
     */
    void removeDenyToAllowMapping(RuleId denyingRuleId);

    /**
     * Checks if an existing ACL rule already works in a given device.
     *
     * @param ruleId   ACL rule id
     * @param deviceId devide id
     * @return true if the given ACL rule works in the given device
     */
    boolean checkIfRuleWorksInDevice(RuleId ruleId, DeviceId deviceId);

    /**
     * Adds a new mapping from ACL rule to device.
     *
     * @param ruleId   ACL rule id
     * @param deviceId device id
     */
    void addRuleToDeviceMapping(RuleId ruleId, DeviceId deviceId);

    /**
     * Removes an existing mapping from ACL rule to device.
     *
     * @param ruleId ACL rule id
     */
    void removeRuleToDeviceMapping(RuleId ruleId);

}
