#!/usr/bin/env sh
set -eu

ROOT_DIR="$(CDPATH= cd -- "$(dirname -- "$0")/.." && pwd)"
cd "$ROOT_DIR"

PACKAGE="examples/showcase/web_wasm"
TARGET="wasm-gc"
WATCH=false
INTERVAL=1

usage() {
  printf 'Usage: %s [--package <dir>] [--target <target>] [--watch] [--interval <seconds>]\n' "$0"
  printf '\n'
  printf 'Builds a preview package once, or rebuilds it when MoonBit/docs inputs change.\n'
  printf 'Default package: examples/showcase/web_wasm\n'
}

while [ "$#" -gt 0 ]; do
  case "$1" in
    --package)
      shift
      PACKAGE="$1"
      ;;
    --target)
      shift
      TARGET="$1"
      ;;
    --watch)
      WATCH=true
      ;;
    --interval)
      shift
      INTERVAL="$1"
      ;;
    --help|-h)
      usage
      exit 0
      ;;
    *)
      printf 'Unknown argument: %s\n' "$1" >&2
      usage >&2
      exit 2
      ;;
  esac
  shift
done

snapshot_inputs() {
  find moui moui_skia examples website docs resource skills scripts README.md AGENTS.md moon.work -type f \
    \( -name '*.mbt' -o -name '*.mbti' -o -name '*.json' -o -name '*.md' -o -name '*.html' -o -name '*.js' -o -name '*.css' -o -name '*.sh' -o -name '*.mjs' -o -name 'moon.work' \) \
    -print0 2>/dev/null | {
      case "$(uname -s)" in
        Darwin|FreeBSD|OpenBSD|NetBSD)
          xargs -0 stat -f '%m %N' 2>/dev/null
          ;;
        *)
          xargs -0 stat -c '%Y %n' 2>/dev/null
          ;;
      esac
    } | sort
}

build_preview() {
  if [ "$PACKAGE" = "website/web_wasm" ]; then
    printf '\n==> node scripts/sync-website-docs.mjs\n'
    node scripts/sync-website-docs.mjs
  fi
  printf '\n==> moon build %s --target %s\n' "$PACKAGE" "$TARGET"
  moon build "$PACKAGE" --target "$TARGET"
  printf 'Preview build ready: %s (%s)\n' "$PACKAGE" "$TARGET"
}

build_preview

if ! "$WATCH"; then
  exit 0
fi

printf '\nWatching for changes every %s second(s). Press Ctrl-C to stop.\n' "$INTERVAL"
LAST_SNAPSHOT="$(snapshot_inputs)"
while :; do
  sleep "$INTERVAL"
  NEXT_SNAPSHOT="$(snapshot_inputs)"
  if [ "$NEXT_SNAPSHOT" != "$LAST_SNAPSHOT" ]; then
    LAST_SNAPSHOT="$NEXT_SNAPSHOT"
    build_preview
  fi
done