#!/bin/bash
set -euo pipefail

# GameLift configuration; see https://docs.aws.amazon.com/cli/latest/reference/gamelift/create-fleet.html
{
    AWS_REGION="${AWS_REGION:-us-west-2}"   # may be overridden by environment variable
    CAPACITY=1
}

function usage() {
    SCRIPT_NAME="$(basename "${BASH_SOURCE[0]}")"
    echo "$SCRIPT_NAME: wait until AWS GameLift achieves desired fleet capacity"
    echo "Usage:  $SCRIPT_NAME [OPTIONS]"
    echo ""
    echo "Options:"
    echo "  -f | --fleet-id FLEET_ID    set fleet-id (default: \$FLEET_ID=${FLEET_ID:-none})"
    echo "  -c | --capacity CAPACITY    wait for fleet capacity to match (default: $CAPACITY)"
    echo "  -r | --region REGION        set AWS region (default: \$AWS_REGION=${AWS_REGION:-none})"
    echo "  -h | --help                 show this help message"
}

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

    while true; do
        case "$1" in
            -f | --fleet-id     ) FLEET_ID="$2"   ; shift ; shift ;;
            -c | --capacity     ) CAPACITY="$2"   ; shift ; shift ;;
            -r | --region       ) AWS_REGION="$2" ; shift ; 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"
        exit 1
    fi

    if [[ -z "${CAPACITY:-}" ]]; then
        echo >&2 "ERROR: capacity not specified"
        exit 1
    fi

    if [[ -z "${AWS_REGION:-}" ]]; then
        echo >&2 "ERROR: AWS region not specified"
        exit 1
    fi
}

parse_arguments "$@"

# Wait until fleet capacity matches target
{
    OLD_ACTIVE_HOSTS=-2
    while true; do
        ACTIVE_HOSTS="$(
            aws gamelift describe-fleet-capacity                    \
                --fleet-id "$FLEET_ID"                              \
                --region "$AWS_REGION"                              \
                --query "FleetCapacity[0].InstanceCounts.ACTIVE"    \
                --output text                                       \
            #                                                       #
        )"

        if [[ "$ACTIVE_HOSTS" -eq "$CAPACITY" ]]; then
            break
        elif [[ "$OLD_ACTIVE_HOSTS" -ne "$ACTIVE_HOSTS" ]]; then
            OLD_ACTIVE_HOSTS="$ACTIVE_HOSTS"
            echo -e "\\nCurrently have $ACTIVE_HOSTS active hosts"
        else
            echo -n "."
        fi

        # It takes a while...
        sleep 30
    done
    echo "Success: $ACTIVE_HOSTS host(s) found"
}
