#!/usr/bin/env bash
set -euo pipefail

function usage() {
    SCRIPT_NAME="$(basename "${BASH_SOURCE[0]}")"
    echo "$SCRIPT_NAME: list AWS GameLift EC2 instances associated with fleet"
    echo "Usage:  $SCRIPT_NAME [OPTIONS]"
    echo ""
    echo "Options:"
    echo "  -f | --fleet-id FLEET_ID    set fleet-id (default: \$FLEET_ID=${FLEET_ID:-none})"
    echo "  -t | --text                 show instance ids in text format instead of all attributes in json format"
    echo "  -h | --help                 show this help message"
}

function parse_arguments () {
    SCRIPT_NAME="$(basename "${BASH_SOURCE[0]}")"
    eval set -- "$(getopt -o f:th --long fleet-id:,text,help -n "$SCRIPT_NAME" -- "$@")"

    OUTPUT_TEXT=false
    while true; do
        case "$1" in
            -f | --fleet-id ) FLEET_ID="$2" ; shift ; shift ;;
            -t | --text     ) OUTPUT_TEXT=true ; shift ;;
            -h | --help     ) usage ; exit 0 ; shift ;;
            --              ) shift ; break ;;
            *               ) break ;;
        esac
    done

    if [[ $# -gt 0 ]]; then
        echo >&2 "ERROR: unknown arguments specified: " "$@"
        exit 1
    fi

    if [[ -z "${FLEET_ID:-}" ]]; then
        echo >&2 "ERROR: fleet-id not specified on command line or FLEET_ID environment variable; try --help"
        exit 1
    fi
}

parse_arguments "$@"

while [[ "${NEXT[1]:-}" != "null" ]]; do
    # Get the next batch of instsances and prepare to loop again
    # jq returns "null" for ".NextToken" if it is not found
    RESULTS="$(aws gamelift describe-instances --fleet-id "$FLEET_ID" "${NEXT[@]:-}")"
    NEXT=("--next-token" "$(jq -r ".NextToken" <<< "$RESULTS")")
    RESULTS="$(jq ".Instances[]" <<< "$RESULTS")"

    if [[ "$OUTPUT_TEXT" == "true" ]]; then
        jq -r ".InstanceId" <<< "$RESULTS"
    else
        echo "$RESULTS"
    fi
done
