#!/usr/bin/env bash
# Genereert een Tampermonkey dev-loader voor een script uit deze repo.
# De stub bevat alleen metadata; de code komt via @require uit de repo-file,
# die daarmee de enige bron van waarheid blijft.
#
# Gebruik: bin/dev-stub <scriptmap> [--no-copy]
#   bin/dev-stub bipp-budgetcode
#   bin/dev-stub scripts/select-search --no-copy
set -euo pipefail

usage() {
  cat <<'USAGE'
Gebruik: bin/dev-stub <scriptmap> [opties]

  <scriptmap>        naam onder scripts/, of een pad naar de map

Opties:
  --no-copy, -n      niet naar het klembord, alleen naar stdout
  --list,    -l      toon de beschikbare scriptmappen
  --help,    -h      deze uitleg
USAGE
}

here="$(cd "$(dirname "$0")/.." && pwd)"
copy=1
target=""

while [ $# -gt 0 ]; do
  case "$1" in
    --no-copy|-n) copy=0 ;;
    --list|-l)
      for d in "$here"/scripts/*/; do
        [ -d "$d" ] && basename "$d"
      done
      exit 0
      ;;
    --help|-h) usage; exit 0 ;;
    -*) echo "dev-stub: onbekende optie: $1" >&2; usage >&2; exit 2 ;;
    *)
      if [ -n "$target" ]; then
        echo "dev-stub: geef één scriptmap op" >&2
        exit 2
      fi
      target="$1"
      ;;
  esac
  shift
done

if [ -z "$target" ]; then
  echo "dev-stub: geen scriptmap opgegeven" >&2
  usage >&2
  exit 2
fi

dir="$target"
[ -d "$dir" ] || dir="$here/scripts/$(basename "$target")"
if [ ! -d "$dir" ]; then
  echo "dev-stub: map niet gevonden: $target (zie --list)" >&2
  exit 1
fi
dir="$(cd "$dir" && pwd)"

src=""
for f in "$dir"/*.user.js; do
  [ -f "$f" ] && src="$f" && break
done
if [ -z "$src" ]; then
  echo "dev-stub: geen *.user.js in $dir" >&2
  echo "dev-stub: bij een script met een build: draai eerst ./build.sh" >&2
  exit 1
fi

# Heeft de map een build, dan wijst @require naar de bron in plaats van naar het
# gebouwde bestand: zo volstaat opslaan en de pagina herladen, zonder build.sh
# ertussen. De metadata blijft wel uit het gebouwde script komen, want de bron
# heeft geen ==UserScript==-blok.
code="$src"
if [ -f "$dir/src/$(basename "$dir").js" ]; then
  code="$dir/src/$(basename "$dir").js"
fi

# Eén metadataveld uit de kop van het echte script halen.
meta() {
  sed -n 's|^// @'"$1"'  *\(.*[^ ]\) *$|\1|p' "$src"
}

name="$(meta name | head -1)"
namespace="$(meta namespace | head -1)"
author="$(meta author | head -1)"

if [ -z "$name" ]; then
  echo "dev-stub: @name ontbreekt in $src" >&2
  exit 1
fi

# @downloadURL en @updateURL staan er allebei bewust NIET in. @updateURL none is geen
# oplossing: Tampermonkey markeert het ontbrekende @downloadURL dan in de editor, en de
# stub is lokaal, dus er is niets te downloaden of bij te werken.
{
  echo "// ==UserScript=="
  printf '// @name         %s\n' "$name"
  [ -n "$namespace" ] && printf '// @namespace    %s\n' "$namespace"
  # Vaste versie, losgekoppeld van het echte script. De code komt bij elke pagina-load
  # van schijf, dus een nummer hier zou hooguit suggereren dat er iets vastligt. De kolom
  # hoeft alleen -dev te tonen, en zo hoeft de stub niet mee met elke @version-bump.
  printf '// @version      0.0.0-dev\n'
  printf '// @description  Dev-loader. De code staat in de repo, dit bestand wijst er alleen naar.\n'
  [ -n "$author" ] && printf '// @author       %s\n' "$author"
  for key in match include exclude; do
    meta "$key" | while IFS= read -r value; do
      [ -n "$value" ] && printf '// @%-12s %s\n' "$key" "$value"
    done
  done
  # Bestaande externe @require en @resource eerst, want de code eronder rekent erop.
  meta require | while IFS= read -r value; do
    case "$value" in
      file://*) ;;
      "") ;;
      *) printf '// @%-12s %s\n' require "$value" ;;
    esac
  done
  meta resource | while IFS= read -r value; do
    [ -n "$value" ] && printf '// @%-12s %s\n' resource "$value"
  done
  printf '// @%-12s file://%s\n' require "$code"
  for key in grant connect run-at noframes; do
    meta "$key" | while IFS= read -r value; do
      [ -n "$value" ] && printf '// @%-12s %s\n' "$key" "$value"
    done
  done
  echo "// ==/UserScript=="
} > "$dir/.dev-stub.tmp"

cat "$dir/.dev-stub.tmp"
if [ "$copy" -eq 1 ] && command -v pbcopy >/dev/null 2>&1; then
  pbcopy < "$dir/.dev-stub.tmp"
  echo >&2
  echo "dev-stub: staat op het klembord" >&2
fi
rm -f "$dir/.dev-stub.tmp"
