{
  "Comment": "Workflow for NR Ownership Delivery",
  "StartAt": "OrderPopulator",
  "States": {
    "OrderPopulator": {
      "Type": "Task",
      "Resource": "arn:aws:states:::lambda:invoke",
      "Parameters": {
        "Payload": {
          "context": {
            "Execution": {
              "Id.$": "$$.Execution.Id",
              "Name.$": "$$.Execution.Name"
            },
            "State": {
              "Name.$": "$$.State.Name"
            },
            "StateMachine.$": "$$.StateMachine"
          },
          "order.$": "$.order",
          "profile.$": "$.profile"
        },
        "FunctionName": "${order_populator_arn}"
      },
      "Next": "OrderEmptyDecider",
      "OutputPath": "$.Payload",
      "Retry": [
        {
          "ErrorEquals": [
            "States.ALL"
          ],
          "IntervalSeconds": 5,
          "Comment": "Retry on timeout"
        }
      ],
      "Catch": [
        {
          "ErrorEquals": [
            "States.ALL"
          ],
          "Next": "OrderFinalizer",
          "ResultPath": "$.error"
        }
      ]
    },
    "OrderEmptyDecider": {
      "Comment": "skip the bulk of the step function if no sound recordings were picked up",
      "Type": "Choice",
      "OutputPath": "$",
      "InputPath": "$",
      "Choices": [
        {
          "Variable": "$.soundRecordingsProcessed",
          "NumericEquals": 0,
          "Next": "OrderEmptyPass"
        }
      ],
      "Default": "TemplateDataLoaderFanout"
    },
    "OrderEmptyPass": {
      "Comment": "pass through a null outputFile to the OrderFinalizer, to indicate that nothing was generated",
      "Type": "Pass",
      "Parameters": {
        "outputFile": null
      },
      "Next": "OrderFinalizer"
    },
    "TemplateDataLoaderFanout": {
      "Type": "Map",
      "Next": "DdexFormatterDecider",
      "Label": "Map",
      "MaxConcurrency": 10,
      "ResultPath": null,
      "OutputPath": null,
      "ToleratedFailurePercentage": 0,
      "ItemReader": {
        "Resource": "arn:aws:states:::s3:getObject",
        "ReaderConfig": {
          "InputType": "JSON"
        },
        "Parameters": {
          "Bucket": "${bucket_name}",
          "Key.$": "$.soundRecordingsFilePath"
        }
      },
      "ItemBatcher": {
        "MaxItemsPerBatch": 100,
        "BatchInput": {
          "context": {
            "Execution": {
              "Id.$": "$$.Execution.Id",
              "Name.$": "$$.Execution.Name"
            },
            "State": {
              "Name.$": "$$.State.Name"
            },
            "StateMachine.$": "$$.StateMachine"
          },
          "order.$": "$$.Execution.Input.order",
          "profile.$": "$$.Execution.Input.profile"
        }
      },
      "ItemProcessor": {
        "ProcessorConfig": {
          "Mode": "DISTRIBUTED",
          "ExecutionType": "STANDARD"
        },
        "StartAt": "TemplateDataLoader",
        "States": {
          "TemplateDataLoader": {
            "Type": "Task",
            "Next": "OrchHistoryFilterDecider",
            "Resource": "arn:aws:states:::lambda:invoke",
            "ResultSelector": {
              "accountIds.$": "$.Payload.accountIds",
              "orchardSoundRecordings.$":  "$.Payload.orchardSoundRecordings"
            },
            "ResultPath": "$",
            "Parameters": {
              "Payload": {
                "context": {
                  "Execution": {
                    "Id.$": "$.BatchInput.context.Execution.Id",
                    "Name.$": "$.BatchInput.context.Execution.Name"
                  },
                  "State": {
                    "Name.$": "$.BatchInput.context.State.Name"
                  },
                  "StateMachine.$": "$.BatchInput.context.StateMachine"
                },
                "order.$": "$.BatchInput.order",
                "profile.$": "$.BatchInput.profile",
                "Items.$": "$.Items"
              },
              "FunctionName": "${template_data_loader_arn}"
            },
            "Retry": [
              {
                "ErrorEquals": [
                  "States.ALL"
                ],
                "IntervalSeconds": 30,
                "Comment": "Retry on timeout"
              }
            ]
          },
          "OrchHistoryFilterDecider": {
            "Type": "Choice",
            "OutputPath": "$",
            "InputPath": "$",
            "Choices": [
              {
                "Variable": "$$.Execution.Input.BatchInput.order.isrcListFileUUID",
                "IsNull": true,
                "Next": "OrchardHistoryFilter"
              }
            ],
            "Default": "ContractProcessor"
          },
          "OrchardHistoryFilter": {
            "Type": "Task",
            "Next": "ContractProcessor",
            "Resource": "arn:aws:states:::lambda:invoke",
            "ResultPath": null,
            "Parameters": {
              "Payload": {
                "context": {
                  "Execution": {
                    "Id.$": "$$.Execution.Input.BatchInput.context.Execution.Id",
                    "Name.$": "$$.Execution.Input.BatchInput.context.Execution.Name"
                  },
                  "State": {
                    "Name.$": "$$.Execution.Input.BatchInput.context.State.Name"
                  },
                  "StateMachine.$": "$$.Execution.Input.BatchInput.context.StateMachine"
                },
                "order.$": "$$.Execution.Input.BatchInput.order",
                "Items.$": "$$.Execution.Input.Items",
                "orchardSoundRecordings.$": "$.orchardSoundRecordings"
              },
              "FunctionName": "${orchard_history_filter_arn}"
            },
            "Retry": [
              {
                "ErrorEquals": [
                  "States.ALL"
                ],
                "IntervalSeconds": 30,
                "Comment": "Retry on timeout"
              }
            ]
          },
          "ContractProcessor": {
            "Type": "Task",
            "Next": "DdexGenerationDecider",
            "Resource": "arn:aws:states:::lambda:invoke",
            "OutputPath": "$.Payload",
            "Parameters": {
              "Payload": {
                "context": {
                  "Execution": {
                    "Id.$": "$$.Execution.Input.BatchInput.context.Execution.Id",
                    "Name.$": "$$.Execution.Input.BatchInput.context.Execution.Name"
                  },
                  "State": {
                    "Name.$": "$$.Execution.Input.BatchInput.context.State.Name"
                  },
                  "StateMachine.$": "$$.Execution.Input.BatchInput.context.StateMachine"
                },
                "order.$": "$$.Execution.Input.BatchInput.order",
                "Items.$": "$$.Execution.Input.Items",
                "accountIds.$": "$.accountIds"
              },
              "FunctionName": "${contract_processor_arn}"
            },
            "Retry": [
              {
                "ErrorEquals": [
                  "States.ALL"
                ],
                "IntervalSeconds": 5,
                "Comment": "Retry on timeout"
              }
            ]
          },
          "DdexGenerationDecider": {
            "Type": "Choice",
            "OutputPath": "$",
            "InputPath": "$",
            "Choices": [
              {
                "Variable": "$$.Execution.Input.BatchInput.order.societyMetadata.format",
                "StringEquals": "DDEX_RDRN_V_1_4",
                "Next": "DdexGenerator"
              }
            ],
            "Default": "MetadataGenerator"
          },
          "MetadataGenerator": {
            "Type": "Task",
            "Resource": "arn:aws:states:::lambda:invoke",
            "ResultPath": null,
            "OutputPath": null,
            "InputPath": "$",
            "Parameters": {
              "Payload": {
                "context": {
                  "Execution": {
                    "Id.$": "$$.Execution.Input.BatchInput.context.Execution.Id",
                    "Name.$": "$$.Execution.Input.BatchInput.context.Execution.Name"
                  },
                  "State": {
                    "Name.$": "$$.Execution.Input.BatchInput.context.State.Name"
                  },
                  "StateMachine.$": "$$.Execution.Input.BatchInput.context.StateMachine"
                },
                "order.$": "$$.Execution.Input.BatchInput.order",
                "profile.$": "$$.Execution.Input.BatchInput.profile",
                "Items.$": "$$.Execution.Input.Items",
                "input.$": "$"
              },
              "FunctionName": "${metadata_generator_arn}"
            },
            "End": true,
            "Retry": [
              {
                "ErrorEquals": [
                  "States.ALL"
                ],
                "IntervalSeconds": 5,
                "Comment": "Retry on timeout"
              }
            ]
          },
          "DdexGenerator": {
            "Type": "Task",
            "Resource": "arn:aws:states:::lambda:invoke",
            "ResultPath": null,
            "OutputPath": null,
            "Parameters": {
              "Payload": {
                "context": {
                  "Execution": {
                    "Id.$": "$$.Execution.Input.BatchInput.context.Execution.Id",
                    "Name.$": "$$.Execution.Input.BatchInput.context.Execution.Name"
                  },
                  "State": {
                    "Name.$": "$$.Execution.Input.BatchInput.context.State.Name"
                  },
                  "StateMachine.$": "$$.Execution.Input.BatchInput.context.StateMachine"
                },
                "order.$": "$$.Execution.Input.BatchInput.order",
                "profile.$": "$$.Execution.Input.BatchInput.profile",
                "Items.$": "$$.Execution.Input.Items"
              },
              "FunctionName": "${ddex_generator_arn}"
            },
            "End": true,
            "Retry": [
              {
                "ErrorEquals": [
                  "States.ALL"
                ],
                "IntervalSeconds": 5,
                "Comment": "Retry on timeout"
              }
            ]
          }
        }
      },
      "ItemSelector": {
        "mapRunIndex.$": "$$.Map.Item.Index",
        "mapRunValue.$": "$$.Map.Item.Value"
      },
      "Catch": [
        {
          "ErrorEquals": [
            "States.ALL"
          ],
          "Next": "OrderFinalizer",
          "ResultPath": "$.error"
        }
      ]
    },
    "DdexFormatterDecider": {
      "Type": "Choice",
      "Choices": [
        {
          "Variable": "$$.Execution.Input.order.societyMetadata.format",
          "StringEquals": "DDEX_RDRN_V_1_4",
          "Next": "DdexCompilerInput"
        }
      ],
      "Default": "OutputFileBuilderInput"
    },
    "DdexCompilerInput": {
      "Type": "Pass",
      "Parameters": {
        "context": {
          "Execution": {
            "Id.$": "$$.Execution.Id",
            "Name.$": "$$.Execution.Name"
          },
          "State": {
            "Name.$": "$$.State.Name"
          },
          "StateMachine.$": "$$.StateMachine"
        },
        "order.$": "$$.Execution.Input.order",
        "profile.$": "$$.Execution.Input.profile"
      },
      "ResultPath": "$.taskParams",
      "Next": "DdexCompiler",
      "Comment": "takes the task input that the ddex compiler needs and puts them in one object, so that the ddex compiler task can turn them into a JSON string to be passed into the fargate task as an env var"
    },
    "DdexCompiler": {
      "Type": "Task",
      "Resource": "arn:aws:states:::ecs:runTask.waitForTaskToken",
      "TimeoutSeconds": 7200,
      "HeartbeatSeconds": 300,
      "Parameters": {
        "LaunchType": "FARGATE",
        "Cluster": "${ddex_compiler_cluster_arn}",
        "TaskDefinition": "${ddex_compiler_task_arn}",
        "NetworkConfiguration": {
          "AwsvpcConfiguration": {
            "Subnets": [
              "${subnet_id0}",
              "${subnet_id1}"
            ],
            "AssignPublicIp": "DISABLED"
          }
        },
        "Overrides": {
          "ContainerOverrides": [
            {
              "Name": "${fargate_ddex_compiler_builder_name}",
              "Environment": [
                {
                  "Name": "TASK_TOKEN",
                  "Value.$": "$$.Task.Token"
                },
                {
                  "Name": "TASK_PARAMS",
                  "Value.$": "States.JsonToString($.taskParams)"
                }
              ]
            }
          ]
        }
      },
      "Retry": [
        {
          "ErrorEquals": [
            "States.ALL"
          ],
          "IntervalSeconds": 5,
          "Comment": "Retry on timeout"
        }
      ],
      "Catch": [
        {
          "ErrorEquals": [
            "States.ALL"
          ],
          "Next": "OrderFinalizer",
          "ResultPath": "$.error"
        }
      ],
      "Next": "OrderRecorder"
    },
    "OutputFileBuilderInput": {
      "Type": "Pass",
      "Parameters": {
        "Payload": {
          "context": {
            "Execution": {
              "Id.$": "$$.Execution.Id",
              "Name.$": "$$.Execution.Name"
            },
            "State": {
              "Name.$": "$$.State.Name"
            },
            "StateMachine.$": "$$.StateMachine"
          },
          "order.$": "$$.Execution.Input.order",
          "profile.$": "$$.Execution.Input.profile"
        }
      },
      "ResultPath": "$.taskParams",
      "Next": "OutputFileBuilder",
      "Comment": "takes the task input that the outputfilebuilder needs and puts them in one object, so that the outputputfilebuilder task can turn them into a JSON string to be passed into the fargate task as an env var"
    },
    "OutputFileBuilder": {
      "Type": "Task",
      "Resource": "arn:aws:states:::ecs:runTask.waitForTaskToken",
      "TimeoutSeconds": 5400,
      "HeartbeatSeconds": 300,
      "Parameters": {
        "LaunchType": "FARGATE",
        "Cluster": "${output_file_builder_cluster_arn}",
        "TaskDefinition": "${output_file_builder_task_arn}",
        "NetworkConfiguration": {
          "AwsvpcConfiguration": {
            "Subnets": [
              "${subnet_id0}",
              "${subnet_id1}"
            ],
            "AssignPublicIp": "DISABLED"
          }
      },
        "Overrides": {
          "ContainerOverrides": [
            {
              "Name": "${fargate_output_file_builder_name}",
              "Environment": [
                {
                  "Name": "TASK_TOKEN",
                  "Value.$": "$$.Task.Token"
                },
                {
                  "Name": "TASK_PARAMS",
                  "Value.$": "States.JsonToString($.taskParams)"
                }
              ]
            }
          ]
        }
      },
      "Next": "OrderRecorder",
      "Retry": [
        {
          "ErrorEquals": [
            "States.ALL"
          ],
          "IntervalSeconds": 5,
          "Comment": "Retry on timeout"
        }
      ],
      "Catch": [
        {
          "ErrorEquals": [
            "States.ALL"
          ],
          "Next": "OrderFinalizer",
          "ResultPath": "$.error"
        }
      ]
    },
    "OrderRecorder": {
      "Type": "Task",
      "Resource": "arn:aws:states:::lambda:invoke",
      "Parameters": {
        "Payload": {
          "context": {
            "Execution": {
              "Id.$": "$$.Execution.Id",
              "Name.$": "$$.Execution.Name"
            },
            "State": {
              "Name.$": "$$.State.Name"
            },
            "StateMachine.$": "$$.StateMachine"
          },
          "order.$": "$$.Execution.Input.order",
          "profile.$": "$$.Execution.Input.profile"
        },
        "FunctionName": "${order_recorder_arn}"
      },
      "Retry": [
        {
          "ErrorEquals": [
            "States.ALL"
          ],
          "IntervalSeconds": 5,
          "Comment": "Retry on timeout"
        }
      ],
      "ResultPath": null,
      "Next": "OrderFinalizer"
    },
    "OrderFinalizer": {
      "Type": "Task",
      "Resource": "arn:aws:states:::lambda:invoke",
      "Parameters": {
        "Payload": {
          "context": {
            "Execution": {
              "Id.$": "$$.Execution.Id",
              "Name.$": "$$.Execution.Name"
            },
            "State": {
              "Name.$": "$$.State.Name"
            },
            "StateMachine.$": "$$.StateMachine"
          },
          "order.$": "$$.Execution.Input.order",
          "profile.$": "$$.Execution.Input.profile",
          "summary.$": "$"
        },
        "FunctionName": "${order_finalizer_arn}"
      },
      "OutputPath": "$.Payload",
      "End": true,
      "Retry": [
        {
          "ErrorEquals": [
            "DontRetryException"
          ],
          "MaxAttempts": 0,
          "Comment": "Don't retry on DontRetryException"
        },
        {
          "ErrorEquals": [
            "States.ALL"
          ],
          "IntervalSeconds": 5,
          "Comment": "Retry on timeout"
        }
      ]
    }
  }
}
