#!/bin/bash

set -e

if [ x"${1}" = x"" ]; then
    echo "usage: $0 <target>"
    exit 1
fi

function get_linux_deb_arch() {
    case "${1}" in
        "linux-arm64"|"linux-aarch64") echo "arm64" ;;
        "linux-armhf") echo "armhf" ;;
        "linux-i386"|"linux-i686") echo "i386" ;;
        "linux-riscv64") echo "riscv64" ;;
        "linux-x86_64") echo "amd64" ;;
    esac
}

function install_compiler() {
    local arch="${1}"
    local release="${2}"

    apt-get install -yqq g++

    if [ -n "${GITHUB_ENV}" ] && [ "${release}" = "bionic" ]; then
        apt-get install -yqq g++-11
        update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-11 60 --slave /usr/bin/g++ g++ /usr/bin/g++-11
    fi

    case "${arch}" in
        "linux-aarch64")
            if [ "$(uname -m)" != "aarch64" ]; then
                apt-get install -yqq g++-aarch64-linux-gnu
            elif [ -n "${GITHUB_ENV}" ] && [ "${release}" = "bionic" ]; then
                update-alternatives --install /usr/bin/aarch64-linux-gnu-gcc aarch64-linux-gnu-gcc /usr/bin/gcc-11 60 --slave /usr/bin/aarch64-linux-gnu-g++ aarch64-linux-gnu-g++ /usr/bin/g++-11
            fi
        ;;
        "linux-armhf")
            if [ "$(uname -m)" != "armhf" ]; then
                apt-get install -yqq g++-arm-linux-gnueabihf
            elif [ -n "${GITHUB_ENV}" ] && [ "${release}" = "bionic" ]; then
                update-alternatives --install /usr/bin/arm-linux-gnueabihf-gcc arm-linux-gnueabihf-gcc /usr/bin/gcc-11 60 --slave /usr/bin/arm-linux-gnueabihf-g++ arm-linux-gnueabihf-g++ /usr/bin/g++-11
            fi
        ;;
        "linux-i686")
            if [ "$(uname -m)" != "i686" ]; then
                apt-get install -yqq g++-i686-linux-gnu
            elif [ -n "${GITHUB_ENV}" ] && [ "${release}" = "bionic" ]; then
                update-alternatives --install /usr/bin/i686-linux-gnu-gcc i686-linux-gnu-gcc /usr/bin/gcc-11 60 --slave /usr/bin/i686-linux-gnu-g++ i686-linux-gnu-g++ /usr/bin/g++-11
            fi
        ;;
        "linux-riscv64")
            if [ "$(uname -m)" != "riscv64" ]; then
                apt-get install -yqq g++-riscv64-linux-gnu
            fi
        ;;
        "linux-x86_64")
            if [ "$(uname -m)" != "x86_64" ]; then
                apt-get install -yqq g++-x86_64-linux-gnu
            elif [ -n "${GITHUB_ENV}" ] && [ "${release}" = "bionic" ]; then
                update-alternatives --install /usr/bin/x86_64-linux-gnu-gcc x86_64-linux-gnu-gcc /usr/bin/gcc-11 60 --slave /usr/bin/x86_64-linux-gnu-g++ x86_64-linux-gnu-g++ /usr/bin/g++-11
            fi
        ;;
        "win32")
            apt-get install -yqq binutils-mingw-w64-i686 g++-mingw-w64-i686
        ;;
        "win64")
            apt-get install -yqq binutils-mingw-w64-x86-64 g++-mingw-w64-x86-64
        ;;
    esac
}

case "${1}" in
    "macos"|"macos-intel"|"macos-10.15"|"macos-universal"|"macos-universal-10.15")
        brew uninstall --ignore-dependencies --force cairo cmake freetype
        brew install autoconf automake coreutils gawk git gnu-sed jq libtool make meson

        [ -n "${GITHUB_ENV}" ] && echo "PAWPAW_PACK_NAME=${1}-$(sw_vers -productVersion | cut -d '.' -f 1)" >> "${GITHUB_ENV}"
    ;;
    *)
        if [ "$(id -u)" -ne 0 ] && [ -e /usr/bin/sudo ]; then
            exec /usr/bin/sudo $0 "$@"
        fi

        apt-get update -qq
        apt-get install -yqq autoconf automake build-essential curl cmake file git jq libglib2.0-dev-bin libtool lsb-release make meson gperf patchelf pkg-config uuid-dev zlib1g-dev

        linux_arch=$(get_linux_deb_arch "${1}")
        release=$(lsb_release -cs 2>/dev/null)

        if [ -n "${linux_arch}" ]; then
            if [ "$(lsb_release -si 2>/dev/null)" = "Ubuntu" ]; then
                if [ -e /etc/apt/sources.list.d/ubuntu.sources ]; then
                    sed -i 's|Types: deb|Types: deb\nArchitectures: amd64 i386|g' /etc/apt/sources.list.d/ubuntu.sources
                else
                    sed -i "s/deb http/deb [arch=i386,amd64] http/" /etc/apt/sources.list
                    sed -i "s/deb mirror/deb [arch=i386,amd64] mirror/" /etc/apt/sources.list
                fi
                if [ "${linux_arch}" != "amd64" ] && [ "${linux_arch}" != "i386" ]; then
                    echo "deb [arch=${linux_arch}] http://ports.ubuntu.com/ubuntu-ports ${release} main restricted universe multiverse" | tee -a /etc/apt/sources.list
                    echo "deb [arch=${linux_arch}] http://ports.ubuntu.com/ubuntu-ports ${release}-updates main restricted universe multiverse" | tee -a /etc/apt/sources.list
                    echo "deb [arch=${linux_arch}] http://ports.ubuntu.com/ubuntu-ports ${release}-backports main restricted universe multiverse" | tee -a /etc/apt/sources.list
                fi
                if [ -n "${GITHUB_ENV}" ] && [ "${release}" = "bionic" ]; then
                    apt-get install -yqq --no-install-recommends software-properties-common
                    add-apt-repository -yn ppa:ubuntu-toolchain-r/test
                fi
            fi
            dpkg --add-architecture ${linux_arch}
            apt-get update -qq
            apt-get install -yqq --allow-downgrades \
                binfmt-support \
                qemu-user-static \
                x11proto-dev x11proto-render-dev x11proto-xf86vidmode-dev \
                libasound2-dev:${linux_arch} \
                libdbus-1-dev:${linux_arch} \
                libfftw3-dev:${linux_arch} \
                libfreetype6-dev:${linux_arch} \
                libgl1-mesa-dev:${linux_arch} \
                libglib2.0-dev:${linux_arch} \
                libpcre2-dev:${linux_arch} \
                libpcre3-dev:${linux_arch} \
                libvulkan-dev:${linux_arch} \
                libx11-dev:${linux_arch} \
                libxcb1-dev:${linux_arch} \
                libxcb-dri2-0-dev:${linux_arch} \
                libxcursor-dev:${linux_arch} \
                libxdamage-dev:${linux_arch} \
                libxext-dev:${linux_arch} \
                libxfixes-dev:${linux_arch} \
                libxrandr-dev:${linux_arch} \
                libxrender-dev:${linux_arch} \
                libxxf86vm-dev:${linux_arch} \
                uuid-dev:${linux_arch}
            apt-get install -yqq --allow-downgrades \
                qtbase5-dev-tools \
                libqt5svg5-dev:${linux_arch} \
                qtbase5-dev:${linux_arch}
        elif [ "${1}" = "win32" ] || [ "${1}" = "win64" ]; then
            dpkg --add-architecture i386
            apt-get update -qq
            apt-get install -yqq autopoint libffi-dev libreadline-dev mingw-w64
            if [ "$(lsb_release -si 2>/dev/null)" = "Debian" ]; then
                apt-get install -yqq wine wine32 wine64
            else
                apt-get install -yqq wine-stable
            fi
        fi

        case "${release}" in
            "bionic"|"bullseye"|"focal")
                apt-get install -yqq --no-install-recommends python3-pip
                pip3 install --isolated --upgrade --no-cache-dir --force-reinstall pip
                pip3 install --isolated --upgrade --no-cache-dir --force-reinstall cmake meson
            ;;
        esac

        install_compiler "${1}" "${release}"

        [ -n "${GITHUB_ENV}" ] && echo "PAWPAW_PACK_NAME=${1}-${release}" >> "${GITHUB_ENV}"
    ;;
esac

# if we reach this point in the script, make sure to return/exit 0
exit 0
