#!/bin/bash
# Copyright 2016 The Bazel Authors. All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#    http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# Prerequisites:
#
# - ruby version >= 2.4
# - rubygem dependencies: cd into script/docs and run
#
#     'gem install -g --no-rdoc --no-ri'
#

set -eu

readonly WORKING_DIR=$(mktemp -d)
: ${HOST:=localhost}
: ${PORT:=12345}
TARGET=
SERVING_PREFIX=

usage() {
  cat <<EOF
Usage: $0 [--port 12345] [--target DIR [PREFIX]] [--share]
 --port [port]
     Builds docs and starts a web server serving docs on localhost:port. Default
     port is 12345.
 --target <target directory> [<serving prefix>]
     Builds docs as static web pages in <target directory>. Replaces absolute
     paths in the resulting HTML with <serving prefix>, or, if it is not
     specified, with <target directory>.
 --share
     Binds jekyll to the machine's hostname, instead of localhost (useful for
     review).
 --help
     This message.
EOF
}

build_tree() {
  bazel build //site:jekyll-tree.tar
  rm -rf ${WORKING_DIR:-sentinel}/*
  tar -xf "$(bazel info bazel-genfiles)/site/jekyll-tree.tar" -C $WORKING_DIR
}

build_static() {
  build_tree
  TMP_TARGET=$(mktemp -d)
  jekyll build --source $WORKING_DIR --destination "$TMP_TARGET"
  REPLACEMENT=$(echo $SERVING_PREFIX | sed s/\\//\\\\\\//g)
  find $TMP_TARGET -name '*.html' | xargs sed -i s/href=\\\"\\//href=\"$REPLACEMENT\\//g
  find $TMP_TARGET -name '*.html' | xargs sed -i s/src=\\\"\\//src=\"$REPLACEMENT\\//g
  cp -R $TMP_TARGET/* $TARGET
  echo "Static pages copied to $TARGET"
  echo "Should be served from $SERVING_PREFIX"
}

build_and_serve() {
  build_tree
  echo "Serving docs.bazel.build site at $HOST:$PORT"
  jekyll serve --host "$HOST" --detach --quiet --port "$PORT" --source "$WORKING_DIR"
}

check_jekyll() {
  which jekyll > /dev/null || \
    (
      cat <<EOF
jekyll not installed. Please install jekyll and rubygem dependencies by going
into the scripts/docs/ directory and running 'gem install -g --no-rdoc --no-ri'.
EOF
      exit 1
    )
}

kill_jekyll() {
  pid="$(lsof "-tiTCP:$PORT" -sTCP:LISTEN)" || true
  if [ ! -z "$pid" ]; then
     kill "$pid"
  fi
  # I found I got bind errors sometimes if I didn't wait a second for the server to
  # actually shut down.
  sleep 2
}

main() {
  check_jekyll

  kill_jekyll

  while true; do
    build_and_serve

    echo "Type q to quit, r to rebuild docs and restart jekyll"
    read -n 1 -s user_input
    if [ "$user_input" == "q" ]; then
      kill_jekyll
      echo "Quitting"
      exit 0
    elif [ "$user_input" == "r" ]; then
      kill_jekyll
      echo "Rebuilding docs and restarting jekyll"
    fi
  done
}

while [[ $# -gt 0 ]]
do
  key="$1"
  case $key in
    --port)
      PORT="$2"
      shift
      ;;
    --share)
      HOST="$HOSTNAME"
      ;;
    --target)
      TARGET="$2"
      shift
      SERVING_PREFIX="${2:-}"
      build_static
      exit 0
      ;;
    --help|help)
      usage
      exit 0
      ;;
    *)
      usage
      exit 1
  esac
  shift
done

cleanup() {
  rm -rf $WORKING_DIR
  kill_jekyll
}
trap cleanup EXIT

main
