#!/bin/sh

TEST_EXISTS=0
if [ "$1" = "--exists" ]; then
    TEST_EXISTS=1
    shift
fi
if [ "$1" = "--instance" ]; then
    INSTANCE_NAME="$2"
    shift
    shift
fi
EXE="$1"
shift

BASE_INSTALL_PATH="$(appsupport-config --base)"
ABS_EXE_PATH=
INSTANCE_ARGUMENTS=

setup_instance_argument() {
    _PREFIX="$1"
    if [ -n "$INSTANCE_NAME" ]; then
        INSTANCE_ARGUMENTS="$_PREFIX $INSTANCE_NAME"
    fi
}

update_ld_library_path() {
    NEW_LD_LIBRARY_PATH="$LD_LIBRARY_PATH"
    for LIB_PATH in \
        "$BASE_INSTALL_PATH/usr/lib64" \
        "$BASE_INSTALL_PATH/usr/lib" \
        "$BASE_INSTALL_PATH/usr/local/Qt-5.6.3/lib64" \
        "$BASE_INSTALL_PATH/usr/local/Qt-5.6.3/lib" \
        "/usr/local/Qt-5.6.3/lib64" \
        "/usr/local/Qt-5.6.3/lib" \
    ; do
        if [ -d "$LIB_PATH" ]; then
            NEW_LD_LIBRARY_PATH="$LIB_PATH:$NEW_LD_LIBRARY_PATH"
        fi
    done
    if [ -n "$NEW_LD_LIBRARY_PATH" ]; then
        export LD_LIBRARY_PATH="$NEW_LD_LIBRARY_PATH"
    fi
}

export_plugin_dir() {
    VAR_NAME=$1
    APP_NAME=$2

    if [ -d "$BASE_INSTALL_PATH/usr/lib64/$APP_NAME" ]; then
        export $VAR_NAME="$BASE_INSTALL_PATH/usr/lib64/$APP_NAME"
    elif [ -d "$BASE_INSTALL_PATH/usr/lib/$APP_NAME" ]; then
        export $VAR_NAME="$BASE_INSTALL_PATH/usr/lib/$APP_NAME"
    fi
}

setup_dbus_session_bus() {
    _CONFIG_INSTANCE=
    if [ -n "$INSTANCE_NAME" ]; then
        _CONFIG_INSTANCE="-i $INSTANCE_NAME"
    fi
    CUSTOM_SESSION_BUS="$(appsupport-config $_CONFIG_INSTANCE -v DBusSessionBusAddress)"
    if [ -n "$CUSTOM_SESSION_BUS" ]; then
        export DBUS_SESSION_BUS_ADDRESS="$CUSTOM_SESSION_BUS"
    fi
}

if [ "$EXE" != "apkd-launcher" ] && which $EXE 1>/dev/null 2>/dev/null; then
    ABS_EXE_PATH="$(which $EXE)"
    case $EXE in
        appsupportaudio)
            setup_instance_argument "-i"
            ;;
        apkd)
            update_ld_library_path
            ;;
        apkd-*)
            update_ld_library_path
            setup_dbus_session_bus
            setup_instance_argument
            ;;
        appsupportkeyboardservice)
            setup_instance_argument "-i"
            ;;
        *)
            update_ld_library_path
            ;;
    esac
else
    case $EXE in
        appsupportaudio)
            update_ld_library_path
            export_plugin_dir AAUDIO_PLUGIN_DIR appsupportaudio
            setup_instance_argument "-i"
            ;;
        apkd)
            update_ld_library_path
            export_plugin_dir APKD_PLUGIN_DIR apkd
            ;;
        apkd-bridge)
            update_ld_library_path
            export_plugin_dir APKD_BRIDGE_PLUGIN_DIR apkd-bridge
            setup_dbus_session_bus
            setup_instance_argument
            ;;
        apkd-bridge-hw)
            update_ld_library_path
            export_plugin_dir APKD_BRIDGE_HW_PLUGIN_DIR apkd-bridge-hw
            setup_dbus_session_bus
            setup_instance_argument
            ;;
        apkd-launcher)
            update_ld_library_path
            setup_dbus_session_bus
            setup_instance_argument "-i"
            ;;
        generate-config|appsupport-generate-config)
            EXE="appsupport-generate-config"
            ;;
        parse-config|appsupport-parse-config)
            EXE="appsupport-parse-config"
            ;;
        appsupport-logger)
            EXE="appsupport_logger"
            if [ -z "$INSTANCE_NAME" ]; then
                echo "Instance name required."
                exit 1
            fi
            LOGGER_PATH="$(appsupport-config -i $INSTANCE_NAME -v LogcatLogPath)"
            if [ -z "$LOGGER_PATH" ]; then
                echo "LogcatLogPath not defined."
                exit 1
            fi
            mkdir -p "$LOGGER_PATH"
            if [ $? -ne 0 ]; then
                echo "Failed to mkdir $LOGGER_PATH"
                exit 1
            fi
            LOGGER_BLOCK_SIZE="$(appsupport-config -i $INSTANCE_NAME -v LogcatLogBlockSize)"
            LOGGER_LIMIT_SIZE="$(appsupport-config -i $INSTANCE_NAME -v LogcatLogLimitSize)"
            INSTANCE_ARGUMENTS="-i $INSTANCE_NAME -o $LOGGER_PATH -b $LOGGER_BLOCK_SIZE -l $LOGGER_LIMIT_SIZE"
            LOGGER_LOGCAT_ARGS="$(appsupport-config -i $INSTANCE_NAME -v LogcatLogArgs)"
            if [ -n "$LOGGER_LOGCAT_ARGS" ]; then
                INSTANCE_ARGUMENTS="$INSTANCE_ARGUMENTS -- $LOGGER_LOGCAT_ARGS"
            fi
            ;;
        appsupport-anr)
            EXE="appsupport_anr"
            DATA_PATH="$(appsupport-config -i $INSTANCE_NAME -v DataRoot)"
            ANR_PATH="$(appsupport-config -i $INSTANCE_NAME -v AnrPath)"
            if [ -z "$DATA_PATH" ]; then
                echo "DataRoot not defined."
                exit 32
            fi
            if [ -z "$ANR_PATH" ]; then
                echo "AnrPath not defined."
                exit 32
            fi
            if [ ! -d "$ANR_PATH" ]; then
                mkdir -p "$ANR_PATH"
                if [ $? -ne 0 ]; then
                    echo "Failed to mkdir $ANR_PATH"
                    exit 32
                fi
            fi
            if [ ! -d "$DATA_PATH/data/anr" ]; then
                # We need to dig the BaseUid value a bit differently here
                # as when this script is run appsupport-prepare is not
                # yet in active state, and thus appsupport-config will try
                # to parse the value from all the configs, but since the
                # value is given as an argument to configs generator
                # appsupport-config cannot figure it out as is. But since at
                # this point in startup the configuration is actually generated
                # we can just look the value from configs ourselves.
                LXC_PATH="$(appsupport-config --lxc-path)"
                BASE_UID="$(grep '^BaseUid=' "$LXC_PATH/$INSTANCE_NAME/config.d/"* | cut -d'=' -f2)"
                if [ -z "$BASE_UID" ]; then
                    echo "Failed to determine base uid"
                    exit 32
                fi
                mkdir -p "$DATA_PATH/data/anr"
                if [ $? -ne 0 ]; then
                    echo "Failed to mkdir $DATA_PATH/data/anr"
                    exit 32
                fi
                BASE_UID=$(($BASE_UID + 1000))
                chown $BASE_UID:$BASE_UID "$DATA_PATH/data"
                chown $BASE_UID:$BASE_UID "$DATA_PATH/data/anr"
                chmod 771 "$DATA_PATH/data"
                chmod 775 "$DATA_PATH/data/anr"
            fi
            INSTANCE_ARGUMENTS="-d $DATA_PATH/data/anr -o $ANR_PATH"
            if [ "$(appsupport-config -i $INSTANCE_NAME -v AnrKeepOriginals)" = "true" ]; then
                INSTANCE_ARGUMENTS="$INSTANCE_ARGUMENTS -k"
            fi
            ;;
        appsupport_user_session)
            ;;
        appsupportkeyboardservice)
            update_ld_library_path
            setup_dbus_session_bus
            setup_instance_argument "-i"
            ;;
        *)
            update_ld_library_path
            ;;
    esac
fi

if [ -z "$ABS_EXE_PATH" ]; then
    for LOOKUP_EXE_PATH in \
                        "$BASE_INSTALL_PATH/usr/libexec/appsupport/$EXE" \
                        "$BASE_INSTALL_PATH/libexec/$EXE" \
                        "$BASE_INSTALL_PATH/usr/bin/$EXE" \
                        "/usr/libexec/appsupport/$EXE"; do
        if [ -x "$LOOKUP_EXE_PATH" ]; then
            ABS_EXE_PATH="$LOOKUP_EXE_PATH"
            break
        fi
    done

    if [ -z "$ABS_EXE_PATH" ]; then
        echo "appsupport-run: Could not find usable $EXE!"
        exit 1
    fi
fi

if [ $TEST_EXISTS -eq 1 ]; then
    [ -x "$ABS_EXE_PATH" ]
    exit $?
else
    exec "$ABS_EXE_PATH" $INSTANCE_ARGUMENTS "$@"
fi
