/*
 * Copyright 2017-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.net.pi.runtime;

import com.google.common.annotations.Beta;
import org.onosproject.net.flow.FlowRule;
import org.onosproject.net.group.Group;
import org.onosproject.net.pi.model.PiPipeconf;

/**
 * A service to translate ONOS entities to protocol-independent ones.
 */
@Beta
public interface PiTranslationService {

    /**
     * Returns a PI table entry equivalent to the given flow rule for the given protocol-independent pipeline
     * configuration.
     *
     * @param rule     a flow rule
     * @param pipeconf a pipeline configuration
     * @return a table entry
     * @throws PiTranslationException if the flow rule cannot be translated
     */
    PiTableEntry translateFlowRule(FlowRule rule, PiPipeconf pipeconf)
            throws PiTranslationException;

    /**
     * Returns a PI action group equivalent to the given group for the given protocol-independent pipeline
     * configuration.
     *
     * @param group    a group
     * @param pipeconf a pipeline configuration
     * @return a PI action group
     * @throws PiTranslationException if the group cannot be translated
     */
    PiActionGroup translateGroup(Group group, PiPipeconf pipeconf)
            throws PiTranslationException;

    /**
     * Signals that an error was encountered while translating an entity.
     */
    class PiTranslationException extends Exception {

        /**
         * Creates a new exception with the given message.
         *
         * @param message a message
         */
        public PiTranslationException(String message) {
            super(message);
        }
    }
}
