#!/usr/bin/env sh
DIR="$(
  cd "$(dirname "$0")"
  pwd -P
)"
ENV="${DIR}/.env"
IMAGE_NAME="allfunc/mdbook"

if [ -e "${ENV}" ]; then
  MDBOOK_SRC=$(awk -F "=" '/^MDBOOK_SRC/ {print $2}' $ENV)
  if [ ! -z "${MDBOOK_SRC}" ]; then
    MDBOOK_SRC=$DIR/$MDBOOK_SRC
  fi
  CONTAINER_NAME=$(awk -F "=" '/^CONTAINER_NAME/ {print $2}' $ENV)
  ENV_PORT=$(awk -F "=" '/^PORT/ {print $2}' $ENV)
  if [ ! -z "${ENV_PORT}" ]; then
    PORT=$ENV_PORT
  fi
fi

PORT=${PORT:-3888}
MDBOOK_SRC=${MDBOOK_SRC:-$DIR}
CONTAINER_NAME=${CONTAINER_NAME:-mdbook}

open() {
  OpenCmd=$(which xdg-open 2> /dev/null)
  case "$OSTYPE" in
    linux*) ;;

    darwin*)
      OpenCmd="open"
      ;;
    *) ;;

  esac
  if [ -z "$OpenCmd" ]; then
    OpenCmd="echo"
  fi
  echo ${OpenCmd} http://localhost:${PORT} | sh
}

start() {
  # echo $MDBOOK_SRC
  # echo $CONTAINER_NAME
  # echo $PORT
  # exit;
  stop
  watchMode=$1
  cmd="docker run -p ${PORT}:${PORT} -e PORT=${PORT} -u $(id -u):$(id -g)"
  if [ -e "${DIR}/book.toml" ]; then
    cmd+=" -v ${DIR}/book.toml:/mdbook/book.toml"
  fi
  cmd+=" -v ${MDBOOK_SRC}:/mdbook/src --name ${CONTAINER_NAME} --rm"
  cmd1="${cmd} -d ${IMAGE_NAME} server"
  cmd2="${cmd} ${IMAGE_NAME} server"
  echo $cmd2
  echo $cmd1 | sh
  sleep 5
  if [ -n "$watchMode" ]; then
    watch
  fi
  open
  logs || echo $cmd2 | sh
}

build() {
  cmd="docker run"
  if [ -e "${DIR}/book.toml" ]; then
    cmd+=" -v ${DIR}/book.toml:/mdbook/book.toml"
  fi
  cmd+=" -v ${MDBOOK_SRC}:/mdbook/src --rm -d ${IMAGE_NAME} build -d /mdbook/src/docs"
  echo $cmd
  echo $cmd | sh
}

stop() {
  local res=$(status | tail -1 | awk '{print $(NF)}')
  if [ "x$res" == "x$CONTAINER_NAME" ]; then
    docker stop ${CONTAINER_NAME}
    sleep 1
  fi
  pgrep -lf "/tmp/mdbook" | awk '{print $1}' | xargs -I{} kill -9 {}
}

status() {
  docker ps -f name=${CONTAINER_NAME}
}

logs() {
  docker logs -f ${CONTAINER_NAME}
}

enter() {
  binPath=$0
  if [ "$binPath" == "bash" ] || [ "$binPath" == "sh" ]; then
    echo "docker exec -it ${CONTAINER_NAME} bash"
  else
    docker exec -it ${CONTAINER_NAME} bash
  fi
}

pull() {
  docker pull ${IMAGE_NAME}
}

watch() {
  pid=$$
  watchfile=/tmp/mdbook-${pid}
  logfile=/tmp/mdbook-${pid}.log
  cat > ${watchfile} << EOF
#!/usr/bin/env sh
WATCH_FOLDER=${MDBOOK_SRC}
TOUCH='docker exec mdbook do-touch'

echo
echo 'Start to monitor: '\${WATCH_FOLDER}
echo

while true; do
  isRunning=\$(docker container ls --filter name=mdbook --format '{{.Names}}' | head -n 1)
  if [ -z "\${isRunning}" ]; then
    echo
    echo 'Stop monitor: '\${WATCH_FOLDER}
    echo
    break;
  fi
  find \${WATCH_FOLDER} -newer ${watchfile} -type f \( ! -path "*.sw*" \) -print -a -exec sh -c 'new_path="\${1#\$2/}"; \$3 \$new_path' _ {} "\$WATCH_FOLDER" "\$TOUCH" \;
  touch ${watchfile}
  sleep 1
done
EOF
  chmod 0755 ${watchfile}
  sh -c ${watchfile} > ${logfile} 2>&1 &
}

case "$1" in
  start)
    start
    ;;
  watch)
    start watch
    ;;
  stop)
    stop
    ;;
  build)
    build
    ;;
  status)
    status
    ;;
  logs)
    logs
    ;;
  pull)
    pull
    ;;
  enter)
    enter
    ;;
  open)
    open
    ;;
  *)
    binPath=$0
    if [ "$binPath" == "bash" ] || [ "$binPath" == "sh" ]; then
      binPath="curl -L http://bit.ly/exec-mdbook | bash -s --"
    fi
    echo "$binPath [start|watch|stop|build|status|logs|pull|enter|open]"
    exit
    ;;
esac

exit $?