#!/usr/bin/env bash

set -eo pipefail

root_dir=$(pwd)

flags="use-werror=true ${@}"

is-mac() {
  if [[ $(uname -s) == "Darwin" || ${TRAVIS_OS_NAME} == "osx" ]]; then
    return 0
  fi
  return 1
}

install-deps() {
  if is-mac; then
    echo "------ Installing dependencies for Mac ------"
  else
    echo "------ Installing dependencies for Linux ------"
    sudo apt-get update -qq
    sudo apt-get install -y libc6-dev-i386 mingw-w64 gcc-mingw-w64-x86-64 g++-mingw-w64-i686 binutils-mingw-w64-x86-64 lib32z1-dev zlib1g-dev g++-mingw-w64-x86-64
  fi
}

run() {
  echo '==============================================='
  if [ ! $(pwd) = ${root_dir} ]; then
    printf "cd $(pwd); "
  fi
  echo "${@}"
  echo '==============================================='
  "${@}"
}

run_cmake() {
  mkdir -p cmake-build
  rm -rf cmake-build/*
  cd  cmake-build
  run cmake ${@} ..
  run make -j4 check
  cd ..
}

publish() {
  local platforms="${1}"
  local arches="${2}"

  local platform
  for platform in ${platforms}; do
    local arch
    for arch in ${arches}; do
      echo "------ Publishing ${platform}-${arch} ------"
      ./gradlew artifactoryPublish -Pplatform=${platform} -Parch=${arch}
    done
  done
}

has_flag() {
  local arg=${1}

  local f
  for f in ${flags}; do
    local key=$(echo $f | awk -F '=' '{print $1}')
    if [ ${key} = ${arg} ]; then
      return 0
    fi
  done
  return 1
}

### START ###

echo "java version:"
${JAVA_HOME}/bin/java -version

install-deps

if [[ "${1}" == "PUBLISH" ]]; then
  if is-mac; then
    publish "macosx" "i386 x86_64"
  elif [[ $(uname -s) == "Linux" ]]; then
    publish "linux windows" "i386 x86_64"
  fi
else
  if [[ $(uname -o) != "Cygwin" ]]; then
    run_cmake -DCMAKE_BUILD_TYPE=Debug
  fi

  make_target=test

  if ! has_flag arch; then
    run make ${flags} jdk-test
  fi

  run make ${flags} ${make_target}
  run make ${flags} mode=debug ${make_target}
  run make ${flags} process=interpret ${make_target}

  if has_flag openjdk-src || ! has_flag openjdk; then
    run make ${flags} mode=debug bootimage=true ${make_target}
    run make ${flags} bootimage=true ${make_target}
    run make ${flags} bootimage=true bootimage-test=true ${make_target}
  fi

  if ! has_flag openjdk && ! has_flag android && ! has_flag arch; then
    run make ${flags} openjdk=$JAVA_HOME ${make_target}
  fi

  run make ${flags} tails=true continuations=true heapdump=true ${make_target}
  run make ${flags} codegen-targets=all
fi