#!/usr/bin/env bash

THIS_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"

CLEAN=no
VERY_CLEAN=no
LOCAL=no

echo ""
echo "rJava test and debug script"
echo "args: <R version> <output root directory> [<--clean=no/yes>] [<--very-clean=no/yes>] [<--local=no/yes>]"
echo ""

if [[ -z "$1" ]]; then
  echo "Please pass first argument as an R version to test against, e.g. 3.4.2"
  exit 1
fi
R_VER=$1
shift

if [[ -z "$1" ]] || [[ ! -d "$1" ]]; then
  echo "Please pass as second argument an (existing) output directory"
  exit 2
fi
OUTDIR=$1
shift

while [ "$#" -gt 0 ]; do
    OPT="$1"
    case "$1" in
        --enable-*)
            VAR=$(echo $1 | sed "s,^--enable-\(.*\),\1,")
            VAL=yes
            ;;
        --disable-*)
            VAR=$(echo $1 | sed "s,^--disable-\(.*\),\1,")
            VAL=no
            ;;
        --*=*)
            VAR=$(echo $1 | sed "s,^--\(.*\)=.*,\1,")
            VAL=$(echo $1 | sed "s,^--.*=\(.*\),\1,")
            ;;
        *)
            echo "Unrecognised option '$1'"
            exit 1
            ;;
    esac
    VAR=$(echo "$VAR" | tr '[a-z]-' '[A-Z]_')
    case "$VAR" in
        sources)
            if [ "$VAL" = "local" -o "$VAL" = "remote" ]; then
                eval "$VAR=\$VAL"
            else
                echo "$VAL can only be 'local' or 'remote'"
                exit 1
            fi
            ;;
        *)
            eval "$VAR=\$VAL"
            ;;
    esac
    shift
    OPTIONS_DEBUG=$OPTIONS_DEBUG" $VAR=$VAL"
done

if [[ $(uname) == Darwin ]]; then
  COMPILER=clangxx_osx-64
  DIR=$(hostname)
  EREGEX=-e
  MC=MacOSX
elif [[ $(uname) == Linux ]]; then
  COMPILER=gxx_linux-64
  DIR=$(hostname)
  MC=Linux
else
  echo "Windows not supported yet"
  exit 3
fi

echo "Please wait ..."
echo ""

if [[ -n "${CONDA_PREFIX}" ]]; then
  if [[ ${LOCAL} == yes ]]; then
    if [[ ${CONDA_DEFAULT_ENV} != root ]] && [[ ${CONDA_DEFAULT_ENV} != base ]]; then
      echo "To use --local=yes you must be in an activated base environment (${CONDA_DEFAULT_ENV} env activated)"
      exit 4
    fi
  else
    . deactivate > /dev/null 2>&1
  fi
else
  if [[ ${LOCAL} == yes ]]; then
    echo "To use --local=yes you must be in an activated base environment (no env activated)"
    exit 5
  fi
fi
ENAME=r${R_VER}

if [[ ${LOCAL} == no ]]; then
  ROOT_LOC=/tmp/mc3-rjd
  if [[ ${VERY_CLEAN} == yes ]]; then
    if [[ -d ${ROOT_LOC} ]]; then
      rm -rf ${ROOT_LOC}
    fi
  fi
  if [[ ! -d ${ROOT_LOC} ]]; then
    [[ -d $(dirname ${ROOT_LOC}) ]] || mkdir -p $(dirname ${ROOT_LOC})
    pushd $(dirname ${ROOT_LOC})
    curl -SLO --insecure https://repo.continuum.io/miniconda/Miniconda3-latest-${MC}-x86_64.sh
    bash Miniconda3-latest-${MC}-x86_64.sh -bfp ${ROOT_LOC} > /dev/null 2>&1
  fi
  CHANNELS_ARGS="--override-channels -c http://repo.continuum.io/pkgs/main -c http://repo.continuum.io/pkgs/r"
else
  ROOT_LOC=${CONDA_PREFIX}
  CHANNELS_ARGS="--override-channels -c http://repo.continuum.io/pkgs/main -c local -c rdonnellyr"
fi

if [[ ${CLEAN} == yes ]]; then
  [[ -d ${ROOT_LOC}/envs/${ENAME} ]] && rm -rf ${ROOT_LOC}/envs/${ENAME}
fi
if [[ ! -d ${ROOT_LOC}/envs/${ENAME} ]]; then
  ${ROOT_LOC}/bin/conda create -y -n ${ENAME} ${CHANNELS_ARGS} r-base=${R_VER} r-rjava ${COMPILER}
fi
. ${ROOT_LOC}/bin/activate ${ENAME} > /dev/null 2>&1

if ! grep 'set -x' ${CONDA_PREFIX}/lib/R/bin/javareconf > /dev/null; then
  sed -i'' ${EREGEX} '1i\'$'\n''set -x\'$'\n' ${CONDA_PREFIX}/lib/R/bin/javareconf
fi

R CMD javareconf > /tmp/R-CMD-javareconf.log 2>&1
if [[ $? == 0 ]]; then
  OK_JAVARECONF=yes
else
  OK_JAVARECONF=no
fi
R --silent -e 'library(rJava); .jinit()' > /tmp/rJava-_jinit.log 2>&1
if [[ $? == 0 ]]; then
  OK_RJAVA=yes
else
  OK_RJAVA=no
fi

if [[ ${OK_JAVARECONF} == yes ]] && [[ ${OK_RJAVA} == yes ]]; then
  DEST="${OUTDIR}"/${R_VER}/working/${DIR}
  echo "Success, writing logs and system/java information to ${DEST}"
else
  DEST="${OUTDIR}"/${R_VER}/broken/${DIR}
  echo "Failue, writing logs and system/java information to ${DEST}"
fi
[[ -d ${DEST} ]] || mkdir -p ${DEST}

if [[ ${OK_JAVARECONF} == yes ]]; then
  echo working > ${DEST}/R-CMD-javareconf-status.log
else
  echo broken > ${DEST}/R-CMD-javareconf-status.log
fi

# WIP WIP WIP (remove this)
# Test against the new WIP javareconf in the folder of this script
if [[ -f ${THIS_DIR}/javareconf.3.4.3.WIP ]]; then
  mv ${CONDA_PREFIX}/lib/R/bin/javareconf ${CONDA_PREFIX}/lib/R/bin/javareconf.orig
  cp ${THIS_DIR}/javareconf.3.4.3.WIP ${CONDA_PREFIX}/lib/R/bin/javareconf
  R CMD javareconf > ${DEST}/R-CMD-javareconf-WIP.log 2>&1
  if [[ $? == 0 ]]; then
    echo working > ${DEST}/R-CMD-javareconf-WIP-status.log
  else
    echo broken > ${DEST}/R-CMD-javareconf-WIP-status.log
  fi
  rm ${CONDA_PREFIX}/lib/R/bin/javareconf
  mv ${CONDA_PREFIX}/lib/R/bin/javareconf.orig ${CONDA_PREFIX}/lib/R/bin/javareconf
fi
# END WIP END WIP END WIP

cp /tmp/R-CMD-javareconf.log ${DEST}/
cp /tmp/rJava-_jinit.log ${DEST}/

pkgutil --pkgs | grep 'Java\|JDK\|JRE\|jdk\|jre' > ${DEST}/pkgutil---pkgs.log

IFS=$'\n' read -d '' -r -a JAVA_PKGS < ${DEST}/pkgutil---pkgs.log
for JAVA_PKG in ${JAVA_PKGS[@]}; do
  pkgutil --info ${JAVA_PKG} > ${DEST}/pkgutil-${JAVA_PKG}.log
  pkgutil --files ${JAVA_PKG} >> ${DEST}/pkgutil-${JAVA_PKG}.log
done

export DYLD_PRINT_LIBRARIES=1
R --silent -e 'library(rJava); .jinit()' > ${DEST}/rJava-_jinit-dylibs.log 2>&1
