#!/bin/bash
set -euo pipefail

if [ $# -ne 1 ]; then
    echo "Usage: $0 <jar-directory>"
    exit 1
fi

JAR_DIR="$1"

if [ ! -d "$JAR_DIR" ]; then
    echo "ERROR: Directory does not exist: $JAR_DIR"
    exit 1
fi

if [ ! -w "$JAR_DIR" ]; then
    echo "ERROR: Directory is not writable: $JAR_DIR"
    exit 1
fi

JAR_FILES=(
    "com.vordel.rcp.policystudio_7.7.0.v20251209-1612.jar"
    "com.vordel.rcp.policystudio_7.7.0.v20260304-0928.jar"
    "com.vordel.rcp.policystudio_7.7.0.v20260529-1555.jar"
)

JAR_FILE=""
for candidate in "${JAR_FILES[@]}"; do
    if [ -f "$JAR_DIR/$candidate" ]; then
        JAR_FILE="$candidate"
        break
    fi
done

if [ -z "$JAR_FILE" ]; then
    echo "ERROR: No supported Policy Studio JAR found in $JAR_DIR"
    exit 1
fi

JAR_PATH="$JAR_DIR/$JAR_FILE"
XML_PATH="system/conf/migrate/Cache/3.xml"
SEARCH='maxElementsInMemory && maxElementsOnDisk != 0'
REPLACE='maxElementsInMemory && maxElementsOnDisk > 0'

TMPDIR=$(mktemp -d)
trap 'rm -rf "$TMPDIR"' EXIT

if [ ! -w "$JAR_PATH" ]; then
    echo "ERROR: JAR file is not writable: $JAR_PATH"
    exit 1
fi

if [ ! -f "${JAR_PATH}.bak" ]; then
    mv "$JAR_PATH" "${JAR_PATH}.bak"
    cp -p "${JAR_PATH}.bak" "$JAR_PATH"
fi

unzip -qq "$JAR_PATH" "$XML_PATH" -d "$TMPDIR"
XML_FILE="$TMPDIR/$XML_PATH"

if grep -qF "$REPLACE" "$XML_FILE"; then
    echo "INFO: Patch already present."
    exit 0
fi

if ! grep -qF "$SEARCH" "$XML_FILE"; then
    echo "ERROR: Expected text not found."
    exit 1
fi

sed -i 's|maxElementsInMemory && maxElementsOnDisk != 0|maxElementsInMemory \&\& maxElementsOnDisk > 0|g' "$XML_FILE"

(
  cd "$TMPDIR"
  zip -q -u "$JAR_PATH" "$XML_PATH"
)

echo "SUCCESS: Updated $JAR_PATH"
echo "Rollback:"
echo "  rm -f \"$JAR_PATH\""
echo "  mv -f \"${JAR_PATH}.bak\" \"$JAR_PATH\""
