#!/usr/bin/env 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.

set -eu

if [ "${1-}" == "help" ]; then
  cat <<EOF
Usage:
$0 [port]
     Builds docs and starts a web server serving docs on localhost:port
     Default port is 12345.
$0 <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>.
EOF
  exit 0
fi

if [[ "${1-}" == [0-9]* ]]; then
  readonly PORT="$1"
  readonly TARGET=''
else
  readonly PORT="${1-12345}"
  readonly TARGET="${1-}"
fi

readonly WORKING_DIR=$(mktemp -d)
readonly SERVING_PREFIX="${2-$TARGET}"

function check {
  which "$1" > /dev/null || (echo "$1 not installed. Please install $1."; exit 1)
}

function build_and_serve {
  bazel build //site:jekyll-tree.tar
  rm -rf "$WORKING_DIR/*"
  tar -xf bazel-genfiles/site/jekyll-tree.tar -C "$WORKING_DIR"

  pkill -9 jekyll || true

  if [ -z "$TARGET" ]; then
    echo "Serving skydoc.bazel.build site at port $PORT"
    jekyll serve --detach --quiet --port "$PORT" --source "$WORKING_DIR"
  else
    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"
  fi
}

function main {
  check jekyll

  old_version="Jekyll 0.11.2"
  if expr match "$(jekyll --version)" "$old_version"; then
    # The ancient version that apt-get has.
    echo "ERROR: Running with an old version of Jekyll, update " \
      "to 2.5.3 with \`sudo gem install jekyll -v 2.5.3\`"
    exit 1
  fi

  build_and_serve

  echo "Type q to quit, r to rebuild docs and restart jekyll"
  while true; do

    read -n 1 -s user_input
    if [ "$user_input" == "q" ]; then
      echo "Quitting"
      exit 0
    elif [ "$user_input" == "r" ]; then
      echo "Rebuilding docs and restarting jekyll"
      build_and_serve
      echo "Rebuilt docs and restarted jekyll"
    fi
  done
}

function cleanup {
  rm -rf "$WORKING_DIR"
  pkill -9 jekyll
}
trap cleanup EXIT

main
