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

function usage() {
    SCRIPT_NAME="$(basename "${BASH_SOURCE[0]}")"
    echo "$SCRIPT_NAME: list AWS GameLift fleets owned by user"
    echo "Usage:  $SCRIPT_NAME [OPTIONS]"
    echo ""
    echo "Options:"
    echo "  -u | --user USERNAME    show fleets owned by USERNAME (default: '$(whoami)')"
    echo "  -t | --text             show fleet 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 u:th --long user:text,help -n "$SCRIPT_NAME" -- "$@")"

    OUTPUT_TEXT=false
    FLEET_USER="$(whoami)"
    while true; do
        case "$1" in
            -u | --user ) FLEET_USER="$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
}

parse_arguments "$@"

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

    # describe-fleet-attributes does not support AWSCLI "--filter" option so we use 'jq' instead
    # to filter for "my" fleets
    RESULTS="$(jq ".FleetAttributes[] | select(.Name | startswith(\"$FLEET_USER\"))" <<< "$RESULTS")"

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