/**
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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.apache.oozie.action;

import org.apache.oozie.util.ParamChecker;
import org.apache.oozie.util.XLog;

import java.util.Objects;

/**
 * ActionExecutor exception. <p> The exception provides information regarding the transient/no-transient/fatal nature
 * of the exception.
 */
public class ActionExecutorException extends Exception {

    /**
     * Enum that defines the type of error an {@link ActionExecutor} has produced.
     */
    public static enum ErrorType {

        /**
         * The action will be automatically retried by Oozie.
         */
        TRANSIENT,

        /**
         * The job in set in SUSPEND mode and it will wait for an admin to resume the job.
         */

        NON_TRANSIENT,

        /**
         * The action completes with an error transition.
         */
        ERROR,

        /**
         * The action fails. No transition is taken.
         */
        FAILED
    }

    private ErrorType errorType;
    private String errorCode;

    /**
     * Create an action executor exception.
     *
     * @param errorType the error type.
     * @param errorCode the error code.
     * @param message the error message.
     */
    public ActionExecutorException(ErrorType errorType, String errorCode, String message) {
        super(message);
        this.errorType = Objects.requireNonNull(errorType, "errorType cannot be null");
        this.errorCode = ParamChecker.notEmpty(errorCode, "errorCode");
    }

    /**
     * Create an action executor exception.
     *
     * <p> If the last parameter is an Exception it is used as the exception cause.
     *
     * @param errorType the error type.
     * @param errorCode the error code.
     * @param messageTemplate the error message.
     * @param params parameters used to create the exception message together with the messageTemplate. If the last
     * parameter is an Exception it is used as the exception cause.
     */
    public ActionExecutorException(ErrorType errorType, String errorCode, String messageTemplate, Object... params) {
        super(errorCode + ": " + XLog.format(messageTemplate, params), XLog.getCause(params));
        this.errorType = Objects.requireNonNull(errorType, "errorType cannot be null");
        this.errorCode = ParamChecker.notEmpty(errorCode, "errorCode");
    }

    /**
     * Return the error type of the exception.
     *
     * @return the error type of the exception.
     */
    public ErrorType getErrorType() {
        return errorType;
    }

    /**
     * Return the error code of the exception.
     *
     * @return the error code of the exception.
     */
    public String getErrorCode() {
        return errorCode;
    }
}
