#!/bin/bash -e

GAMEUSER="gameuser"
LOGFILE="/var/log/gameserver/install.log"
GAME_REPO_DIR="/root/gameservers"

clean_exit() {
    exit_code=$1
    shift
    sed -i "\|^$GAMEUSER| s|^|#|" /etc/sudoers
    if [[ $exit_code -ne 0 ]]; then
        rm -f /etc/gameserver/gameserver
        echo
        if [[ $# -gt 0 ]]; then
            echo "FATAL: $@"
        else
            echo "FATAL: Install was interrupted and/or failed."
        fi
    else
        echo "Installation complete."
    fi
    exit $exit_code
}

select_game_interactive() {
    python3 "/usr/local/bin/gameserver-menu.py" "$GAME_REPO_DIR"
}

select_game_auto() {
    cp "$GAME_REPO_DIR/games/$GAME/game_properties.sh" "/etc/gameserver/gameserver"
}

select_game() {
    if [ ! -d "/etc/gameserver" ] || [ ! -f "/etc/gameserver/gameserver" ]; then
        mkdir -p "/etc/gameserver"

        if [ -n "$GAME" ]; then
            select_game_auto || clean_exit 1 "Game $GAME install failed, please check spelling."
        else
            # Exit if not running interactively, game will be selected on first login
            [[ -n $(stty size) ]] || clean_exit 0 "Detected non-interactive run (& GAME not set); skipping install."
            select_game_interactive || clean_exit 1 "No game selected."
        fi
    fi
}

install_game() {
    if [ ! -f "/etc/gameserver/installation.done" ]; then
        conf=/etc/gameserver/gameserver
        [[ -f "$conf" ]] || clean_exit 1 "Conf file ($conf) not found."
        . $conf
        exit_code=0
        cd "$GAME_REPO_DIR"
        chmod +x "auto_install.sh"
        # ensure non-zero exit on failure - explicit 'e' can be removed
        # if/when https://github.com/jesinmat/linux-gameservers/pull/11 is
        # merged
        bash -e ./auto_install.sh -g "$GAME" -u "$GAMEUSER" -p "/home/$GAMEUSER/gameserver" \
            || exit_code=$?
        if [[ $exit_code -eq 0 ]]; then
            touch "/etc/gameserver/installation.done"
        else
            clean_exit 1 "Install failed. Please check previous logs for details."
        fi
        # Enable server start on boot
        systemctl enable gameserver
    fi
    systemctl start gameserver
}

install_exit_code=0
trap 'clean_exit $?' INT TERM ERR
sed -i "\|$GAMEUSER| s|^\s*#||" /etc/sudoers
select_game
install_game 2>&1 | tee -a "$LOGFILE" || install_exit_code=$?
clean_exit $install_exit_code
