{
    "Comment": "KNR User Creation State machine",
    "StartAt": "CheckIfSendEmailIsPassed",
    "States": {
          "CheckIfSendEmailIsPassed": {
              "Type": "Choice",
              "Choices": [
                {
                  "And": [
                    {
                      "Variable": "$.send_email",
                      "IsPresent": true
                    },
                    {
                      "Variable": "$.send_email",
                      "IsNull": false
                    }
                  ],
                  "Next": "MapInputFromKafka"
                }
              ],
              "Default": "UseDefaultValueOfSendEmailFlag"
        },
        "UseDefaultValueOfSendEmailFlag": {
          "Type": "Pass",
          "Result": false,
          "ResultPath": "$.send_email",
          "Next": "MapInputFromKafka"
        },
        "MapInputFromKafka": {
            "Type": "Pass",
            "Parameters": {
                "email.$": "$.email",
                "owner.$": "$.owner",
                "first_name.$": "$.first_name",
                "last_name.$": "$.last_name",
                "vendor_name.$": "$.vendor_name",
                "vendor_id.$": "$.vendor_id",
                "correlation_id.$": "$.correlation_id",
                "service_tier_uuid.$": "$.service_tier_uuid",
                "send_email.$": "$.send_email",
                "brand": "knr",
                "localization": "en",
                "source": "event.knrAccountCreation",
                "is_admin.$": "$.is_admin",
                "master_contact.$": "$.master_contact",
                "currency.$": "$.currency"
            },
            "Next": "CheckRequiredFields"
        },
        "CheckRequiredFields": {
            "Type": "Choice",
            "Choices": [
                {
                    "And": [
                        {
                            "Variable": "$.brand",
                            "IsPresent": true
                        },
                        {
                            "Variable": "$.brand",
                            "IsString": true
                        },
                        {
                            "Variable": "$.owner",
                            "IsPresent": true
                        },
                        {
                            "Variable": "$.owner",
                            "IsString": true
                        },
                        {
                            "Variable": "$.email",
                            "IsPresent": true
                        },
                        {
                            "Variable": "$.email",
                            "IsString": true
                        },
                        {
                            "Variable": "$.first_name",
                            "IsPresent": true
                        },
                        {
                            "Variable": "$.first_name",
                            "IsString": true
                        },
                        {
                            "Variable": "$.last_name",
                            "IsPresent": true
                        },
                        {
                            "Variable": "$.last_name",
                            "IsString": true
                        },
                        {
                            "Variable": "$.correlation_id",
                            "IsPresent": true
                        },
                        {
                            "Variable": "$.correlation_id",
                            "IsString": true
                        },
                        {
                            "Variable": "$.source",
                            "IsPresent": true
                        },
                        {
                            "Variable": "$.source",
                            "IsString": true
                        }
                    ],
                    "Next": "CreateVendor"
                }
            ],
            "Default": "SendFailureToKafka"
        },
        "SendFailureToKafka": {
            "Type": "Task",
            "Resource": "${lambda_send_failure}",
            "HeartbeatSeconds": 60,
            "TimeoutSeconds": 3600,
            "ResultPath": "$.send_failure_result",
            "Retry": [
                {
                    "ErrorEquals": [
                        "RetryException",
                        "States.Timeout",
                        "Lambda.ServiceException",
                        "Lambda.AWSLambdaException",
                        "Lambda.SdkClientException",
                        "Lambda.TooManyRequestsException"
                    ],
                    "IntervalSeconds": 5,
                    "MaxAttempts": 2,
                    "BackoffRate": 3
                }
            ],
            "Catch": [
                {
                    "ErrorEquals": [
                        "States.ALL"
                    ],
                    "Next": "FailState",
                    "ResultPath": "$.send_failure_errors"
                }
            ],
            "Next": "FailState"
        },
        "FailState": {
            "Type": "Fail"
        },
        "CreateVendor": {
            "Type": "Task",
            "Resource": "${lambda_create_vendor}",
            "HeartbeatSeconds": 60,
            "TimeoutSeconds": 3600,
            "ResultPath": "$.create_vendor_result",
            "Retry": [
                {
                    "ErrorEquals": [
                        "RetryException",
                        "States.Timeout",
                        "Lambda.ServiceException",
                        "Lambda.AWSLambdaException",
                        "Lambda.SdkClientException",
                        "Lambda.TooManyRequestsException"
                    ],
                    "IntervalSeconds": 5,
                    "MaxAttempts": 2,
                    "BackoffRate": 3
                }
            ],
            "Catch": [
                {
                    "ErrorEquals": [
                        "States.ALL"
                    ],
                    "Next": "SendFailureToKafka",
                    "ResultPath": "$.create_vendor_errors"
                }
            ],
            "Next": "SyncAbacusAccount"
        },
        "SyncAbacusAccount": {
            "Type": "Task",
            "Resource": "${lambda_abacus_sync_account}",
            "Parameters": {
                "vendor_id.$": "$.create_vendor_result.vendor_id",
                "vendor_name.$": "$.vendor_name",
                "currency.$": "$.currency",
                "correlation_id.$": "$.correlation_id",
                "source.$": "$.source"
            },
            "HeartbeatSeconds": 60,
            "TimeoutSeconds": 3600,
            "ResultPath": "$.sync_abacus_account_result",
            "Retry": [
                {
                    "ErrorEquals": [
                        "RetryException",
                        "States.Timeout",
                        "Lambda.ServiceException",
                        "Lambda.AWSLambdaException",
                        "Lambda.SdkClientException",
                        "Lambda.TooManyRequestsException"
                    ],
                    "IntervalSeconds": 5,
                    "MaxAttempts": 2,
                    "BackoffRate": 3
                }
            ],
            "Catch": [
                {
                    "ErrorEquals": [
                        "States.ALL"
                    ],
                    "Next": "CreateUser",
                    "ResultPath": "$.sync_abacus_account_errors"
                }
            ],
            "Next": "CreateUser"
        },
        "CreateUser": {
            "Type": "Task",
            "Resource": "${lambda_create_master_contact}",
            "HeartbeatSeconds": 60,
            "TimeoutSeconds": 3600,
            "ResultPath": "$.create_master_contact_result",
            "Parameters": {
                "first_name.$": "$.first_name",
                "last_name.$": "$.last_name",
                "email.$": "$.email",
                "brand.$": "$.brand",
                "vendor_id.$": "$.create_vendor_result.vendor_id",
                "localization.$": "$.localization",
                "correlation_id.$": "$.correlation_id",
                "source.$": "$.source"
            },
            "Retry": [
                {
                    "ErrorEquals": [
                        "RetryException",
                        "States.Timeout",
                        "Lambda.ServiceException",
                        "Lambda.AWSLambdaException",
                        "Lambda.SdkClientException",
                        "Lambda.TooManyRequestsException"
                    ],
                    "IntervalSeconds": 5,
                    "MaxAttempts": 2,
                    "BackoffRate": 3
                }
            ],
            "Catch": [
                {
                    "ErrorEquals": [
                        "States.ALL"
                    ],
                    "Next": "SendFailureToKafka",
                    "ResultPath": "$.create_user_errors"
                }
            ],
            "Next": "ArrayToProperties"
        },
        "ArrayToProperties": {
            "Type": "Pass",
            "Parameters": {
                "email.$": "$.email",
                "owner.$": "$.owner",
                "brand.$": "$.brand",
                "identity_id.$": "$.create_master_contact_result.identity_id",
                "vendor_id.$": "$.create_vendor_result.vendor_id",
                "vendor_uuid.$": "$.create_master_contact_result.vendor_uuid",
                "correlation_id.$": "$.correlation_id",
                "source.$": "$.source",
                "service_tier_uuid.$": "$.service_tier_uuid",
                "send_email.$": "$.send_email"
            },
            "Next": "CheckSendEmail"
        },
        "CheckSendEmail": {
            "Type": "Choice",
            "Choices": [
                {
                    "And": [
                        {
                            "Variable": "$.send_email",
                            "IsPresent": true
                        },
                        {
                            "Variable": "$.send_email",
                            "BooleanEquals": true
                        }
                    ],
                    "Next": "SendWelcomeEmail"
                }
            ],
            "Default": "SendSuccessToKafka"
        },
        "SendWelcomeEmail": {
            "Type": "Task",
            "Resource": "${lambda_send_org_invite_email}",
            "HeartbeatSeconds": 60,
            "TimeoutSeconds": 3600,
            "ResultPath": "$.send_org_invite_email_result",
            "Retry": [
                {
                    "ErrorEquals": [
                        "RetryException",
                        "States.Timeout",
                        "Lambda.ServiceException",
                        "Lambda.AWSLambdaException",
                        "Lambda.SdkClientException",
                        "Lambda.TooManyRequestsException"
                    ],
                    "IntervalSeconds": 5,
                    "MaxAttempts": 2,
                    "BackoffRate": 3
                }
            ],
            "Catch": [
                {
                    "ErrorEquals": [
                        "States.ALL"
                    ],
                    "Next": "SendFailureToKafka",
                    "ResultPath": "$.send_org_invite_email_errors"
                }
            ],
            "Next": "SendSuccessToKafka"
        },
        "SendSuccessToKafka": {
            "Type": "Task",
            "Resource": "${lambda_send_success}",
            "HeartbeatSeconds": 60,
            "TimeoutSeconds": 3600,
            "ResultPath": "$.send_success_result",
            "Retry": [
                {
                    "ErrorEquals": [
                        "RetryException",
                        "States.Timeout",
                        "Lambda.ServiceException",
                        "Lambda.AWSLambdaException",
                        "Lambda.SdkClientException",
                        "Lambda.TooManyRequestsException"
                    ],
                    "IntervalSeconds": 5,
                    "MaxAttempts": 2,
                    "BackoffRate": 3
                }
            ],
            "Catch": [
                {
                    "ErrorEquals": [
                        "States.ALL"
                    ],
                    "Next": "FailState",
                    "ResultPath": "$.send_success_errors"
                }
            ],
            "End": true
        }
    }
}
