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

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 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
