// Copyright (c) Microsoft Corporation
// All rights reserved. 
//
// MIT License
//
// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated 
// documentation files (the "Software"), to deal in the Software without restriction, including without limitation 
// the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and 
// to permit persons to whom the Software is furnished to do so, subject to the following conditions:
// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING 
// BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, 
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 

package com.microsoft.frameworklauncher.common.model;

import com.microsoft.frameworklauncher.common.GlobalConstants;

import java.io.Serializable;

public enum ExitType implements Serializable {
  // Succeeded
  SUCCEEDED,

  // Failed, and it can ensure that it will success within a finite retry times:
  // such as dependent components shutdown, machine error, network error,
  // configuration error, environment error...
  TRANSIENT_NORMAL,

  // A special TRANSIENT_NORMAL which indicate the exit due to resource conflict
  // and cannot get required resource to run.
  TRANSIENT_CONFLICT,

  // Failed, and it can ensure that it will fail in every retry times:
  // such as incorrect usage, input data corruption...
  NON_TRANSIENT,

  // Failed, and it cannot offer any retry guarantee.
  UNKNOWN;

  public int toLauncherExitCode() {
    if (this == ExitType.SUCCEEDED) {
      return GlobalConstants.EXIT_CODE_LAUNCHER_SUCCEEDED;
    } else if (this == ExitType.TRANSIENT_NORMAL ||
        this == ExitType.TRANSIENT_CONFLICT) {
      return GlobalConstants.EXIT_CODE_LAUNCHER_TRANSIENT_FAILED;
    } else if (this == ExitType.NON_TRANSIENT) {
      return GlobalConstants.EXIT_CODE_LAUNCHER_NON_TRANSIENT_FAILED;
    } else {
      return GlobalConstants.EXIT_CODE_LAUNCHER_UNKNOWN_FAILED;
    }
  }
}
