set -e

# Self-hosted boxes run several runner slots with separate workspaces; a
# shared RIVE_GOLD_DIR keeps one baseline per machine.
GOLD="${RIVE_GOLD_DIR:-.gold}"

TESTS="gms goldens"

TARGET="host"
if [[ "$OSTYPE" == "darwin"* ]]; then
    DEFAULT_BACKEND=metal
elif [[ "$OSTYPE" == "msys" ]]; then
    DEFAULT_BACKEND=d3d
else
    DEFAULT_BACKEND=gl
fi

NUMBER_OF_PROCESSORS="${NUMBER_OF_PROCESSORS:-$(nproc 2>/dev/null || sysctl -n hw.physicalcpu)}"
if [[ $NUMBER_OF_PROCESSORS > 20 ]]; then
    ARGS=-j6
else
    ARGS=-j4
fi

DIFF_ARGS=

while :; do
    case $1 in
        --gms)
            TESTS="gms"
            shift
        ;;
        -u)
            TARGET="unreal"
            if [[ "$OSTYPE" == "darwin"* ]]; then
                DEFAULT_BACKEND=metalatomic
            elif [[ "$OSTYPE" == "msys" ]]; then
                DEFAULT_BACKEND=d3d12
            else
                DEFAULT_BACKEND=vkatomic
            fi
            if [ -z "$RIVE_UNREAL_ENGINE" ]; then
                ARGS="$ARGS --no-rebuild --no-install"   # expect a prebuilt package
            else
                ARGS="$ARGS --no-rebuild"                # build & package on demand
            fi
            shift
        ;;
        -ua)
            TARGET="unreal_android"
            DEFAULT_BACKEND=vkatomic
            ARGS="$ARGS --no-rebuild"
            shift
        ;;
        -i)
            TARGET="ios"
            DEFAULT_BACKEND=metal
            UDID="$(idevice_id -l)" # brew install ideviceinstaller
            shift
        ;;
        -s)
            TARGET="iossim"
            DEFAULT_BACKEND=metal
            UDID="$(xcrun simctl list devices | grep '(Booted)' | sed 's/^[^(]*(\([A-Z0-9\-]*\)) (Booted).*$/\1/')"
            shift
        ;;
        -a|-a32)
            TARGET="android"
            DEFAULT_BACKEND=gl
            SERIAL="$(adb get-serialno | sed 's/[:.]/_/g')"
            if [[ "$1" == "-a32" ]]; then
                ARGS="--android-arch arm"
            fi
            shift
        ;;
        -w)
            TARGET="webbrowser"
            DEFAULT_BACKEND=gl
            shift
        ;;
        -ws)
            TARGET="webserver"
            DEFAULT_BACKEND=gl
            shift
        ;;
        -wa)
            TARGET="webbrowserandroid"
            DEFAULT_BACKEND=gl
            shift
        ;;
        -wsa)
            TARGET="webserverandroid"
            DEFAULT_BACKEND=gl
            shift
        ;;
        -R)
            REBASELINE=true
            shift
        ;;
        -r)
            ARGS="$ARGS --release"
            shift
        ;;
        --remote)
            ARGS="$ARGS --remote"
            shift
        ;;
        -v)
            ARGS="$ARGS --verbose"
            shift
        ;;
        -n)
            ARGS="$ARGS --no-rebuild --no-install"
            shift
        ;;
        -H)
            DIFF_ARGS="$DIFF_ARGS -H"
            shift
        ;;
        -t[0-9] | -t[0-9][0-9] )
            DIFF_ARGS="$DIFF_ARGS --threshold=${1: 2}"
            shift
        ;;
        *)
            break
        ;;
    esac
done

open_file() {
    # Headless CI has no browser; opening the diff report there hangs the runner.
    if [ -n "$CI" ]; then
        echo "CI: skipping report open ($1)"
        return 0
    fi
    if which start >/dev/null; then # windows
        start $1
    elif which open >/dev/null; then # mac
        open $1
    else
        gnome-open $1
    fi
}

# Updated to "--no-rebuild --no-install" after the first backend (so we only
# rebuild once).
NO_REBUILD=
FAILED=()

for BACKEND in "${@:-$DEFAULT_BACKEND}"
do
    ID=$BACKEND
    if ! [ -z "$RIVE_GPU" ]; then
        ID="$RIVE_GPU/$BACKEND"
    fi
    if [[ "$TARGET" == "ios" ]]; then
        ID="ios_$UDID/$BACKEND"
    elif [[ "$TARGET" == "iossim" ]]; then
        ID="iossim_$UDID/$BACKEND"
    elif [[ "$TARGET" == "android" ]]; then
        ID="android_$SERIAL/$BACKEND"
    elif [[ "$TARGET" != "host" ]]; then
        ID="$TARGET/$BACKEND"
    fi
    
    DEPLOYED=true
    if [ "$REBASELINE" == true ]; then
        echo
        echo "Rebaselining $ID..."
        rm -fr $GOLD/$ID
        python3 deploy_tests.py $TESTS $ARGS --target=$TARGET --outdir=$GOLD/$ID --backend=$BACKEND $NO_REBUILD \
            || DEPLOYED=false
    else
        echo
        echo "Deploying $ID..."
        rm -fr $GOLD/candidates/$ID
        python3 deploy_tests.py $TESTS $ARGS --target=$TARGET --outdir=$GOLD/candidates/$ID --backend=$BACKEND $NO_REBUILD \
            || DEPLOYED=false

        if [ "$DEPLOYED" == true ]; then
            echo
            echo "Diffing $ID..."
            rm -fr $GOLD/diffs/$ID && mkdir -p $GOLD/diffs/$ID
            if ! python3 diff.py $DIFF_ARGS -g $GOLD/$ID -c $GOLD/candidates/$ID -j$NUMBER_OF_PROCESSORS -o $GOLD/diffs/$ID; then
                open_file $GOLD/diffs/$ID/index.html
                FAILED+=("$ID (diff)")
            fi
        fi
    fi

    NO_REBUILD="--no-rebuild --no-install"

    if [ "$DEPLOYED" != true ]; then
        echo
        echo "FAILED to deploy $ID."
        FAILED+=("$ID (deploy)")
    fi
done

if [ ${#FAILED[@]} -gt 0 ]; then
    echo
    echo "${#FAILED[@]} backend(s) failed:"
    for ID in "${FAILED[@]}"; do
        echo "    $ID"
    done
    exit 1
fi
