#!/bin/bash
#
# Purpose: Check for available version updates in binaries.conf and compile.conf

SCRIPT_DIR=$(dirname "$(realpath "$0")")
HAMPACK_DIR="${HAMPACK_DIR:-$SCRIPT_DIR}"
BINARIES_CONF="${HAMPACK_BINARIES_CONF:-$HAMPACK_DIR/binaries.conf}"
COMPILE_CONF="${HAMPACK_COMPILE_CONF:-$HAMPACK_DIR/compile.conf}"

# Extract "owner/repo" from a GitHub URL, or empty string if not GitHub
github_repo_from_url() {
  local url="$1"
  if [[ "$url" =~ github\.com/([^/]+)/([^/]+) ]]; then
    echo "${BASH_REMATCH[1]}/${BASH_REMATCH[2]%.git}"
  fi
}

# Fetch latest release tag via GitHub API, stripping leading "v"
github_latest() {
  local repo="$1"
  curl -sf "https://api.github.com/repos/$repo/releases/latest" \
    | grep '"tag_name"' \
    | sed 's/.*"tag_name": *"\([^"]*\)".*/\1/' \
    | sed 's/^v//'
}

print_result() {
  local app="$1"
  local pinned="$2"
  local latest="$3"
  local manual_url="$4"

  if [ -n "$manual_url" ]; then
    printf "  %-20s pinned=%-15s  (manual check: %s)\n" "$app" "$pinned" "${manual_url%/*}"
  elif [ -z "$latest" ]; then
    printf "  %-20s pinned=%-15s  (GitHub API unavailable)\n" "$app" "$pinned"
  elif [ "$pinned" = "$latest" ]; then
    printf "  %-20s up to date (%s)\n" "$app" "$pinned"
  else
    printf "  %-20s pinned=%-15s  latest=%-15s  ** UPDATE AVAILABLE **\n" "$app" "$pinned" "$latest"
  fi
}

check_app() {
  local app="$1"
  local version="$2"
  local url="$3"   # git= or url= field (may be GitHub)
  local fallback="$4"  # wget= or non-GitHub url for manual check

  [ -z "$app" ] || [ -z "$version" ] && return

  local gh_repo
  gh_repo=$(github_repo_from_url "$url")

  if [ -n "$gh_repo" ]; then
    print_result "$app" "$version" "$(github_latest "$gh_repo")" ""
  else
    print_result "$app" "$version" "" "${fallback:-$url}"
  fi
}

check_binaries() {
  echo "=== binaries.conf ==="
  local app="" version="" url=""

  while IFS= read -r line || [ -n "$line" ]; do
    [[ -z "$line" || "$line" == \#* ]] && continue

    if [[ "$line" =~ ^\[(.+)\]$ ]]; then
      check_app "$app" "$version" "$url" ""
      app="${BASH_REMATCH[1]}" version="" url=""
      continue
    fi

    local key="${line%%=*}" value="${line#*=}"
    case "$key" in
      version) version="$value" ;;
      url)     url="$value" ;;
    esac
  done < "$BINARIES_CONF"

  check_app "$app" "$version" "$url" ""
}

check_compiled() {
  echo ""
  echo "=== compile.conf ==="
  local app="" version="" git_url="" wget_url=""

  while IFS= read -r line || [ -n "$line" ]; do
    [[ -z "$line" || "$line" == \#* ]] && continue

    if [[ "$line" =~ ^\[(.+)\]$ ]]; then
      check_app "$app" "$version" "$git_url" "$wget_url"
      app="${BASH_REMATCH[1]}" version="" git_url="" wget_url=""
      continue
    fi

    local key="${line%%=*}" value="${line#*=}"
    case "$key" in
      version) version="$value" ;;
      git)     git_url="$value" ;;
      wget)    wget_url="$value" ;;
    esac
  done < "$COMPILE_CONF"

  check_app "$app" "$version" "$git_url" "$wget_url"
}

# --- Main ---

for conf in "$BINARIES_CONF" "$COMPILE_CONF"; do
  if [ ! -f "$conf" ]; then
    echo "Error: $conf not found."
    exit 1
  fi
done

echo "Checking HamPack application versions..."
check_binaries
check_compiled
echo ""
echo "Done."
