{
  "StartAt": "SetupWorkflow",
  "States": {
    "SetupWorkflow": {
      "Type": "Pass",
      "Parameters": {
        "note": "State machine workflow setup",
        "start_time.$": "$$.Execution.StartTime",
        "execution_id.$": "$$.Execution.Id",
        "execution_name.$": "$$.Execution.Name",
        "errors": {}
      },
      "ResultPath": "$.info",
      "Next": "WaitForDBTransactionCommitted"
    },
    "WaitForDBTransactionCommitted": {
      "Type": "Wait",
      "Seconds": 10,
      "Next": "CheckIfSplitRequired"
    },
    "CheckIfSplitRequired": {
      "Type": "Choice",
      "Default": "ArchiveFile",
      "Choices": [
        {
          "Variable": "$.action",
          "StringEquals": "SPLIT_ARCHIVE_COPY_DBX",
          "Next": "StartDatabricks"
        }
      ]
    },
    "StartDatabricks": {
      "Type":"Task",
      "Resource":"arn:aws:states:::lambda:invoke.waitForTaskToken",
      "Parameters":{
         "FunctionName":"#{expDatabricksRunner_arn}",
         "Payload":{
           "uow_id.$": "$.uow_id",
           "disassemble_content_status_id.$": "$.disassemble_content_status_id",
           "sf_token.$":"$$.Task.Token",
           "sf_execution_name.$": "$.info.execution_name",
           "dest_bucket.$": "$.dest_bucket",
           "source_path.$": "$.source_path",
           "databricks_job_id.$": "$.databricks_job_id",
           "databricks_spark_params.$": "$.databricks_spark_params",
           "trace_id.$": "$.trace_id"
         }
      },
      "TimeoutSeconds": 3600,
      "ResultPath": "$.results.databricks.start",
      "Catch": [
        {
          "ErrorEquals": [ "States.ALL" ],
          "ResultPath": "$.info.errors.datarbricks.start",
          "Next": "DBXFailed"
        }
      ],
      "Next": "WaitForDatabricksState"
    },
    "DBXFailed": {
      "Type": "Pass",
      "Next": "WaitForDatabricksState"
    },
    "WaitForDatabricksState": {
      "Type": "Wait",
      "Seconds": 60,
      "Next": "SyncDatabricksState"
    },
    "SyncDatabricksState": {
      "Type":"Task",
      "Resource": "#{expDatabricksStatusChecker_arn}",
      "Parameters": {
        "disassemble_content_status_id.$": "$.disassemble_content_status_id",
        "trace_id.$": "$.trace_id"
      },
      "ResultPath": "$.results.databricks.sync",
      "Next": "ResultsProcess",
      "Catch": [{
        "ErrorEquals": ["States.ALL"],
        "Next": "ResultsProcess",
        "ResultPath": "$.info.errors.datarbricks.sync"
      }]
    },
    "ArchiveFile": {
      "Type":"Task",
      "Resource": "#{expDatabricksArchive_arn}",
      "Parameters": {
        "dest_bucket.$": "$.dest_bucket",
        "source_path.$": "$.source_path",
        "content_name.$": "$.content_name",
        "disassemble_content_status_id.$": "$.disassemble_content_status_id",
        "archive_params.$": "$.archive_params",
        "action.$": "$.action",
        "trace_id.$": "$.trace_id"
      },
      "ResultPath": "$.results.archive",
      "Next": "ResultsProcess",
      "Retry": [
        {
          "ErrorEquals": ["States.TaskFailed"],
          "IntervalSeconds": 5,
          "MaxAttempts": 1,
          "BackoffRate": 2
        }
      ],
      "Catch": [{
        "ErrorEquals": ["States.ALL"],
        "Next": "ResultsProcess",
        "ResultPath": "$.info.errors.archive"
      }]
    },
    "ResultsProcess": {
      "Type": "Task",
      "Resource": "#{expDatabricksResultsProcess_arn}",
      "Parameters": {
        "context.$": "$.context",
        "content_name.$": "$.content_name",
        "dest_bucket.$": "$.dest_bucket",
        "disassemble_content_status_id.$": "$.disassemble_content_status_id",
        "source_path.$": "$.source_path",
        "results.$": "$.results",
        "uow_id.$": "$.uow_id",
        "action.$": "$.action",
        "trace_id.$": "$.trace_id"
      },
      "ResultPath": "$.results.result_process",
      "Next": "CheckResult"
    },
    "CheckResult": {
      "Type": "Choice",
      "Default": "Failed",
      "Choices": [
        {
          "Variable": "$.results.result_process.meta.status",
          "StringEquals": "OK",
          "Next": "Success"
        }
      ]
    },
    "Failed": {
      "Type": "Fail"
    },
    "Success": {
      "Type": "Succeed"
    }
  }
}
