{
  "Comment": "HFA Request File Job State Machine",
  "StartAt": "GenerateHfaTmpFiles",
  "States": {
    "GenerateHfaTmpFiles": {
      "Type": "Task",
      "Resource": "${generate_hfa_tmp_files_lambda_arn}",
      "ResultPath": "$.generateHfaTmpFileResult",
      "Next": "CheckIfTmpFilesGenerated",
      "Retry": [
        {
          "ErrorEquals": [
            "States.ALL"
          ],
          "Comment": "Retry for all errors",
          "MaxAttempts": 0
        }
      ]
    },
    "CheckIfTmpFilesGenerated": {
      "Type": "Choice",
      "Choices": [
        {
          "Variable": "$.generateHfaTmpFileResult.generate_hfa_tmp_files_length",
          "NumericEquals": 0,
          "Next": "NoTmpFilesGenerated"
        },
        {
          "Variable": "$.generateHfaTmpFileResult.generate_hfa_tmp_files_length",
          "NumericGreaterThan": 0,
          "Next": "CreateHfaRequestFiles"
        }
      ],
      "Default": "NoTmpFilesGenerated",
      "Comment": "Checks if temporary HFA files are generated."
    },
    "NoTmpFilesGenerated": {
      "Type": "Pass",
      "End": true,
      "Comment": "No temporary files generated, ending workflow."
    },
    "CreateHfaRequestFiles": {
      "Type": "Task",
      "Resource": "${create_hfa_request_files_lambda_arn}",
      "InputPath": "$.generateHfaTmpFileResult",
      "ResultPath": "$.createHfaRequestFileResult",
      "Next": "CheckIfRequestFilesCreated",
      "Retry": [
        {
          "ErrorEquals": [
            "States.ALL"
          ],
          "Comment": "Retry for all errors",
          "MaxAttempts": 0
        }
      ]
    },
    "CheckIfRequestFilesCreated": {
      "Type": "Choice",
      "Choices": [
        {
          "Variable": "$.createHfaRequestFileResult.create_hfa_request_files_length",
          "NumericEquals": 0,
          "Next": "CleanUpS3Objects"
        },
        {
          "Variable": "$.createHfaRequestFileResult.create_hfa_request_files_length",
          "NumericGreaterThan": 0,
          "Next": "UploadHfaRequestFiles"
        }
      ],
      "Default": "CleanUpS3Objects",
      "Comment": "Checks if request files were created."
    },
    "UploadHfaRequestFiles": {
      "Type": "Task",
      "Resource": "${upload_hfa_request_files_lambda_arn}",
      "InputPath": "$.createHfaRequestFileResult",
      "ResultPath": "$.uploadHfaRequestFileResult",
      "Retry": [
        {
          "ErrorEquals": [
            "States.ALL"
          ],
          "Comment": "Retry for all errors",
          "MaxAttempts": 0
        }
      ],
      "Next": "CleanUpS3Objects"
    },
    "CleanUpS3Objects": {
      "Type": "Map",
      "ItemsPath": "$.createHfaRequestFileResult.files_to_cleanup",
      "ItemProcessor": {
        "ProcessorConfig": {
          "Mode": "INLINE"
        },
        "StartAt": "DeleteObject",
        "States": {
          "DeleteObject": {
            "Type": "Task",
            "Parameters": {
              "Bucket": "${s3_bucket}",
              "Key.$": "$"
            },
            "Resource": "arn:aws:states:::aws-sdk:s3:deleteObject",
            "End": true
          }
        }
      },
      "End": true,
      "Comment": "Dynamically deletes all generated temporary files."
    }
  }
}