#!/bin/sh

# Fedora
# dnf install wget git make which patch findutils unzip
# Ubuntu
# apt install wget git build-essential unzip time python

# ./android_do
die() { echo "Error: $1"; exit 1; }
need() { which "$1" >/dev/null 2>/dev/null || die "Missing $1"; }
need which
need wget
need git
need make
need patch
need find
need unzip
need ls
need uname
need pwd
need mkdir
need rm
need time

#change this to valid ndk path, otherwise it will be downloaded
BUILD_PATH=$(pwd)/build_android
NDK_VERSION="android-ndk-r21"

case $(uname -s) in
    Darwin)
        TYPE=darwin
        ;;
    Linux)
        TYPE=linux
        ;;
    *)
        TYPE=
        ;;
esac

if test "x$CJDNS_NDK_PATH" != "x"; then
  false # we already have an ndk path...
elif test "x$TYPE" = xdarwin; then
  CJDNS_NDK_PATH_HINT=`echo $HOME/Library/Android/sdk/ndk/* | tail -1`
elif test "x$TYPE" = xlinux; then
  CJDNS_NDK_PATH_HINT=`echo $HOME/Android/Sdk/ndk/* | tail -1`
fi

if test "x$CJDNS_NDK_PATH" = "x"; then
  if test "x$CJDNS_NDK_PATH_HINT" != "x" && [ -d "$CJDNS_NDK_PATH_HINT" ]; then
    echo "Using NDK at path $CJDNS_NDK_PATH_HINT"
    CJDNS_NDK_PATH=$CJDNS_NDK_PATH_HINT
  elif [ -d "$BUILD_PATH/$NDK_VERSION/" ]; then
    CJDNS_NDK_PATH="$BUILD_PATH/$NDK_VERSION"
    echo "Using previously downloaded NDK $CJDNS_NDK_PATH"
  else
    echo "No NDK path known, NDK will be downloaded"
  fi
elif [ -d "$CJDNS_NDK_PATH" ]; then
  echo "Using NDK at specified path $CJDNS_NDK_PATH"
else
  die "NDK path $CJDNS_NDK_PATH is not a directory"
fi

cpu_arch="$(uname -m)"
[ -z "$cpu_arch" ] && die "NO CPU ARCHITECTURE DETECTED"
[ "$cpu_arch" = "i686" ] && cpu_arch="x86"

android_log=android_build_$$.log
enabled_log=${LOG}

mkdir $BUILD_PATH 2>/dev/null

if test "x$CJDNS_NDK_PATH" = "x"; then
  cd "$BUILD_PATH"
  filename="$NDK_VERSION-${TYPE}-${cpu_arch}.zip"
  echo "$filename"
  if ! [ -f "$filename" ]; then
    url="https://dl.google.com/android/repository/$NDK_VERSION-${TYPE}-${cpu_arch}.zip"
    wget "$url" || die "wget $url failed"
  fi
  if ! [ -d "$NDK_VERSION" ]; then
    unzip -q "$filename" || die "failed to unzip "
  fi
  CJDNS_NDK_PATH="$BUILD_PATH/$NDK_VERSION"
  [ -d "$CJDNS_NDK_PATH" ] || die "NDK zip file does not contain expected content"
  cd ..
fi

Seccomp_NO=1
mkdir $(pwd)/build_android/out 2>/dev/null

BUILD_0='
  APP_ABI=armv7a
  TOOLCHAIN_PREFIX=arm
  EABI=androideabi
  VERSION=16
'
BUILD_1='
  APP_ABI=aarch64
  VERSION=21
'
BUILD_2='
  APP_ABI=i686
  VERSION=16
'
BUILD_3='
  APP_ABI=x86_64
  VERSION=21
'

for i in `seq 0 100`; do
  BUILD=`eval echo "\\\$BUILD_$i"`
  if test "x$BUILD" = "x"; then
    continue
  fi
  export APP_ABI=
  export TOOLCHAIN_PREFIX=
  export EABI=
  export VERSION=
  export EABI=android
  export $BUILD
  if test "x$TOOLCHAIN_PREFIX" = "x"; then
    export TOOLCHAIN_PREFIX=$APP_ABI
  fi

  mkdir -p $(pwd)/build_android/out/${APP_ABI}/${VERSION}/
  rm -rf build_linux

  export SYSTEM=linux

  CROSS_PATH=$CJDNS_NDK_PATH/toolchains/llvm/prebuilt/${TYPE}-${cpu_arch}/bin
  export CC=${CROSS_PATH}/${APP_ABI}-linux-${EABI}${VERSION}-clang
  export CROSS=${CROSS_PATH}/${TOOLCHAIN_PREFIX}-linux-${EABI}
  export AR=${CROSS}-ar
  export LINK=${CROSS}-ld
  export RANLIB=${CROSS}-ranlib
  export CFLAGS=${CROSS_CFLAGS}
  export LDFLAGS=${CROSS_LDFLAGS}

  gcc_version=$(${CC} --version)
  echo Using $gcc_version
  echo Compiler CC: $CC
  echo Compiler LINK: $LINK
  echo Compiler CFLAGS: $CFLAGS
  echo Compiler LDFLAGS: $LDFLAGS
  time ./do
  cp cjdroute $(pwd)/build_android/out/${APP_ABI}/${VERSION}/ || ret=$?

  if [ "$ret" != "" ] && [ "$ret" != "0" ]; then
    printf "\e[1;31mCopying ${APP_ABI} binary failed, non zero status returned - $ret\e[0m\n"
    exit 1
  else
    printf "\e[1;32mCopied ${APP_ABI} successfully\e[0m\n\n"
  fi

  rm cjdroute 2>/dev/null
done

printf "\n\e[1;34mOutput:\e[0m\n"
for i in `seq 0 100`; do
  BUILD=`eval echo "\\\$BUILD_$i"`
  if test "x$BUILD" = "x"; then
    continue
  fi
  export $BUILD
  printf "\e[1;34m        $(pwd)/build_android/out/${APP_ABI}/${VERSION}/cjdroute\e[0m\n"
done

exit $ret
