{
    "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": "StartDownloadTask",
                "States": {
                    "StartDownloadTask": {
                        "Type": "Task",
                        "TimeoutSeconds": 25200,
                        "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"
        }
    }
}
