#!/bin/bash

set -e            # fail on errors

if [[ $(uname) == "Darwin" ]]; then
  PROG_DIR=$(dirname "$0")
else
  PROG_DIR=$(readlink -f $(dirname "$0"))
fi
cd "$PROG_DIR"

DRY="echo"        # default to dry mode unless -f is specified
MK_MERGE_MSG="1"  # 1 to update the MERGE_MSG, empty to do not generate it
MERGE_MSG=""      # msg to generate
JAR_DETECT=""
NAMES_FILTER=""

while [[ -n "$1" ]]; do
  if [[ "$1" == "-f" ]]; then
    DRY=""
  elif [[ "$1" == "-m" ]]; then
    MK_MERGE_MSG=""
  elif [[ "$1" == "-u" ]]; then
    JAR_DETECT="auto"
  elif [[ "$1" == "-o" ]]; then
    JAR_DETECT="only"
  elif [[ $JAR_DETECT == "only" && $1 =~ ^[a-z]+ ]]; then
    NAMES_FILTER="$NAMES_FILTER $1"
  else
    echo "Unknown argument: $1"
    echo "Usage: $0 [-f] [-m] [-u | -o name1.jar ... nameN.jar]"
    echo "       -f: actual do thing. Default is dry-run."
    echo "       -m: do NOT generate a .git/MERGE_MSG"
    echo "       -u: detect and git-revert unchanged JAR files"
    echo "       -o: only keep the given *leaf* filenames (.jar can be omitted)"
    exit 1
  fi
  shift
done

if [[ $JAR_DETECT == "only" && -z "$NAMES_FILTER" ]]; then
  echo "Error: -o must be followed by names of files to keep."
  exit 1
fi

function update() {
  echo
  local repo=$1

  echo "# Build tools/$repo"

  local SHA1=$( cd ../../tools/$repo ; git show-ref --head --hash HEAD )
  MERGE_MSG="$MERGE_MSG
tools/$repo: @ $SHA1"

  ( $DRY cd ../../tools/$repo && $DRY ./gradlew clean publishLocal pushDistribution )
}

function merge_msg() {
  local dst=.git/MERGE_MSG
  if [[ -n $DRY ]]; then
    echo "The following would be output to $dst (use -m to prevent this):"
    dst=/dev/stdout
  fi
  cat >> $dst <<EOMSG
Update SDK prebuilts.

Origin:
$MERGE_MSG

EOMSG
}

function preserve_jars() {
  JAR_TMP_DIR=`mktemp -d -t prebuilt_update_tmp.XXXXXXXX`
  N=0
  for i in `find . -type f  | grep -v "^\./\."` ; do
    tmpf=`echo $i | tr "./" "__"`
    dstf="$JAR_TMP_DIR/$tmpf"
    cp "$i" "$dstf"
    N=$((N+1))
  done
  echo "# Copied $N files to" $(basename $JAR_TMP_DIR)
}

function revert_unchanged_jars() {
  local i tmpf dstf tmp_hash local_hash
  for i in `find . -type f  | grep -v "^\./\."` ; do
    tmpf=`echo $i | tr "./" "__"`
    dstf="$JAR_TMP_DIR/$tmpf"
    tmp_hash=`get_hash $dstf`
    local_hash=`get_hash $i`
    if [[ $dst_hash == $src_hash ]]; then
      echo "# Revert unchanged file $i"
      $DRY cp "$dstf" "$i"
    else
      echo "!--> Keep changed file $i"
    fi
  done
  if [[ -d $JAR_TMP_DIR ]]; then
    echo "# Cleanup" $(basename $JAR_TMP_DIR)
    rm -rf $JAR_TMP_DIR
  fi
}

function revert_filter_jars() {
  local i j tmpf dstf keep
  for i in `find . -type f  | grep -v "^\./\."` ; do
    tmpf=`echo $i | tr "./" "__"`
    dstf="$JAR_TMP_DIR/$tmpf"
    if ! diff -q $dstf $i 1>/dev/null ; then
      j=$(basename "$i")
      for f in $NAMES_FILTER; do
        if [[ "$j" == "$f" || "$j" == "$f.jar" ]]; then
          echo "!--> Keep changed file $i"
          i=""
          break
        fi
      done
      if [[ -f "$i" ]]; then
        echo "# Revert file $i"
        $DRY cp "$dstf" "$i"
      fi
    fi
  done
  if [[ -d $JAR_TMP_DIR ]]; then
    echo "# Cleanup" $(basename $JAR_TMP_DIR)
    rm -rf $JAR_TMP_DIR
  fi
}

function get_hash() {
  # $1: the file to hash
  if [[ "${1: -3}" == "jar" ]]; then
    # Explanation:
    # - unzip -v prints a "verbose" list of a zip's content including each file path, size, timestamp and CRC32
    # - we don't want the timestamp so we use sed to first remove the time (12:34) and the date (13-14-15).
    # - finally get a md5 of the zip output.
    # if the md5 changes, the zip's content has changed (new file, different content size, different CRC32)
    unzip -v $1 | sed -n -e "/[0-9][0-9]:[0-9][0-9]/s/[0-9][0-9]:[0-9][0-9]// ; s/[0-9][0-9]-[0-9][0-9]-[0-9][0-9]//p" | md5sum -b | cut -d " " -f 1
  else
    md5sum -b "$1" | cut -d " " -f 1
  fi
}


if [[ -n $JAR_DETECT ]]; then preserve_jars; fi
for r in base swt; do
  update $r
done
if [[ -n $MK_MERGE_MSG ]]; then merge_msg; fi
if [[ $JAR_DETECT == "auto" ]]; then
  revert_unchanged_jars
elif [[ $JAR_DETECT == "only" ]]; then
  revert_filter_jars
fi
if [[ -n $DRY ]]; then
  echo
  echo "## WARNING: DRY MODE. Run with -f to actually copy files."
fi

