#!/bin/sh
# Compile a small program with the Scala.js plugin for scalac 2.13, link it
# with scalajs-link (fastLinkJS and fullLinkJS settings), and run it with
# Node.js when available.
# Usage: hello-link [build dir]   (no argument: test the installed packages)
set -eu

J=${SCALA_JARS:-/usr/share/java}
SC213="$J/scala-compiler-2.13.jar:$J/scala-reflect-2.13.jar:$J/scala-library-2.13.jar"
ASM=/usr/share/maven-repo/org/scala-lang/modules/scala-asm/debian/scala-asm-debian.jar
if [ $# -ge 1 ]; then
  B=$1
  PLUGIN=$B/jars/scalajs-compiler_2.13.18.jar
  LIBS="$B/jars/scalajs-library_2.13.jar $B/jars/scalajs-javalib.jar $B/jars/scalajs-scalalib_2.13.jar"
  JIL=$B/jars/scalajs-javalib-intf.jar
  link() { java -cp "$B/jars/scalajs-link.jar:$B/jars/scalajs-linker_2.13.jar:$B/jars/scalajs-linker-interface_2.13.jar:$B/jars/scalajs-ir_2.13.jar:$B/jars/scalajs-logging_2.13.jar:$J/scala-library-2.13.jar" org.debian.scalajs.Link "$@"; }
else
  PLUGIN=$J/scalajs-compiler.jar
  LIBS="$J/scalajs-library.jar $J/scalajs-javalib.jar $J/scalajs-scalalib.jar"
  JIL=$J/scalajs-javalib-intf.jar
  link() { scalajs-link "$@"; }
fi

W=$(mktemp -d)
trap 'rm -rf "$W"' EXIT
mkdir -p "$W/src" "$W/classes"
cat > "$W/src/Hello.scala" <<'EOF'
import scala.scalajs.js

object Hello {
  def main(args: Array[String]): Unit = {
    val xs = List(1, 2, 3).map(_ * 2)
    println(s"Hello from Scala.js, sum ${xs.sum}, ${java.lang.Integer.toHexString(255)}")
    js.Dynamic.global.console.log(js.Array(1, 2, 3).map((x: Int) => x * x).join(","))
  }
}
EOF

java -cp "$SC213:$ASM" scala.tools.nsc.Main -Xplugin:"$PLUGIN" -Xplugin-require:scalajs \
  -classpath "$J/scala-library-2.13.jar:$(echo $LIBS | tr ' ' ':'):$JIL" -d "$W/classes" "$W/src/Hello.scala"
test -f "$W/classes/Hello\$.sjsir"

link -q -o "$W/fast" -m Hello "$W/classes" $LIBS
link -q --full --minify -o "$W/full" -m Hello "$W/classes" $LIBS
test -s "$W/fast/main.js"
test -s "$W/full/main.js"
grep -q 'Hello from Scala.js' "$W/fast/main.js"

if command -v node >/dev/null 2>&1; then
  for v in fast full; do
    out=$(node "$W/$v/main.js")
    echo "$v: $out"
    [ "$out" = "Hello from Scala.js, sum 12, ff
1,4,9" ]
  done
else
  echo "node not found: linked, not run"
fi
echo "hello-link: OK"
