{
  "Comment": "Close phase: closes SYS tickets whose offboarding/suspend automation completed on an earlier run",
  "StartAt": "CheckForDirectTickets",
  "States": {
    "CheckForDirectTickets": {
      "Comment": "If input contains a 'tickets' array, skip the Jira query and process them directly.",
      "Type": "Choice",
      "Choices": [
        {
          "Variable": "$.tickets[0]",
          "IsPresent": true,
          "Next": "PrepareDirectTickets"
        }
      ],
      "Default": "JiraQueryCompletedTickets"
    },
    "PrepareDirectTickets": {
      "Type": "Pass",
      "Parameters": {
        "tickets.$": "$.tickets"
      },
      "Next": "ForEachCompletedTicket"
    },
    "JiraQueryCompletedTickets": {
      "Type": "Task",
      "Resource": "arn:aws:states:::lambda:invoke",
      "Parameters": {
        "FunctionName": "${lambda_jira_cli}",
        "Payload": {
          "action": "query-completed-tickets"
        }
      },
      "ResultSelector": {
        "tickets.$": "$.Payload.tickets"
      },
      "Retry": [
        {
          "ErrorEquals": ["Lambda.ServiceException", "Lambda.AWSLambdaException", "Lambda.SdkClientException", "Lambda.TooManyRequestsException"],
          "IntervalSeconds": 5,
          "MaxAttempts": 3,
          "BackoffRate": 2
        }
      ],
      "Next": "ForEachCompletedTicket"
    },
    "ForEachCompletedTicket": {
      "Type": "Map",
      "MaxConcurrency": 1,
      "ItemsPath": "$.tickets",
      "ItemSelector": {
        "ticket_id.$": "$$.Map.Item.Value.id"
      },
      "Iterator": {
        "StartAt": "JiraCloseTicket",
        "States": {
          "JiraCloseTicket": {
            "Type": "Task",
            "Resource": "arn:aws:states:::lambda:invoke",
            "Parameters": {
              "FunctionName": "${lambda_jira_cli}",
              "Payload": {
                "action": "close-ticket",
                "ticket_id.$": "$.ticket_id"
              }
            },
            "ResultPath": null,
            "Retry": [
              {
                "ErrorEquals": ["Lambda.ServiceException", "Lambda.AWSLambdaException", "Lambda.SdkClientException", "Lambda.TooManyRequestsException"],
                "IntervalSeconds": 5,
                "MaxAttempts": 3,
                "BackoffRate": 2
              }
            ],
            "Catch": [
              {
                "ErrorEquals": ["States.ALL"],
                "ResultPath": "$.error",
                "Next": "HandleCloseError"
              }
            ],
            "Next": "CloseComplete"
          },
          "CloseComplete": {
            "Type": "Succeed"
          },
          "HandleCloseError": {
            "Type": "Task",
            "Resource": "arn:aws:states:::lambda:invoke",
            "Parameters": {
              "FunctionName": "${lambda_jira_cli}",
              "Payload": {
                "action": "add-comment",
                "ticket_id.$": "$.ticket_id",
                "comment.$": "States.Format('Automatic ticket close failed: {}. Manual close required.', States.JsonToString($.error))"
              }
            },
            "ResultPath": null,
            "Retry": [
              {
                "ErrorEquals": ["Lambda.ServiceException", "Lambda.AWSLambdaException", "Lambda.SdkClientException", "Lambda.TooManyRequestsException"],
                "IntervalSeconds": 5,
                "MaxAttempts": 3,
                "BackoffRate": 2
              }
            ],
            "Next": "CloseFailed"
          },
          "CloseFailed": {
            "Type": "Fail",
            "Error": "CloseError",
            "Cause": "An error occurred while closing this ticket. See Jira comment for details."
          }
        }
      },
      "ResultPath": null,
      "End": true
    }
  }
}
