#/bin/bash

export USE_CCACHE=1
export NDK_CCACHE=ccache
export HOMEBREW_NO_INSTALL_CLEANUP=1
export HOMEBREW_NO_AUTO_UPDATE=1
export HOMEBREW_NO_ANALYTICS=1
NDK_VER=android-ndk-r18b

download_extract() {
    aria2c -x 16 $1 -o $2
    tar -xf $2
}

# This is used for the Android NDK.
download_extract_zip() {
    aria2c --file-allocation=none --timeout=120 --retry-wait=5 --max-tries=20 -Z -c $1 -o $2
    # This resumes the download, in case it failed.
    aria2c --file-allocation=none --timeout=120 --retry-wait=5 --max-tries=20 -Z -c $1 -o $2

    unzip $2 2>&1 | pv > /dev/null
}

travis_before_install() {
    git submodule update --init --recursive
}

travis_install() {
    # Ubuntu Linux + GCC 4.8
    if [ "$PPSSPP_BUILD_TYPE" = "Linux" ]; then
        if [ "$CXX" = "g++" ]; then
            sudo apt-get install -qq g++-4.8
        fi

        if [ "$QT" = "TRUE" ]; then
            sudo apt-get install -qq qt5-qmake qtmultimedia5-dev qtsystems5-dev qtbase5-dev qtdeclarative5-dev qttools5-dev-tools libqt5webkit5-dev libqt5opengl5-dev libsqlite3-dev qt5-default
        fi

        download_extract "https://cmake.org/files/v3.6/cmake-3.6.2-Linux-x86_64.tar.gz" cmake-3.6.2-Linux-x86_64.tar.gz
    fi

    # Android NDK + GCC 4.8
    if [ "$PPSSPP_BUILD_TYPE" = "Android" ]; then
        download_extract_zip http://dl.google.com/android/repository/${NDK_VER}-linux-x86_64.zip ${NDK_VER}-linux-x86_64.zip
    fi

    if [ "$PPSSPP_BUILD_TYPE" = "Windows" ]; then
        curl -L https://github.com/frerich/clcache/releases/download/v4.2.0/clcache.4.2.0.nupkg --output clcache.4.2.0.nupkg
        choco install clcache --source=.
    fi

    # Ensure we're using ccache
    if [[ "$CXX" = "clang" && "$CC" == "clang" ]]; then
        export CXX="ccache clang" CC="ccache clang"
    fi
    if [[ "$PPSSPP_BUILD_TYPE" == "Linux" && "$CXX" == "g++" ]]; then
        # Also use gcc 4.8, instead of whatever default version.
        export CXX="ccache g++-4.8" CC="ccache gcc-4.8"
    fi
    if [[ "$CXX" != *ccache* ]]; then
        export CXX="ccache $CXX"
    fi
    if [[ "$CC" != *ccache* ]]; then
        export CC="ccache $CC"
    fi
}

travis_script() {
    # Compile PPSSPP
    if [ "$PPSSPP_BUILD_TYPE" = "Linux" ]; then
        if [ -d cmake-3.6.2-Linux-x86_64 ]; then
            export PATH=$(pwd)/cmake-3.6.2-Linux-x86_64/bin:$PATH
        fi

        if [ "$QT" = "TRUE" ]; then
            ./b.sh --qt
        elif [ "$LIBRETRO" = "TRUE" ]; then
            ./b.sh --libretro
        else
            ./b.sh --headless
        fi
    fi
    if [ "$PPSSPP_BUILD_TYPE" = "Android" ]; then
        export ANDROID_HOME=$(pwd)/${NDK_VER} NDK=$(pwd)/${NDK_VER}
        if [[ "$CXX" = *clang* ]]; then
            export NDK_TOOLCHAIN_VERSION=clang
        fi

        if [ "$LIBRETRO" = "TRUE" ]; then
            ./b.sh --libretro_android ppsspp_libretro
        else
            pushd android
            ./ab.sh -j2 APP_ABI=$APP_ABI
            popd
        fi

#        When we can get this to work...
#        chmod +x gradlew
#        ./gradlew assembleRelease
    fi
    if [ "$PPSSPP_BUILD_TYPE" = "iOS" ]; then
        ./b.sh --ios
    fi
    if [ "$PPSSPP_BUILD_TYPE" = "macOS" ]; then
        ./b.sh --headless
    fi
    if [ "$PPSSPP_BUILD_TYPE" = "Windows" ]; then
        export "MSBUILD_PATH=/c/Program Files (x86)/Microsoft Visual Studio/2017/BuildTools/MSBuild/15.0/Bin"
        export "PATH=$MSBUILD_PATH:$PATH"
        export CLCACHE_OBJECT_CACHE_TIMEOUT_MS=120000

        # Set DebugInformationFormat to nothing, the default is ProgramDatabase which breaks clcache.
        # Turns out it's not possible to pass this on the msbuild command line.
        for f in `find . -name *.vcxproj`; do
            sed -i 's/>ProgramDatabase<\/DebugInformationFormat>/><\/DebugInformationFormat>/g' $f
        done

        if [ "$UWP" == "TRUE" ]; then
            msbuild.exe UWP\\PPSSPP_UWP.sln -m -p:CLToolExe=clcache.exe -p:Configuration=Release -p:Platform=x64 -p:TrackFileAccess=false -p:AppxPackageSigningEnabled=false
        else
            msbuild.exe Windows\\PPSSPP.sln -m -p:CLToolExe=clcache.exe -p:Configuration=Release -p:Platform=x64 -p:TrackFileAccess=false
        fi
    fi
}

travis_after_success() {
    if [ "$PPSSPP_BUILD_TYPE" != "Windows" ]; then
        ccache -s
    else
        clcache -s
        clcache -z
    fi

    if [ "$PPSSPP_BUILD_TYPE" = "Linux" ]; then
        ./test.py
    fi
}

set -e
set -x

$1;
