#!/bin/bash

updated_pkgs=""
skipped_pkgs=""
accepted_count=0
rejected_count=0
file_count=0

# Cache outdated versions (installed packages only)
cachefile=$(mktemp)
pip list --outdated --format=json > "$cachefile"

get_latest_version() {
  pkg="$1"
  python -c "import json; d=json.load(open('$cachefile')); print(next((p['latest_version'] for p in d if p['name'].lower() == '$pkg'.lower()), ''))"
}

filelist=$(mktemp)
find . -type f -name "requirements-test.txt" > "$filelist"

while read file; do
  file_count=$((file_count + 1))
  tmpfile=$(mktemp)

  while IFS= read -r line || [[ -n "$line" ]]; do
    stripped=$(echo "$line" | sed 's/[[:space:]]*#.*$//' | tr -d '\r' | tr -d '[:space:]')
    [[ -z "$stripped" || "$stripped" == -r* ]] && echo "$line" >> "$tmpfile" && continue

    if [[ "$stripped" =~ ^([a-zA-Z0-9_\-]+)(==|~=)([0-9a-zA-Z\.\-]+)$ ]]; then
      pkg="${BASH_REMATCH[1]}"
      operator="${BASH_REMATCH[2]}"
      ver="${BASH_REMATCH[3]}"

      if echo "$skipped_pkgs" | grep -qw "$pkg"; then
        echo "$line" >> "$tmpfile"
        continue
      fi

      latest=$(get_latest_version "$pkg")

      if [[ -n "$latest" && "$ver" != "$latest" ]]; then
        if ! echo "$updated_pkgs" | grep -qw "$pkg"; then
          echo "$pkg: $operator$ver → $operator$latest ($file)"
          echo -n "Install $pkg==$latest? [Y/N]: " > /dev/tty
          read answer < /dev/tty
          if [[ "$answer" =~ ^[Yy]$ ]]; then
            pip install "$pkg==$latest"
            updated_pkgs="$updated_pkgs $pkg"
            accepted_count=$((accepted_count + 1))
            line="$pkg$operator$latest"
          else
            skipped_pkgs="$skipped_pkgs $pkg"
            rejected_count=$((rejected_count + 1))
          fi
        elif echo "$updated_pkgs" | grep -qw "$pkg"; then
          line="$pkg$operator$latest"
        fi
      fi
    fi

    echo "$line" >> "$tmpfile"
  done < "$file"

  mv "$tmpfile" "$file"
done < "$filelist"

rm "$filelist"
rm "$cachefile"

echo
echo "📄 Files scanned: $file_count"
echo "✅ Updates accepted: $accepted_count"
echo "❌ Updates rejected: $rejected_count"
