{
  "Comment": "Chartmetric",
  "StartAt": "SetupWorkflow",
  "States": {
    "SetupWorkflow": {
      "Type": "Pass",
      "Parameters": {
        "send_slack_notification": false,
        "until": "None",
        "sources": "None",
        "slack_channel": "#{slack_alerts_channel}",
        "start_time.$": "$$.Execution.StartTime",
        "execution_id.$": "$$.Execution.Id",
        "execution_name.$": "$$.Execution.Name",
        "unit_of_work_id.$": "$.unit_of_work_id",
        "last_attempt.$": "$.last_attempt",
        "uow": {
          "completeness_status.$": "$.next_completeness_status",
          "activity_status": "NOT_IN_PROGRESS"
        },
        "errors": {}
      },
      "ResultPath": "$.info",
      "Next": "StartInvoke"
    },
    "StartInvoke": {
      "Type": "Task",
      "Resource": "#{chartmetric_invoker_arn}",
      "ResultPath": "$.invokerOutput",
      "Retry": [
        {
          "ErrorEquals": [
            "States.TaskFailed",
            "States.Timeout"
          ],
          "IntervalSeconds": 3,
          "MaxAttempts": 2,
          "BackoffRate": 2
        }
      ],
      "Catch": [
        {
          "ErrorEquals": [
            "States.ALL"
          ],
          "ResultPath": "$.info.errors",
          "Next": "SendSlackNotificationFlag"
        }
      ],
      "Next": "IsDataUpdated"
    },
    "IsDataUpdated": {
      "Type": "Choice",
      "Choices": [
        {
          "Variable": "$.invokerOutput.statusCode",
          "NumericEquals": 400,
          "Next": "SendSlackNotificationFlag"
        },
        {
          "Variable": "$.invokerOutput.body.migration_needed_flag",
          "BooleanEquals": true,
          "Next": "StartMigrate"
        },
        {
          "Variable": "$.invokerOutput.body.migration_needed_flag",
          "BooleanEquals": false,
          "Next": "SyncUoWStatus"
        }
      ]
    },
    "StartMigrate": {
      "Type": "Task",
      "Resource": "arn:aws:states:::batch:submitJob.sync",
      "Next": "IsMigrationSuccessful",
      "ResultPath": "$.migratorOutput",
      "TimeoutSeconds": 3600,
      "Parameters": {
        "JobName.$": "$.invokerOutput.body.chartmetric_migrator_config.JobName",
        "JobQueue.$": "$.invokerOutput.body.chartmetric_migrator_config.JobQueue",
        "JobDefinition.$": "$.invokerOutput.body.chartmetric_migrator_config.JobDefinition",
        "ContainerOverrides": {
          "Command.$": "$.invokerOutput.body.chartmetric_migrator_config.Command",
          "Environment": [
            {
              "Name": "SFN_TASK_TOKEN",
              "Value.$": "$$.Task.Token"
            }
          ]
        }
      },
      "Retry": [
        {
          "ErrorEquals": [
            "States.TaskFailed",
            "States.Timeout"
          ],
          "IntervalSeconds": 10,
          "MaxAttempts": 2,
          "BackoffRate": 2
        }
      ],
      "Catch": [
        {
          "ErrorEquals": [
            "States.ALL"
          ],
          "ResultPath": "$.info.errors",
          "Next": "SendSlackNotificationFlag"
        }
      ]
    },
    "IsMigrationSuccessful": {
      "Type": "Choice",
      "Choices": [
        {
          "Variable": "$.migratorOutput.statusCode",
          "NumericEquals": 200,
          "Next": "StartStatus"
        },
        {
          "Variable": "$.migratorOutput.statusCode",
          "NumericEquals": 400,
          "Next": "SendSlackNotificationFlag"
        }
      ]
    },
    "StartStatus": {
      "Type": "Task",
      "Resource": "#{chartmetric_status_arn}",
      "Parameters": {
        "send_slack_notification": "$.info.send_slack_notification",
        "slack_channel": "$.info.slack_channel",
        "start_time.$": "$.info.start_time",
        "execution_id.$": "$.info.execution_id",
        "execution_name.$": "$.info.execution_name",
        "unit_of_work_id.$": "$.info.unit_of_work_id",
        "uow": {
          "completeness_status.$": "$.info.uow.completeness_status",
          "activity_status": "$.info.uow.activity_status"
        },
        "errors": "$.info.errors",
        "until.$": "$.info.until",
        "sources.$": "$.info.sources",
        "invokerOutput.$": "$.invokerOutput"
      },
      "ResultPath": "$.statusOutput",
      "Retry": [
        {
          "ErrorEquals": [
            "States.TaskFailed",
            "States.Timeout"
          ],
          "IntervalSeconds": 3,
          "MaxAttempts": 2,
          "BackoffRate": 2
        }
      ],
      "Catch": [
        {
          "ErrorEquals": [
            "States.ALL"
          ],
          "ResultPath": "$.info.errors",
          "Next": "SendSlackNotificationFlag"
        }
      ],
      "Next": "IsStatusUpdateSuccessful"
    },
    "IsStatusUpdateSuccessful": {
      "Type": "Choice",
      "Choices": [
        {
          "Variable": "$.statusOutput.statusCode",
          "NumericEquals": 200,
          "Next": "UoWStatusComplete"
        },
        {
          "Variable": "$.statusOutput.statusCode",
          "NumericEquals": 400,
          "Next": "SendSlackNotificationFlag"
        }
      ]
    },
    "UoWStatusComplete": {
      "Type": "Pass",
      "Result": "COMPLETE",
      "ResultPath": "$.info.uow.completeness_status",
      "Next": "SyncUoWStatus"
    },
    "SendSlackNotificationFlag": {
      "Type": "Pass",
      "Result": true,
      "ResultPath": "$.info.send_slack_notification",
      "Next": "UoWStatusFailed"
    },
    "UoWStatusFailed": {
      "Type": "Pass",
      "Result": "FAILED",
      "ResultPath": "$.info.uow.completeness_status",
      "Next": "SyncUoWStatus"
    },
    "SyncUoWStatus": {
      "Type": "Task",
      "Resource": "#{apps_etl_set_uow_status_arn}",
      "Parameters": {
        "execution_id.$": "$.info.execution_id",
        "unit_of_work_id.$": "$.info.unit_of_work_id",
        "values.$": "$.info.uow",
        "error.$": "$.info.errors"
      },
      "ResultPath": "$.results.uow",
      "Next": "CheckIfNeedSendSlackNotification",
      "Catch": [
        {
          "ErrorEquals": [
            "States.ALL"
          ],
          "ResultPath": "$.info.error",
          "Next": "SyncUoWStatusFailed"
        }
      ],
      "Retry": [
        {
          "ErrorEquals": [
            "States.TaskFailed"
          ],
          "IntervalSeconds": 3,
          "MaxAttempts": 3,
          "BackoffRate": 2
        }
      ]
    },
    "SyncUoWStatusFailed":{
      "Type": "Pass",
      "Result": true,
      "ResultPath": "$.info.send_slack_notification",
      "Next": "FailureSlackNotify"
    },
    "CheckIfNeedSendSlackNotification": {
      "Type": "Choice",
      "Choices": [
        {
          "Variable": "$.info.send_slack_notification",
          "BooleanEquals": true,
          "Next": "FailureSlackNotify"
        }
      ],
      "Default": "Success"
    },
    "FailureSlackNotify": {
      "Type": "Task",
      "Resource": "#{slack_notifications_arn}",
      "Parameters": {
        "channel.$": "$.info.slack_channel",
        "message.$": "$.info.errors"
      },
      "Catch": [
        {
          "ErrorEquals": [
            "States.ALL"
          ],
          "ResultPath": "$.info.error",
          "Next": "Failed"
        }
      ],
      "Retry": [
        {
          "ErrorEquals": [
            "States.TaskFailed"
          ],
          "IntervalSeconds": 3,
          "MaxAttempts": 3,
          "BackoffRate": 2
        }
      ],
      "ResultPath": "$.result",
      "Next": "CheckMaxFailureCount"
    },
    "CheckMaxFailureCount": {
      "Type": "Choice",
      "Choices": [
        {
          "Variable": "$.info.last_attempt",
          "BooleanEquals": true,
          "Next": "SlackNotificationAboutMaxFailureCount"
        }
      ],
      "Default": "Failed"
    },
    "SlackNotificationAboutMaxFailureCount": {
      "Type": "Task",
      "Resource": "#{slack_notifications_arn}",
      "Parameters": {
        "channel.$": "$.info.slack_channel",
        "message": {
          "message": "Max failure count is reached",
          "unit_of_work_id.$": "$.info.unit_of_work_id"
        }
      },
      "Catch": [
        {
          "ErrorEquals": [ "States.ALL" ],
          "ResultPath": "$.info.error",
          "Next": "Failed"
        }
      ],
      "Retry": [
        {
          "ErrorEquals": ["States.TaskFailed"],
          "IntervalSeconds": 3,
          "MaxAttempts": 3,
          "BackoffRate": 2
        }
      ],
      "Next": "Failed"
    },
    "Failed": {
      "Type": "Fail"
    },
    "Success": {
      "Type": "Succeed"
    }
  }
}
