#!/usr/bin/env bash

# On Linux systems, this script needs to be run with root rights.
if [ `uname` != "Darwin" ] && [ $UID -ne 0 ]; then
    sudo $0
    exit 0
fi

declare -ga PACKAGES

function printNotSupportedMessageAndExit() {
    echo
    echo "Currently this script only works for distributions supporting apt-get, dnf, pacman and brew."
    echo "Please add support for your distribution: http://webkit.org/b/110693"
    echo
    exit 1
}

function guessPackageManager() {
    local ret

    if apt-get --version &>/dev/null; then
        # apt-get - Debian based distributions
        ret="apt"
    elif [[ $(uname) == "Darwin" ]]; then
        if brew &>/dev/null; then
            echo "Please install HomeBrew. Instructions on http://brew.sh"
            exit 1
        fi
        ret="brew"
    elif dnf --version &>/dev/null; then
        # dnf - Fedora
        ret="dnf"
    elif pacman -Ss &>/dev/null; then
        # pacman - Arch Linux
        # pacman --version and pacman --help both return non-0
        ret="pacman"
    else
        printNotSupportedMessageAndExit
    fi

    echo $ret
}

function installDependencies {
    local packageManager

    packageManager=$(guessPackageManager)
    source "$(dirname "$0")/dependencies/$packageManager"
    installDependenciesWith${packageManager^}
}

function installDependenciesWithApt {
    apt-get install -y --no-install-recommends ${PACKAGES[@]}

    # Ubuntu Bionic doesn't ship pipenv. So fallback to the pip3 install path.
    if apt-cache show pipenv &>/dev/null; then
        apt-get install -y --no-install-recommends pipenv
    else
        apt-get install -y --no-install-recommends python3-pip
        pip3 install pipenv
    fi
}

function installDependenciesWithBrew {
    brew install ${PACKAGES[@]}
}

function installDependenciesWithDnf {
    dnf install ${PACKAGES[@]}
}

function installDependenciesWithPacman {
    pacman -S --needed ${PACKAGES[@]}

    cat <<-EOF

The following packages are available from AUR, and needed for running tests:

    ruby-json ruby-highline

Instructions on how to use the AUR can be found on the Arch Wiki:

    https://wiki.archlinux.org/index.php/Arch_User_Repository

You will also need to follow the instructions on the wiki to make 'python'
call python2 in the WebKit folder:

    https://wiki.archlinux.org/index.php/Python#Dealing_with_version_problem_in_build_scripts

Alternatively, you may use a Python 2.x virtualenv while hacking on WebKitGTK:

    https://wiki.archlinux.org/index.php/Python/Virtual_environment

EOF
}

installDependencies
