/*
 * Copyright 2018-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.workflow.api;


import org.onosproject.event.Event;

/**
 * An interface representing worklet. A workflow is composed of worklets.
 */
public interface Worklet {

    int MAX_WORKS = 1000;

    /**
     * Returns tag name of worklet. class name is usually used.
     * @return tag name
     */
    String tag();

    /**
     * Processes tasks of the worklet under the workflow context.
     * @param context workflow context
     * @throws WorkflowException workflow exception
     */
    void process(WorkflowContext context) throws WorkflowException;

    /**
     * Checks whether is this worklet next worklet to be done under the workflow context.
     * @param context workflow context
     * @return true means this worklet is the next worklet to be processed
     * @throws WorkflowException workflow exception
     */
    boolean isNext(WorkflowContext context) throws WorkflowException;

    /**
     * Checks whether is this worklet completed or not. 'isCompleted' checking is triggered by an event task.
     * @param context workflow context
     * @param event an event triggering this 'isCompleted' checking
     * @return completed or not
     * @throws WorkflowException workflow exception
     */
    boolean isCompleted(WorkflowContext context, Event event) throws WorkflowException;

    /**
     * Completion event timeout handler.
     * @param context workflow context
     * @throws WorkflowException workflow exception
     */
    void timeout(WorkflowContext context) throws WorkflowException;

    /**
     * Common worklet enum.
     */
    enum Common implements Worklet {

        /**
         * Init worklet.
         */
        INIT {
            @Override
            public String tag() {
                return INIT.name();
            }

            @Override
            public void process(WorkflowContext context) throws WorkflowException {
                throw new WorkflowException("(" + tag() + ").process should not be called");
            }

            @Override
            public boolean isNext(WorkflowContext context) throws WorkflowException {
                throw new WorkflowException("(" + tag() + ").isNext should not be called");
            }

            @Override
            public boolean isCompleted(WorkflowContext context, Event event)throws WorkflowException {
                throw new WorkflowException("(" + tag() + ").isCompleted should not be called");
            }

            @Override
            public void timeout(WorkflowContext context) throws WorkflowException {
                throw new WorkflowException("(" + tag() + ").timeout should not be called");
            }
        },

        /**
         * Completed worklet.
         */
        COMPLETED {
            @Override
            public String tag() {
                return COMPLETED.name();
            }

            @Override
            public void process(WorkflowContext context) throws WorkflowException {
                throw new WorkflowException("(" + tag() + ").process should not be called");
            }

            @Override
            public boolean isNext(WorkflowContext context) throws WorkflowException {
                throw new WorkflowException("(" + tag() + ").isNext should not be called");
            }

            @Override
            public boolean isCompleted(WorkflowContext context, Event event)throws WorkflowException {
                throw new WorkflowException("(" + tag() + ").isCompleted should not be called");
            }

            @Override
            public void timeout(WorkflowContext context) throws WorkflowException {
                throw new WorkflowException("(" + tag() + ").timeout should not be called");
            }
        },

        /**
         * Interrupted worklet.
         */
        INTERRUPTED {
            @Override
            public String tag() {
                return INTERRUPTED.name();
            }

            @Override
            public void process(WorkflowContext context) throws WorkflowException {
                throw new WorkflowException("(" + tag() + ").process should not be called");
            }

            @Override
            public boolean isNext(WorkflowContext context) throws WorkflowException {
                throw new WorkflowException("(" + tag() + ").isNext should not be called");
            }

            @Override
            public boolean isCompleted(WorkflowContext context, Event event)throws WorkflowException {
                throw new WorkflowException("(" + tag() + ").isCompleted should not be called");
            }

            @Override
            public void timeout(WorkflowContext context) throws WorkflowException {
                throw new WorkflowException("(" + tag() + ").timeout should not be called");
            }
        }
    }
}

