#!/bin/bash -eu
# SPDX-FileCopyrightText: 2025 Bart van de Lint
# SPDX-License-Identifier: MPL-2.0

# This script updates Julia packages, creating a version-specific Manifest file.
# It checks for a local Python/Matplotlib installation and can use Julia's
# Conda as a fallback.
#
# Usage:
#   ./update_script.sh              # Uses the default Julia version
#   ./update_script.sh +1.12        # Uses Julia v1.12
#   ./update_script.sh --default    # Creates a .default manifest copy

# --- 1. Argument Parsing and Version Determination ---
make_default=false
julia_channel_arg=""

# Loop through all arguments to find our specific flags
for arg in "$@"; do
  case $arg in
    --default)
      make_default=true
      ;;
    +*)
      julia_channel_arg=$arg
      ;;
  esac
done

julia_major=""
if [[ -n "$julia_channel_arg" ]]; then
    # Use version from +<version> argument
    julia_major="${julia_channel_arg#+}"
else
    # Fallback to the default julia version
    julia_major=$(julia --version | cut -d' ' -f3 | cut -d'.' -f1,2)
fi

# Construct the Julia command, including the version specifier if provided
JULIA_CMD="julia"
if [[ -n "$julia_channel_arg" ]]; then
    JULIA_CMD="julia $julia_channel_arg"
fi
echo "Targeting Julia v${julia_major}..."

# --- 2. Backup Existing Manifest Files ---
echo "Preparing to update packages..."
export JULIA_PKG_SERVER_REGISTRY_PREFERENCE="eager"
MANIFEST_VERSION_FILE="Manifest-v${julia_major}.toml"
mv -f Manifest.toml ${MANIFEST_VERSION_FILE} 2>/dev/null || true
mv -f $MANIFEST_VERSION_FILE "$MANIFEST_VERSION_FILE.bak" 2>/dev/null || true
touch $MANIFEST_VERSION_FILE
ls Manifest* 2>/dev/null || echo "No Manifest files found."

# --- 3. Update Julia Packages ---
echo "Adding/updating Julia packages. This may take a while..."
$JULIA_CMD --startup-file=no --project=test -e '
    using Pkg
    Pkg.resolve()
    println("--> Running package update...");
    Pkg.update();
    println("Package update complete.");
'
echo "✅ Update successful. New manifest created at ${MANIFEST_VERSION_FILE}"
ls Manifest* 2>/dev/null || echo "No Manifest files found."

# --- 4. Create Default Manifest if requested ---
if [ "$make_default" = true ]; then
  DEFAULT_FILE="${MANIFEST_VERSION_FILE}.default"
  cp "$MANIFEST_VERSION_FILE" "$DEFAULT_FILE"
  echo "✅ Default manifest created at ${DEFAULT_FILE}"
fi
ls Manifest* 2>/dev/null || echo "No Manifest files found."
