#!/usr/bin/env bash

### Bash Environment Setup
# http://redsymbol.net/articles/unofficial-bash-strict-mode/
# https://www.gnu.org/software/bash/manual/html_node/The-Set-Builtin.html
# set -o xtrace
set -o errexit
set -o errtrace
set -o nounset
set -o pipefail
IFS=$'\n'

REPO_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && cd .. && pwd )"
cd "$REPO_DIR"

VERSION="$(grep '^version = ' "${REPO_DIR}/pyproject.toml" | awk -F'"' '{print $2}')"
FORMULA_FILE="$REPO_DIR/brew_dist/archivebox.rb"

echo "[+] Building Homebrew formula for archivebox==${VERSION}..."

# Create a temporary virtualenv for generating the formula
TMPDIR="$(mktemp -d)"
trap "rm -rf $TMPDIR" EXIT

python3 -m venv "$TMPDIR/venv"
source "$TMPDIR/venv/bin/activate"

pip install --quiet "archivebox==${VERSION}" homebrew-pypi-poet 2>/dev/null

echo "[+] Generating resource stanzas with homebrew-pypi-poet..."
RESOURCES="$(poet archivebox)"

# Get the sdist URL and SHA256 from PyPI JSON API (works on macOS and Linux)
SDIST_URL=""
SDIST_SHA256=""
PYPI_JSON="$(curl -fsSL "https://pypi.org/pypi/archivebox/${VERSION}/json" 2>/dev/null || echo '')"
if [ -n "$PYPI_JSON" ]; then
    SDIST_URL="$(echo "$PYPI_JSON" | python3 -c "import sys,json; d=json.load(sys.stdin); print(next((u['url'] for u in d['urls'] if u['packagetype']=='sdist'), ''))" 2>/dev/null || echo '')"
    SDIST_SHA256="$(echo "$PYPI_JSON" | python3 -c "import sys,json; d=json.load(sys.stdin); print(next((u['digests']['sha256'] for u in d['urls'] if u['packagetype']=='sdist'), ''))" 2>/dev/null || echo '')"
fi
if [ -z "$SDIST_URL" ]; then
    SDIST_URL="https://files.pythonhosted.org/packages/source/a/archivebox/archivebox-${VERSION}.tar.gz"
fi
if [ -z "$SDIST_SHA256" ]; then
    # Fallback: download and compute locally
    mkdir -p "$TMPDIR/sdist"
    pip download --no-binary :all: --no-deps -d "$TMPDIR/sdist" "archivebox==${VERSION}" 2>/dev/null || true
    SDIST_SHA256="$(shasum -a 256 "$TMPDIR/sdist/"*.tar.gz 2>/dev/null | awk '{print $1}' || echo '')"
fi

deactivate

echo "[+] Updating formula file: $FORMULA_FILE"

# Build the formula from the template
cat > "$FORMULA_FILE" << RUBY
# This formula is auto-generated by bin/build_brew.sh using homebrew-pypi-poet.
# To update: run bin/build_brew.sh, or trigger the GitHub Actions homebrew workflow.
#
# Users install with:
#   brew tap archivebox/archivebox
#   brew install archivebox

class Archivebox < Formula
  include Language::Python::Virtualenv

  desc "Self-hosted internet archiving solution"
  homepage "https://github.com/ArchiveBox/ArchiveBox"
  url "${SDIST_URL}"
  sha256 "${SDIST_SHA256}"
  license "MIT"
  head "https://github.com/ArchiveBox/ArchiveBox.git", branch: "dev"

  depends_on "python@3.13"
  depends_on "node"
  depends_on "git"
  depends_on "wget"
  depends_on "curl"
  depends_on "ripgrep"
  depends_on "yt-dlp"

  on_linux do
    depends_on "pkg-config" => :build
    depends_on "openssl@3"
    depends_on "libffi"
  end

  # Python dependency resource blocks auto-generated by homebrew-pypi-poet
  # AUTOGENERATED_RESOURCES_START
${RESOURCES}
  # AUTOGENERATED_RESOURCES_END

  def install
    virtualenv_install_with_resources
  end

  def post_install
    # Install runtime dependencies (plugins, JS extractors, etc.)
    (var/"archivebox").mkpath
    system({ "DATA_DIR" => var/"archivebox" }, bin/"archivebox", "install", "--binproviders", "pip,npm")
  end

  service do
    run [opt_bin/"archivebox", "server", "--quick-init", "0.0.0.0:8000"]
    keep_alive crashed: true
    working_dir var/"archivebox"
    log_path var/"log/archivebox.log"
    error_log_path var/"log/archivebox.log"
  end

  test do
    assert_match version.to_s, shell_output("#{bin}/archivebox version")
  end
end
RUBY

echo "[√] Formula updated: $FORMULA_FILE"
echo "    Version: ${VERSION}"
echo "    URL: ${SDIST_URL}"
