#source <(curl -fsSL https://git.community-scripts.org/community-scripts/ProxmoxVED/raw/branch/main/misc/build.func)

get_gh_release() {
  local repo="$1"
  local app="${repo##*/}"
  local api_url="https://api.github.com/repos/$repo/releases/latest"
  local header=()
  local attempt=0
  local max_attempts=3
  local api_response tag

  echo "🔍 Checking latest release for: $repo"

  [[ -n "${GITHUB_TOKEN:-}" ]] && header=(-H "Authorization: token $GITHUB_TOKEN")

  until [[ $attempt -ge $max_attempts ]]; do
    ((attempt++))
    $STD msg_info "[$attempt/$max_attempts] Fetching GitHub release for $repo...\n"

    if ! api_response=$(curl -fsSL "${header[@]}" "$api_url"); then
      $STD msg_info "Request failed, retrying...\n"
      sleep 2
      continue
    fi

    if echo "$api_response" | grep -q "API rate limit exceeded"; then
      msg_error "GitHub API rate limit exceeded."
      return 1
    fi

    if echo "$api_response" | jq -e '.message == "Not Found"' &>/dev/null; then
      msg_error "Repository not found: $repo"
      return 1
    fi

    tag=$(echo "$api_response" | jq -r '.tag_name // .name // empty')
    [[ "$tag" =~ ^v[0-9] ]] && tag="${tag:1}"

    if [[ -z "$tag" ]]; then
      $STD msg_info "Empty tag received, retrying...\n"
      sleep 2
      continue
    fi

    $STD msg_ok "Found release: $tag for $repo"
    echo "$tag"
    return 0
  done

  msg_error "Failed to fetch release for $repo after $max_attempts attempts."
  return 1
}

fetch_and_extract_gh_release() {
  set -Eeuo pipefail
  trap 'echo -e "\n❌ [fetch_and_extract_gh_release] Error on line $LINENO: $BASH_COMMAND"' ERR

  local repo="$1"
  local tag="$2"
  local app="${repo##*/}"

  local temp_file
  temp_file=$(mktemp)
  local tarball_url="https://github.com/$repo/archive/refs/tags/v$tag.tar.gz"

  msg_info "Downloading tarball for $app from $tarball_url..."
  if ! curl -fsSL "$tarball_url" -o "$temp_file"; then
    msg_error "Failed to download tarball: $tarball_url"
    return 1
  fi

  mkdir -p "/opt/$app"
  echo "📦 Extracting tarball to /opt/$app..."
  tar -xzf "$temp_file" -C /opt
  mv "/opt/${app}-${tag}"/* "/opt/$app/" 2>/dev/null || msg_warn "Could not move extracted files."
  rm -rf "/opt/${app}-${tag}"

  msg_ok "Extracted $app to /opt/$app"
}
