#!/bin/bash

PACKAGE_FOLDER=packages
CONTAINER_NAME=node
WORKSPACE_ONLY=1

VERSION=v1.0.2
SEPERATOR="------------------------"

trap trap_int INT
function trap_int() {
  echo -e "${SEPERATOR}\n[interrupt] ${PACKAGE_INFO}"
}

echo -e "[monorepo] Run in Docker ${VERSION}\n${SEPERATOR}"

# throw default error
if [ -z "$1" ] && [ -z "${WORKSPACE_ONLY}" ]; then
  echo "[error] Please state a package folder relative to '${PACKAGE_FOLDER}'."
  exit 127
fi

# ls command
if [ "$1" == "ls" ] && [ -z "$WORKSPACE_ONLY" ]; then
  npx lerna la
  exit 0
fi

# check command

if [ -z "$WORKSPACE_ONLY" ]; then
  PACKAGES=$(npx lerna la)
  PACKAGE=($(echo ${PACKAGES} | grep $1 | sed -r 's/^([^ ]*).*$/\1/'))

  IS_WORKSPACE=$([[ "$1" == "root" || "$1" == "ws" || "$1" == "." ]] && echo true)
  IS_FORALL=$([[ "$1" == "all" ]] && echo true)
  IS_LERNA=$([[ "$1" == "lerna" ]] && echo true)
else
  IS_WORKSPACE=true
fi

if [[ -z "${PACKAGE}" && -z "${IS_WORKSPACE}" && -z "${IS_FORALL}" && -z "${IS_LERNA}" ]]; then
  echo "[error] Can not find package in directory."
  echo "${SEPERATOR}"
  echo "Available packages are:"
  echo "${PACKAGES}"
  exit 127
fi

# where to run
if [[ ! -z "${IS_WORKSPACE}" || ! -z "${IS_FORALL}" || ! -z "${IS_LERNA}" ]]; then
  PACKAGE="workspace"
  WORKDIR="."
else
  WORKDIR="${PACKAGE_FOLDER}/$1"
fi

# command
if [ -z "${WORKSPACE_ONLY}" ]; then
  if [ ! -z "${IS_FORALL}" ]; then
    RUN_COMMAND="npx lerna exec -- ${*:2}"
  elif [ ! -z "${IS_LERNA}" ]; then
    RUN_COMMAND="npx lerna ${*:2}"
  else
    RUN_COMMAND="${*:2}"
  fi
else
  RUN_COMMAND="${*:1}"
fi

if [ -z "${RUN_COMMAND}" ]; then
  echo "Please state a command to run in '${PACKAGE}'."
  exit 127
fi

PACKAGE_INFO="${PACKAGE} in ${WORKDIR} | \$ ${RUN_COMMAND}"
docker-compose exec ${CONTAINER_NAME} /bin/bash -c "echo -e '[started] ${PACKAGE_INFO}\n${SEPERATOR}' && cd ${WORKDIR} && ${RUN_COMMAND} && echo -e '${SEPERATOR}\n[success] ${PACKAGE_INFO}' || echo -e '${SEPERATOR}\n[failed] ${PACKAGE_INFO}'"
