#!/bin/bash -u

if [[ -z "${ANDROID_BUILD_TOP:-}" ]] ; then
  echo >&2 "*** ERROR: $(basename $0) requires envar ANDROID_BUILD_TOP to be set"
  exit 1
fi

DRYRUN=""
MODE="update"
while [[ $# -ne 0 ]] ; do
  case "${1}" in
    --dryrun)
      DRYRUN="echo"
      shift
      ;;
    --mode=*)
      MODE=${1#"--mode="}
      shift
      ;;
    *)
      echo >&2 "*** USAGE: $(basename $0) [--dryrun] [--mode={update|ndk_hook}]"
      exit 1
      ;;
  esac
done

TOOL=$(dirname $0)/generate_api.py
SPECFILE=$(dirname $0)/types.spec
HALDIR=${ANDROID_BUILD_TOP}/hardware/interfaces/neuralnetworks
NDKDIR=${ANDROID_BUILD_TOP}/frameworks/ml/nn/runtime/include

RET=0
function doit {
  typeset -r kind="$1" in="$2" out="$3"
  echo "=== $kind"
  ${DRYRUN} ${TOOL} --kind ${kind} --specification ${SPECFILE} --template ${in} --out ${out}
  if [[ $? -ne 0 ]] ; then RET=1 ; fi
}

case "${MODE}" in
  update)
    doit ndk $(dirname $0)/NeuralNetworks.t ${NDKDIR}/NeuralNetworks.h
    doit hal_1.0 ${HALDIR}/1.0/types.t ${HALDIR}/1.0/types.hal
    doit hal_1.1 ${HALDIR}/1.1/types.t ${HALDIR}/1.1/types.hal
    doit hal_1.2 ${HALDIR}/1.2/types.t ${HALDIR}/1.2/types.hal
    doit hal_1.3 ${HALDIR}/1.3/types.t ${HALDIR}/1.3/types.hal
    ;;
  ndk_hook)
    TEMPDIR=$(mktemp -d)
    doit ndk $(dirname $0)/NeuralNetworks.t ${TEMPDIR}/NeuralNetworks.h
    if [[ ${RET} -eq 0 ]] ; then
      ${DRYRUN} cmp -s ${NDKDIR}/NeuralNetworks.h ${TEMPDIR}/NeuralNetworks.h || {
        RET=1
        echo >&2 "Error: NeuralNetworks.h is out of sync with NeuralNetworks.t or types.spec. Please run generate_api.sh before uploading."
      }
    fi
    ;;
  *)
    echo >&2 "*** Unknown mode: ${MODE}"
    exit 1
    ;;
esac

if [[ ${RET} -ne 0 ]] ; then
  echo >&2 "*** FAILED"
fi
exit ${RET}