{
  "StartAt": "SetupWorkflow",
  "States": {
    "SetupWorkflow": {
      "Type": "Pass",
      "Parameters": {
        "note": "State machine workflow setup",
        "start_time.$": "$$.Execution.StartTime",
        "execution_id.$": "$$.Execution.Id",
        "status": "OK",
        "slack_channel": "#{slzNotificationSlackChannel}"
      },
      "ResultPath": "$.info",
      "Next": "AvailabilityCheck"
    },
    "AvailabilityCheck": {
      "Type": "Task",
      "Resource": "#{slzAvailabilityCheck_arn}",
      "Parameters": {
        "uow_id.$": "$.uow_id",
        "unit_of_work_id.$": "$.unit_of_work_id",
        "dsp.$": "$.dsp",
        "report_type.$": "$.report_type",
        "subtype.$": "$.subtype",
        "version.$": "$.version",
        "report_date.$": "$.report_date",
        "licensor.$": "$.licensor",
        "extension.$": "$.extension",
        "config_bucket.$": "$.config_bucket",
        "contexts.$": "$.contexts",
        "trace_id.$": "$.trace_id",
        "job_id.$": "$$.Execution.Name",
        "optional_config.$": "$.optional_config"
      },
      "Next": "IsReprocessingStart",
      "ResultPath": "$.availabilityCheck",
      "Retry": [
        {
          "ErrorEquals": ["States.TaskFailed"],
          "IntervalSeconds": 5,
          "MaxAttempts": 2,
          "BackoffRate": 2
        }
      ],
      "Catch": [
        {
          "ErrorEquals": [ "States.ALL" ],
          "ResultPath": "$.info.error",
          "Next": "MarkAsFailed"
        }
      ]
    },
    "IsReprocessingStart": {
      "Type": "Choice",
      "Choices": [
        {
          "Variable": "$.is_reprocessing",
          "BooleanEquals": true,
          "Next": "CleanUpTask"
        }
      ],
      "Default": "CheckContentsIsNotEmpty"
    },
    "CleanUpTask": {
      "Type": "Task",
      "Resource": "#{slzCleanUpJobs_arn}",
      "ResultPath": "$.cleanUpResult",
      "Catch": [
        {
          "ErrorEquals": [ "States.ALL" ],
          "ResultPath": "$.info.error",
          "Next": "MarkAsFailed"
        }
      ],
      "Retry": [
        {
          "ErrorEquals": ["States.TaskFailed"],
          "IntervalSeconds": 3,
          "MaxAttempts": 3,
          "BackoffRate": 2
        }
      ],
      "Next": "CheckContentsIsNotEmpty"
    },
    "CheckContentsIsNotEmpty": {
      "Type": "Choice",
      "Choices": [
        {
          "Variable": "$.availabilityCheck.isAnyContext",
          "BooleanEquals": true,
          "Next": "PrepareConfiguration"
        }
      ],
      "Default": "CheckUoWComplete"
    },
    "PrepareConfiguration": {
      "Type": "Task",
      "Resource": "#{slzReadConfiguration_arn}",
      "Parameters": {
        "uow_id.$": "$.uow_id",
        "unit_of_work_id.$": "$.unit_of_work_id",
        "dsp.$": "$.dsp",
        "report_type.$": "$.report_type",
        "subtype.$": "$.subtype",
        "version.$": "$.version",
        "report_date.$": "$.report_date",
        "licensor.$": "$.licensor",
        "extension.$": "$.extension",
        "config_bucket.$": "$.config_bucket",
        "priority.$": "$.priority",
        "contexts.$": "$.availabilityCheck.FilteredContexts",
        "trace_id.$": "$.trace_id",
        "job_id.$": "$$.Execution.Name",
        "validation_thresholds.$": "$.validation_thresholds",
        "optional_config.$": "$.optional_config"
      },
      "ResultPath": "$.ecs_config",
      "Next": "Download",
      "Retry": [
        {
          "ErrorEquals": ["States.TaskFailed"],
          "IntervalSeconds": 3,
          "MaxAttempts": 3,
          "BackoffRate": 2
        }
      ],
      "Catch": [
        {
          "ErrorEquals": [ "States.ALL" ],
          "ResultPath": "$.info.error",
          "Next": "MarkAsFailed"
        }
      ]
    },
    "Download": {
      "Type": "Map",
      "InputPath": "$",
      "ItemsPath": "$.ecs_config.Command",
      "MaxConcurrency": 5,
      "ResultPath": "$.result.download",
      "Next": "CheckUoWComplete",
      "Parameters": {
        "JobDefinition.$": "$.ecs_config.JobDefinition",
        "JobQueue.$": "$.ecs_config.JobQueue",
        "Command.$": "$$.Map.Item.Value",
        "UoW_id.$": "$.uow_id"
      },
      "Iterator": {
        "StartAt": "AEScrapper",
        "States": {
          "AEScrapper": {
            "Type": "Task",
            "TimeoutSeconds": 14400,
            "Resource": "arn:aws:states:::batch:submitJob.sync",
            "Parameters": {
              "JobDefinition.$": "$.JobDefinition",
              "JobName.$": "$.UoW_id",
              "JobQueue.$": "$.JobQueue",
              "ContainerOverrides": {
                "Command.$": "$.Command",
                "Environment": [
                  {
                    "Name": "SFN_TASK_TOKEN",
                    "Value.$": "$$.Task.Token"
                  }
                ]
              }
            },
            "End": true
          }
        }
      },
      "Retry": [
        {
          "ErrorEquals": ["States.TaskFailed"],
          "IntervalSeconds": 3,
          "MaxAttempts": 3,
          "BackoffRate": 2
        }
      ],
      "Catch": [
        {
          "ErrorEquals": [
            "States.ALL"
          ],
          "ResultPath": "$.info.error",
          "Next": "MarkAsFailed"
        }
      ]
    },
    "MarkAsFailed": {
      "Type": "Pass",
      "Result": "FAIL",
      "ResultPath": "$.info.status",
      "Next": "SetUoWStatusNotInProgress"
    },
    "CheckUoWComplete": {
      "Type": "Task",
      "Resource": "#{slzCheckComplete_arn}",
      "Parameters": {
        "dsp.$": "$.dsp",
        "uow_id.$": "$.uow_id",
        "unit_of_work_id.$": "$.unit_of_work_id",
        "licensor.$": "$.licensor",
        "report_type.$": "$.report_type",
        "trace_id.$": "$.trace_id",
        "optional_config.$": "$.optional_config"
      },
      "ResultPath": "$.result",
      "Next": "SetUoWStatusNotInProgress",
      "Catch": [
        {
          "ErrorEquals": [ "States.ALL" ],
          "ResultPath": "$.info.error",
          "Next": "MarkAsFailed"
        }
      ],
      "Retry": [
        {
          "ErrorEquals": ["States.TaskFailed"],
          "IntervalSeconds": 3,
          "MaxAttempts": 3,
          "BackoffRate": 2
        }
      ]
    },
    "SetUoWStatusNotInProgress": {
      "Type": "Task",
      "Resource": "#{slzUoWReset_arn}",
      "Parameters": {
        "uow_id.$": "$.uow_id",
        "unit_of_work_id.$": "$.unit_of_work_id",
        "trace_id.$": "$.trace_id",
        "optional_config.$": "$.optional_config"
      },
      "ResultPath": "$.result",
      "Next": "CheckJobStatus",
      "Catch": [
        {
          "ErrorEquals": [ "States.ALL" ],
          "ResultPath": "$.info.error",
          "Next": "FailureSlackNotify"
        }
      ],
      "Retry": [
        {
          "ErrorEquals": ["States.TaskFailed"],
          "IntervalSeconds": 3,
          "MaxAttempts": 3,
          "BackoffRate": 2
        }
      ]
    },
    "CheckJobStatus": {
      "Type": "Choice",
      "Choices": [
        {
          "Variable": "$.info.status",
          "StringEquals": "FAIL",
          "Next": "FailureSlackNotify"
        }
      ],
      "Default": "JobSucceed"
    },
    "FailureSlackNotify": {
      "Type": "Task",
      "Resource": "#{slzSlackNotify_arn}",
      "Parameters": {
        "channel.$": "$.info.slack_channel",
        "message.$": "$.info"
      },
      "Catch": [
        {
          "ErrorEquals": [ "States.ALL" ],
          "ResultPath": "$.info.error",
          "Next": "JobFail"
        }
      ],
      "Retry": [
        {
          "ErrorEquals": ["States.TaskFailed"],
          "IntervalSeconds": 3,
          "MaxAttempts": 3,
          "BackoffRate": 2
        }
      ],
      "Next": "JobFail"
    },
    "JobFail": {
      "Type": "Fail",
      "Cause": "UoW execution failed"
    },
    "JobSucceed": {
      "Type": "Succeed"
    }
  }
}
