#!/usr/bin/env bash
#
# Copyright (c) 2020-2023 by the Zeek Project. See LICENSE for details.
#
# This script regenerates documentation files. Running it again a `main`
# commit should not produce any changes.

set -o errexit
set -o nounset

ROOTDIR="$(cd "$( dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)/../.."
BUILDDIR="${ROOTDIR}/build"
SPICYDOC="${BUILDDIR}/bin/spicy-doc"
SPICYDTR="${ROOTDIR}/doc/scripts/spicy-doc-to-rst"
AUTOGEN_FINAL="${ROOTDIR}/doc/autogen"
AUTOGEN_STAGE=$(mktemp -d -t spicy-autogen-docs.XXXXXXXXXX)

if ! command -v rsync >/dev/null 2>&1; then
    >&2 echo "Warning: Need rsync to run autogen-docs, aborting"
    exit 0
fi

if [[ ! -x ${BUILDDIR}/bin/spicy-doc ]]; then
    >&2 echo "Warning: Could not find required executable ${BUILDDIR}/bin/spicy-doc, aborting"
    exit 0
fi

trap "rm -rf '${AUTOGEN_STAGE}'" EXIT
rm -rf "${AUTOGEN_STAGE}" && mkdir -p "${AUTOGEN_STAGE}"

"${ROOTDIR}/doc/scripts/autogen-spicy-lib" functions spicy < "${ROOTDIR}/spicy/lib/spicy.spicy"        > "${AUTOGEN_STAGE}/spicy-functions.spicy" || exit 1
"${ROOTDIR}/doc/scripts/autogen-spicy-lib" types     spicy < "${ROOTDIR}/spicy/lib/spicy.spicy"        > "${AUTOGEN_STAGE}/spicy-types.spicy" || exit 1
"${ROOTDIR}/doc/scripts/autogen-spicy-lib" types     spicy < "${ROOTDIR}/spicy/lib/filter.spicy"       > "${AUTOGEN_STAGE}/filter-types.spicy" || exit 1

# Include these namespaces into the autogenerated type reference.
SPICY_TYPES=address,bitfield,bool,bytes,enum,exception,integer,interval,list,map,optional,port,real,regexp,set,sink,stream,string,struct,time,tuple,unit,vector
("${SPICYDOC}" | ${SPICYDTR} -t "${SPICY_TYPES}" -d "${AUTOGEN_STAGE}/types") || exit 1

# Create list of reserved keywords.
cat ${ROOTDIR}/spicy/toolchain/src/compiler/parser/scanner.ll \
    | grep "return.*token::" \
    | grep '^[a-zA-Z_]\{2,\}' \
    | awk '{print $1}' \
    | sort >${AUTOGEN_STAGE}/reserved-keywords.txt

# All done, move staged files to final location where changed.
    # "-rlpgo" is "-a" minus "-tD".
mkdir -p "${AUTOGEN_FINAL}" && \
    rsync -rlpgo --update --checksum --omit-dir-times --itemize-changes --out-format='Updating %n' "${AUTOGEN_STAGE}/" "${AUTOGEN_FINAL}"
