#!/usr/bin/env bash

# bash strict mode (http://redsymbol.net/articles/unofficial-bash-strict-mode)
set -euo pipefail; IFS=$'\n\t'
trap 'echo "$(date "+[%H:%M:%S]") ERROR >> errexit on line $LINENO" >&2' ERR

ME="${0}"

# Conda functions are actually shell functions that don't get exported to
# subshells (by default), this is one way of re-sourcing those functions in the
# subshell, there may be other ways, but this seems to work for now, and should
# be portable? (https://github.com/conda/conda/issues/7980)
source "${CONDA_PREFIX%/*/*}/etc/profile.d/conda.sh"

# UTILS ------------------------------------------------------------------------

# info <message>; Print info message.
info() { printf "$(date "+[%H:%M:%S]") ${@}"; }

# abspath <directory>; Get the absolute path to a directory.
abspath() { [[ "${1}" = /* ]] && echo "${1}" || echo "$PWD/${1#./}"; }

SRC_DIR="$(dirname ${ME})"
CONDA_SPEC=$(abspath "${SRC_DIR%/bin}/env/env-crisprdetect.yml")
CONDA_BASE="$(conda info --base)"
TMP_DIR="${CONDA_BASE}/envs/crisprdetect/tmp"
CD_SRC_DIR="${CONDA_BASE}/envs/crisprdetect/CRISPRDetect_2.4"
# TODO: Make padloc directory not hard-coded to allow installation flexibility
PADLOC_DIR="${CONDA_BASE}/envs/padloc"
PATCH_MAIN="${PADLOC_DIR}/patch/CRISPRDetect.patch"
PATCH_SUBS="${PADLOC_DIR}/patch/CRISPRDETECT_SUBS_1.patch"

rm -drf "${TMP_DIR}" "${CD_SRC_DIR}"

info "Creating conda environment\n"
CMD_CONDA="conda env create -f ${CONDA_SPEC}"
info "$ ${CMD_CONDA}\n"
eval "${CMD_CONDA}"

info "Downloading CRISPRDetect from GitHub\n"
CMD_GIT="git clone https://github.com/davidchyou/CRISPRDetect_2.4 ${TMP_DIR}"
info "$ ${CMD_GIT}\n"
eval "${CMD_GIT}"

info "Extracting CRISPRDetect_2.4.zip\n"
CMD_UNZIP="unzip -o -q ${TMP_DIR}/CRISPRDetect_2.4.zip -d ${TMP_DIR} && mv ${TMP_DIR}/CRISPRDetect_2.4 ${CONDA_BASE}/envs/crisprdetect && rm -drf ${TMP_DIR}"
info "$ ${CMD_UNZIP}\n"
eval ${CMD_UNZIP}

info "Installing perl module 'Parallel::ForkManager'\n"
CMD_CPANM="conda run --live-stream -n crisprdetect cpanm Parallel::ForkManager"
info "$ ${CMD_CPANM}\n"
eval "${CMD_CPANM}"

info "Applying patches\n"
CMD_PATCH="patch ${CD_SRC_DIR}/CRISPRDetect.pl ${PATCH_MAIN}"
info "$ ${CMD_PATCH}\n"
eval "${CMD_PATCH}"
CMD_PATCH="patch ${CD_SRC_DIR}/CD_MODULES/CRISPRDETECT_SUBS_1.pm ${PATCH_SUBS}"
info "$ ${CMD_PATCH}\n"
eval "${CMD_PATCH}"

info "Testing CRISRDetect\n"
CMD_CD="conda run --live-stream -n crisprdetect perl ${CD_SRC_DIR}/CRISPRDetect.pl > /dev/null"
info "$ ${CMD_CD}\n"
eval "${CMD_CD}"

info "CRISPRDetect installed successfully\n"
