#!/bin/sh
# Download only explicitly selected extensions. Never changes editor settings.
set -eu
usage() {
  printf '%s\n' 'Usage: sh install.sh [--code code|cursor] EXTENSION ...' 'Extensions: markdown-inline minimal-theme file-actions jump' 'Use --all to explicitly select all four.'
}
editor_cli=code
if [ "${1:-}" = '--code' ]; then
  [ "$#" -ge 3 ] || { usage >&2; exit 2; }
  editor_cli=$2
  shift 2
fi
[ "$#" -gt 0 ] || { usage; exit 2; }
if [ "$1" = '--all' ]; then
  [ "$#" -eq 1 ] || { usage >&2; exit 2; }
  set -- markdown-inline minimal-theme file-actions jump
fi
package_info() {
  case "$1" in
    minimal-theme) package_file='damln.minimal-theme-0.6.1.vsix'; package_hash='112bee6701e225d03932a47b329a6ea4af02e5a8750ac778e233791fd343549d' ;;
    file-actions) package_file='damln.file-actions-0.3.2.vsix'; package_hash='d6db16bc8f562933c169ae4a763c9dde217bbaff756646aa1493601e951ffd03' ;;
    markdown-inline) package_file='damln.markdown-inline-0.8.8.vsix'; package_hash='22de7aa32ae37ca2a0d74f13beb906216e31f6796bbc736dd8c5b5e0a6821f74' ;;
    jump) package_file='damln.jump-0.8.4.vsix'; package_hash='e7cbfc3d97fc25c01d2b2c2458478cac62c7837a6f15b5e584665ab29e0789c7' ;;
    *) printf 'Unknown extension: %s\n' "$1" >&2; return 2 ;;
  esac
}
# Validate the complete request before installing anything.
for extension in "$@"; do package_info "$extension" >/dev/null; done
if ! command -v "$editor_cli" >/dev/null 2>&1; then
  if [ "$editor_cli" = code ] && [ -x '/Applications/Visual Studio Code.app/Contents/Resources/app/bin/code' ]; then
    editor_cli='/Applications/Visual Studio Code.app/Contents/Resources/app/bin/code'
  else
    printf 'Editor CLI not found: %s. Add it to PATH or use --code.\n' "$editor_cli" >&2
    exit 1
  fi
fi
work_dir=$(mktemp -d)
trap 'rm -rf "$work_dir"' 0
trap 'exit 1' HUP INT TERM
# Download and verify every selected package before invoking the editor.
for extension in "$@"; do
  package_info "$extension"
  curl -fsSL "https://damln.com/tools/vscode/download/$package_file" -o "$work_dir/$package_file"
  if command -v sha256sum >/dev/null 2>&1; then
    actual_hash=$(sha256sum "$work_dir/$package_file" | awk '{print $1}')
  else
    actual_hash=$(shasum -a 256 "$work_dir/$package_file" | awk '{print $1}')
  fi
  [ "$actual_hash" = "$package_hash" ] || { printf 'Checksum verification failed: %s\n' "$extension" >&2; exit 1; }
done
for extension in "$@"; do
  package_info "$extension"
  "$editor_cli" --install-extension "$work_dir/$package_file"
done
