#!/usr/bin/env bash
#
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements.  See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to you 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.
#

function exit_with_usage {
  cat << EOF

  USAGE: update-doc.sh [spark] [flink]

  This script generates the documentation for the individual Bahir (Spark) and
  Bahir-Flink modules from the contents of the respective module's README.md
  files as found in the Bahir and Bahir-Flink source repositories.

     bahir (source repo)       bahir-website
     .                         └─site
     .                           └─docs
     .                             └─spark
     ├─sql-streaming-mqtt            └─current
     │ └─README.md          ─────>     ├─spark-sql-streaming-mqtt.md
     ├─streaming-akka                  │
     │ └─README.md          ─────>     ├─spark-streaming-akka.md
     ├─streaming-mqtt                  │
     │ └─README.md          ─────>     ├─spark-streaming-mqtt.md
     ├─streaming-twitter               │
     │ └─README.md          ─────>     ├─spark-streaming-twitter.md
     └─streaming-zeromq                │
       └─README.md          ─────>     └─spark-streaming-zeromq.md

     bahir-flink (source repo)   bahir-website
     .                           └─site
     .                             └─docs
     .                               └─flink
     ├─sql-streaming-mqtt              └─current
     │ └─README.md          ─────>       ├─flink-streaming-activemq.md
     ├─streaming-akka                    │
     │ └─README.md          ─────>       ├─flink-streaming-akka.md
     ├─streaming-mqtt                    │
     │ └─README.md          ─────>       ├─flink-streaming-flume.md
     ├─streaming-twitter                 │
     │ └─README.md          ─────>       ├─flink-streaming-netty.md
     └─streaming-zeromq                  │
       └─README.md          ─────>       └─flink-streaming-redis.md


  Page header with license text comes from the respective template files
  under:
    site/docs/spark/templates
    site/docs/flink/templates

EOF
  exit 1
}

if [[ "$@" =~ "-h" ]]; then
    exit_with_usage
fi

REPOS="${@:-'spark flink'}"

set -e

BASE_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"

SPARK_WEBSITE_TEMPLATES_DIR=site/docs/spark/templates
SPARK_WEBSITE_DOC_DIR=site/docs/spark/current
SPARK_REPO_NAME=bahir
SPARK_BAHIR_SOURCE_DIR=target/$SPARK_REPO_NAME

FLINK_WEBSITE_TEMPLATES_DIR=site/docs/flink/templates
FLINK_WEBSITE_DOC_DIR=site/docs/flink/current
FLINK_REPO_NAME=bahir-flink
FLINK_BAHIR_SOURCE_DIR=target/$FLINK_REPO_NAME

GIT_REF=${GIT_REF:-master}

function checkout_code {
    # Checkout code
    cd "$BASE_DIR" # make sure we're in the base dir

    rm -rf target
    mkdir target
    cd target
    git clone "https://gitbox.apache.org/repos/asf/$1.git" --quiet
    cd "$1"
    git checkout "$GIT_REF"
    git_hash=$(git rev-parse --short HEAD)
    echo "Checked out $1 git hash $git_hash"

    git clean -d -f -x

    cd "$BASE_DIR" # return to base dir
}

function update_docs {
    WEBSITE_TEMPLATES_DIR=$1
    WEBSITE_DOC_DIR=$2
    SOURCE_DIR=$3
    shift 3

    [ ! -d "$WEBSITE_DOC_DIR" ] && mkdir "$WEBSITE_DOC_DIR"

    echo "Updating documents ..."

    while [ $# -ne 0 ]; do
        echo "  $WEBSITE_DOC_DIR/$1.md   <--   $SOURCE_DIR/$2/README.md"
        rm -f "$WEBSITE_DOC_DIR/$1.md"
        cp    "$WEBSITE_TEMPLATES_DIR/$1.template" "$WEBSITE_DOC_DIR/$1.md"
        cat   "$SOURCE_DIR/$2/README.md"        >> "$WEBSITE_DOC_DIR/$1.md"
        shift 2
    done
}

function check_version_strings {
    if grep -q -r "[0-9]-SNAPSHOT" "$1"/*.md ; then
        echo
        echo "TODO: Replace '...-SNAPSHOT' version strings:"
        echo
        grep -r -n "[0-9]-SNAPSHOT" "$1"/*.md | sed 's/^/  /' | grep --color "[0-9.]*-SNAPSHOT"
        echo
        echo "i.e. to replace '2.1.0-SNAPSHOT' with '2.0.2' run the following command:"
        echo
        echo "  perl -i -pe 's/2.1.0-SNAPSHOT/2.0.2/g' $1/*.md"
        echo
    else
        echo
        echo "Generated files:"
        echo
        ls "$1"/*.md | xargs -n1 | sed -e 's|'"$(pwd -P)"/'||g'
    fi
}

function update_spark {
    echo
    echo "================= Updating Apache Spark Extension documents ================="
    echo

    checkout_code $SPARK_REPO_NAME

    update_docs "$SPARK_WEBSITE_TEMPLATES_DIR"              \
        "$SPARK_WEBSITE_DOC_DIR"  "$SPARK_BAHIR_SOURCE_DIR" \
        spark-sql-cloudant        sql-cloudant              \
        spark-sql-streaming-akka  sql-streaming-akka        \
        spark-sql-streaming-mqtt  sql-streaming-mqtt        \
        spark-streaming-akka      streaming-akka            \
        spark-streaming-mqtt      streaming-mqtt            \
        spark-streaming-pubsub    streaming-pubsub          \
        spark-streaming-pubnub    streaming-pubnub          \
        spark-streaming-twitter   streaming-twitter         \
        spark-streaming-zeromq    streaming-zeromq

    check_version_strings "$SPARK_WEBSITE_DOC_DIR"
}

function update_flink {
    echo
    echo "================= Updating Apache Flink Extension documents ================="
    echo

    checkout_code $FLINK_REPO_NAME

    update_docs "$FLINK_WEBSITE_TEMPLATES_DIR"              \
        "$FLINK_WEBSITE_DOC_DIR"  "$FLINK_BAHIR_SOURCE_DIR" \
        flink-streaming-activemq  flink-connector-activemq  \
        flink-streaming-akka      flink-connector-akka      \
        flink-streaming-flume     flink-connector-flume     \
        flink-streaming-influxdb  flink-connector-influxdb  \
        flink-streaming-kudu      flink-connector-kudu      \
        flink-streaming-netty     flink-connector-netty     \
        flink-streaming-redis     flink-connector-redis

    check_version_strings "$FLINK_WEBSITE_DOC_DIR"
}


[[ "$REPOS" =~ "spark" ]] && update_spark
[[ "$REPOS" =~ "flink" ]] && update_flink

set +e
