{
    "Comment": "Assets Transcoding State Machine",
    "StartAt": "Acknowledge",
    "States": {
      "Acknowledge": {
        "Type": "Task",
        "Resource": "${acknowledge_lambda_arn}",
        "Retry": [
          {
            "ErrorEquals": ["States.ALL"],
            "IntervalSeconds": 1,
            "MaxAttempts": 3
          }
        ],
        "Catch": [
          {
            "ErrorEquals": ["States.ALL"],
            "ResultPath": "$.Error",
            "Next": "AcknowledgeError"
          }
        ],
        "Next": "AcknowledgeStatusCheck"
      },
      "AcknowledgeStatusCheck": {
        "Type": "Choice",
        "Choices": [
          {
            "Variable": "$.acknowledge_status",
            "StringEquals": "asset_upload_already_handled",
            "Next": "End"
          },
          {
            "Variable": "$.acknowledge_status",
            "StringEquals": "ok",
            "Next": "EncodingRoute"
          }
        ]
      },
      "EncodingRoute": {
        "Type": "Task",
        "Resource": "${encoding_route_lambda_arn}",
        "Retry": [
          {
            "ErrorEquals": ["States.ALL"],
            "IntervalSeconds": 1,
            "MaxAttempts": 3
          }
        ],
        "Catch": [
          {
            "ErrorEquals": ["States.ALL"],
            "ResultPath": "$.Error",
            "Next": "EncodingRouteError"
          }
        ],
        "Next": "ChoiceTranscoding"
      },
      "ChoiceTranscoding": {
        "Type": "Choice",
        "Choices": [
          {
            "And": [
              { "Variable": "$.asset_upload_type", "IsPresent": true },
              { "Variable": "$.asset_upload_type", "StringEquals": "stereo" }
            ],
            "Next": "AudioValidation"
          },
          {
            "And": [
              { "Variable": "$.asset_upload_type", "IsPresent": true },
              { "Variable": "$.asset_upload_type", "StringEquals": "static_artwork" }
            ],
            "Next": "ImageValidation"
          },
          {
            "And": [
              { "Variable": "$.asset_upload_type", "IsPresent": true },
              { "Variable": "$.asset_upload_type", "StringEquals": "atmos" }
            ],
            "Next": "SpatialAudioValidation"
          },
          {
            "And": [
              { "Variable": "$.stop_processing", "IsPresent": true },
              { "Variable": "$.stop_processing", "BooleanEquals": true }
            ],
            "Next": "End"
          }
        ],
        "Default": "UnknownTranscodingType"
      },
      "UnknownTranscodingType": {
        "Type": "Fail",
        "Cause": "Unknown transcoding type."
      },
      "AudioValidation": {
        "Type": "Task",
        "Resource": "${audio_validation_lambda_arn}",
        "Retry": [
          {
            "ErrorEquals": ["LoggedException"],
            "MaxAttempts": 3
          },
          {
            "ErrorEquals": ["States.ALL"],
            "IntervalSeconds": 1,
            "MaxAttempts": 3
          }
        ],
        "Catch": [
          {
            "ErrorEquals": ["LoggedException"],
            "Next": "ErrorProcessed"
          },
          {
            "ErrorEquals": ["States.ALL"],
            "ResultPath": "$.Error",
            "Next": "AudioValidationError"
          }
        ],
        "Next": "IsAudioValid"
      },
      "IsAudioValid": {
        "Type": "Choice",
        "Choices": [
          {
            "Variable": "$.is_valid",
            "BooleanEquals": true,
            "Next": "End"
          }
        ],
        "Default": "ErrorProcessed"
      },
      "ImageValidation": {
        "Type": "Task",
        "Resource": "${image_validation_lambda_arn}",
        "Retry": [
          {
            "ErrorEquals": ["LoggedException"],
            "MaxAttempts": 3
          },
          {
            "ErrorEquals": ["States.ALL"],
            "IntervalSeconds": 1,
            "MaxAttempts": 3
          }
        ],
        "Catch": [
          {
            "ErrorEquals": ["LoggedException"],
            "Next": "ErrorProcessed"
          },
          {
            "ErrorEquals": ["States.ALL"],
            "ResultPath": "$.Error",
            "Next": "ImageValidationError"
          }
        ],
        "Next": "IsImageValid"
      },
      "IsImageValid": {
        "Type": "Choice",
        "Choices": [
          {
            "Variable": "$.is_valid",
            "BooleanEquals": true,
            "Next": "ImageEncoding"
          }
        ],
        "Default": "ErrorProcessed"
      },
      "ImageEncoding": {
        "Type": "Task",
        "Resource": "${image_encoding_lambda_arn}",
        "Retry": [
          {
            "ErrorEquals": ["States.ALL"],
            "IntervalSeconds": 1,
            "MaxAttempts": 3
          }
        ],
        "Catch": [
          {
            "ErrorEquals": ["States.ALL"],
            "ResultPath": "$.Error",
            "Next": "ImageEncodingError"
          }
        ],
        "End": true
      },
      "SpatialAudioValidation": {
        "Type": "Task",
        "Resource": "arn:aws:states:::sqs:sendMessage.waitForTaskToken",
        "Parameters": {
          "QueueUrl": "${spatial_audio_validation_queue_url}",
          "MessageBody": {
            "task_token.$": "$$.Task.Token",
            "asset_upload_type.$": "$.asset_upload_type",
            "atmos_bucket.$": "$.bucket",
            "atmos_key.$": "$.key",
            "lookup_stereo_reference": true,
            "report_validation_result": true
          }
        },
        "TimeoutSeconds": ${spatial_audio_validation_task_timeout_seconds},
        "HeartbeatSeconds": ${spatial_audio_validation_heartbeat_seconds},
        "Retry": [
          {
            "ErrorEquals": ["States.Timeout"]
          }
        ],
        "Catch": [
          {
            "ErrorEquals": ["OwsAssetsNotFound"],
            "Next": "SpatialAudioValidationSkipped"
          },
          {
            "ErrorEquals": ["States.ALL"],
            "ResultPath": "$.Error",
            "Next": "SpatialAudioValidationError"
          }
        ],
        "ResultPath": "$.spatial_audio_validation",
        "Next": "IsSpatialAudioValid"
      },
      "SpatialAudioValidationSkipped": {
        "Comment": "An ows-assets 404 (atmos input / stereo reference / stereo FLAC not found) means the asset is gone or has no stereo reference - skip cleanly rather than fail the execution; an expected, non-alarming occurrence.",
        "Type": "Succeed"
      },
      "SpatialAudioValidationError": {
        "Type": "Pass",
        "Result": "spatial-audio-validation",
        "ResultPath": "$.Function",
        "Next": "ErrorReporting"
      },
      "IsSpatialAudioValid": {
        "Type": "Choice",
        "Choices": [
          {
            "Variable": "$.spatial_audio_validation.is_valid",
            "BooleanEquals": true,
            "Next": "TriggerSpatialTranscoding"
          }
        ],
        "Default": "ErrorProcessed"
      },
      "TriggerSpatialTranscoding": {
        "Type": "Task",
        "Resource": "${trigger_spatial_transcoding_lambda_arn}",
        "Retry": [
          {
            "ErrorEquals": ["States.ALL"],
            "IntervalSeconds": 1,
            "MaxAttempts": 3
          }
        ],
        "Catch": [
          {
            "ErrorEquals": ["States.ALL"],
            "ResultPath": "$.Error",
            "Next": "TriggerSpatialTranscodingError"
          }
        ],
        "End": true
      },
      "AcknowledgeError": {
        "Type": "Pass",
        "Result": "acknowledge",
        "ResultPath": "$.Function",
        "Next": "ErrorReporting"
      },
      "EncodingRouteError": {
        "Type": "Pass",
        "Result": "encoding_route",
        "ResultPath": "$.Function",
        "Next": "ErrorReporting"
      },
      "AudioValidationError": {
        "Type": "Pass",
        "Result": "audio-validation",
        "ResultPath": "$.Function",
        "Next": "ErrorReporting"
      },
      "ImageValidationError": {
        "Type": "Pass",
        "Result": "images-validation",
        "ResultPath": "$.Function",
        "Next": "ErrorReporting"
      },
      "ImageEncodingError": {
        "Type": "Pass",
        "Result": "images-encoding",
        "ResultPath": "$.Function",
        "Next": "ErrorReporting"
      },
      "TriggerSpatialTranscodingError": {
        "Type": "Pass",
        "Result": "trigger-spatial-transcoding",
        "ResultPath": "$.Function",
        "Next": "ErrorReporting"
      },
      "ErrorReporting": {
        "Type": "Task",
        "Resource": "${error_reporting_lambda_arn}",
        "End": true
      },
      "ErrorProcessed": {
        "Type": "Pass",
        "Result": "The error was processed by lambda function",
        "End": true
      },
      "End": {
        "Type": "Succeed"
      }
    }
  }
