#!/usr/bin/env bash
set -euo pipefail

SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
REPO_ROOT="$(cd "${SCRIPT_DIR}/.." && pwd)"
CONFIG_FILE="${REPO_ROOT}/docs.yml"
README_TEMPLATE="${REPO_ROOT}/README.md.tmpl"
README_OUTPUT="${REPO_ROOT}/README.md"

usage() {
    cat <<'USAGE'
Usage: scripts/render-docs [--check]

Render generated Markdown docs from repo-local templates.

Options:
  --check   fail if generated docs differ from committed output
USAGE
}

read_config_value() {
    local key="$1"

    awk -F ':' -v key="${key}" '
        $1 == key {
            value = $0
            sub("^[^:]*:[[:space:]]*", "", value)
            gsub(/^[[:space:]"'"'"']+|[[:space:]"'"'"']+$/, "", value)
            print value
            found = 1
            exit
        }
        END {
            if (!found) {
                exit 1
            }
        }
    ' "${CONFIG_FILE}"
}

render_readme() {
    local main_script="$1"

    if grep -Eo '{{[[:space:]]*[A-Za-z_][A-Za-z0-9_]*[[:space:]]*}}' "${README_TEMPLATE}" |
        grep -Evq '{{[[:space:]]*main_script[[:space:]]*}}'; then
        printf 'Unsupported template variable in %s\n' "${README_TEMPLATE}" >&2
        return 1
    fi

    sed "s/{{[[:space:]]*main_script[[:space:]]*}}/${main_script}/g" "${README_TEMPLATE}"
}

main() {
    local mode="render"
    local main_script
    local rendered

    case "${1:-}" in
        "")
            ;;
        --check)
            mode="check"
            ;;
        -h | --help)
            usage
            return 0
            ;;
        *)
            usage >&2
            return 2
            ;;
    esac

    if [[ ! -s "${CONFIG_FILE}" ]]; then
        printf 'Missing docs config: %s\n' "${CONFIG_FILE}" >&2
        return 1
    fi
    if [[ ! -s "${README_TEMPLATE}" ]]; then
        printf 'Missing README template: %s\n' "${README_TEMPLATE}" >&2
        return 1
    fi

    main_script="$(read_config_value main_script)"
    if [[ -z "${main_script}" ]]; then
        printf 'docs.yml main_script must not be empty\n' >&2
        return 1
    fi

    rendered="$(mktemp)"
    render_readme "${main_script}" >"${rendered}"

    if [[ "${mode}" == "check" ]]; then
        if ! cmp -s "${rendered}" "${README_OUTPUT}"; then
            printf 'Generated README.md is stale. Run scripts/render-docs.\n' >&2
            diff -u "${README_OUTPUT}" "${rendered}" || true
            rm -f "${rendered}"
            return 1
        fi
        printf 'docs are current\n'
        rm -f "${rendered}"
        return 0
    fi

    mv "${rendered}" "${README_OUTPUT}"
    printf 'Rendered %s from %s\n' "${README_OUTPUT}" "${README_TEMPLATE}"
}

main "$@"
