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

# Update vendor libraries (bpmn-js and dmn-js) from npm registry.
# Downloads pre-built npm packages (which include dist/) and keeps only
# the files needed to run the plugin.
# Usage: ./update-vendor.sh

SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
VENDOR_DIR="$SCRIPT_DIR/vendor"
TMP_DIR=$(mktemp -d)
trap 'rm -rf "$TMP_DIR"' EXIT

# Files/dirs to keep from the npm package
KEEP_PATTERNS=(dist package.json LICENSE README.md CHANGELOG.md)

update_library() {
    local name="$1"
    local version="$2"
    local dest="$VENDOR_DIR/$name"

    local tarball_url="https://registry.npmjs.org/${name}/-/${name}-${version}.tgz"
    echo "Updating $name to $version from $tarball_url ..."

    local archive="$TMP_DIR/$name.tgz"
    curl -sL "$tarball_url" -o "$archive"

    local extract_dir="$TMP_DIR/$name-extract"
    mkdir -p "$extract_dir"
    # npm tarballs extract to a package/ directory
    tar xzf "$archive" -C "$extract_dir"

    local src_dir="$extract_dir/package"
    if [[ ! -d "$src_dir" ]]; then
        echo "ERROR: Could not find extracted package/ directory for $name"
        return 1
    fi

    # Preserve url.txt
    local url_backup="$TMP_DIR/${name}_url.txt"
    cp "$dest/url.txt" "$url_backup"

    # Remove old vendor dir and recreate with only needed files
    rm -rf "$dest"
    mkdir -p "$dest"

    for pattern in "${KEEP_PATTERNS[@]}"; do
        if [[ -e "$src_dir/$pattern" ]]; then
            cp -r "$src_dir/$pattern" "$dest/$pattern"
        fi
    done

    # Restore url.txt and update version references
    cp "$url_backup" "$dest/url.txt"

    # Rename .css to .less so DokuWiki's LESS compiler inlines them.
    # DokuWiki's default nginx config blocks /vendor/ paths (403), so CSS
    # @import directives for .css files would fail at runtime.
    find "$dest" -name '*.css' -exec bash -c 'mv "$1" "${1%.css}.less"' _ {} \;

    echo "Updated $name to $version successfully."
}

get_version() {
    local name="$1"
    local url_file="$VENDOR_DIR/$name/url.txt"

    if [[ ! -f "$url_file" ]]; then
        echo "ERROR: $url_file not found" >&2
        return 1
    fi

    # Extract version from the npm URL in url.txt (e.g. ...@18.14.0/)
    local version
    version=$(grep -oP "${name}@\K[0-9]+\.[0-9]+\.[0-9]+" "$url_file" | head -1)

    if [[ -z "$version" ]]; then
        echo "ERROR: Could not extract version for $name from $url_file" >&2
        return 1
    fi

    echo "$version"
}

bpmn_version=$(get_version "bpmn-js")
dmn_version=$(get_version "dmn-js")

update_library "bpmn-js" "$bpmn_version"
update_library "dmn-js" "$dmn_version"

echo ""
echo "Done. Updated bpmn-js to $bpmn_version and dmn-js to $dmn_version."
