#!/usr/bin/env bash
# bin/build-web — WASM/web build via Emscripten
#
# Produces build-web/index.{html,js,wasm} from src/ + web/shell.html.
# Requires emcc + emar (Emscripten SDK) on PATH.
#
# Usage:
#   bin/build-web

set -euo pipefail

SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_DIR="$(dirname "$SCRIPT_DIR")"

cd "$PROJECT_DIR"

SRC_DIR="src"
BUILD_DIR="build-web"
RAYLIB_SRC="deps/raylib/src"
RAYLIB_LIB="$BUILD_DIR/libraylib.a"

COMMON_INCS="-I$BUILD_DIR -I$RAYLIB_SRC -I$RAYLIB_SRC/external/glfw/include -Ideps/raygui/src"
DEFINES="-DPLATFORM_WEB -DGRAPHICS_API_OPENGL_ES2"
CFLAGS="-std=c99 -O2 $COMMON_INCS $DEFINES"

mkdir -p "$BUILD_DIR"

# --- Font header (same logic as Makefile) ---
FONT_HEADER="$BUILD_DIR/font_data.h"
FONT_FILE="$(find resources -maxdepth 1 -type f \( -iname '*.otf' -o -iname '*.ttf' \) -print -quit 2>/dev/null || true)"

if [ -n "$FONT_FILE" ] && command -v xxd >/dev/null 2>&1; then
    echo "  XXD    $(basename "$FONT_FILE") -> $FONT_HEADER"
    xxd -i "$FONT_FILE" > "$FONT_HEADER.tmp"
    VARNAME="$(grep -oP 'unsigned char \K[a-zA-Z0-9_]+' "$FONT_HEADER.tmp" | head -1)"
    sed -i "s/${VARNAME}/embedded_font_data/g" "$FONT_HEADER.tmp"
    echo '#define FONT_EMBEDDED 1' >> "$FONT_HEADER.tmp"
    mv "$FONT_HEADER.tmp" "$FONT_HEADER"
else
    echo "  INFO   No font file or xxd unavailable — using default font"
    printf '/* No font embedded */\nstatic unsigned char embedded_font_data[] = {0};\nstatic unsigned int embedded_font_data_len = 0;\n#define FONT_EMBEDDED 0\n' > "$FONT_HEADER"
fi

# --- Build raylib for web ---
RAYLIB_SRCS="$RAYLIB_SRC/rcore.c $RAYLIB_SRC/rshapes.c $RAYLIB_SRC/rtextures.c $RAYLIB_SRC/rtext.c $RAYLIB_SRC/rmodels.c $RAYLIB_SRC/raudio.c"
RAYLIB_OBJS=""
for src in $RAYLIB_SRCS; do
    obj="$BUILD_DIR/raylib_$(basename "${src%.c}").o"
    echo "  CC     $src"
    emcc $CFLAGS -w -c -o "$obj" "$src"
    RAYLIB_OBJS="$RAYLIB_OBJS $obj"
done

echo "  AR     $RAYLIB_LIB"
emar rcs "$RAYLIB_LIB" $RAYLIB_OBJS

# --- Build application ---
APP_SRCS="$(find "$SRC_DIR" -name '*.c')"
APP_OBJS=""
for src in $APP_SRCS; do
    obj="$BUILD_DIR/$(basename "${src%.c}").o"
    echo "  CC     $src"
    emcc $CFLAGS -Wall -Wextra -c -o "$obj" "$src"
    APP_OBJS="$APP_OBJS $obj"
done

# --- Link ---
SHELL_HTML="web/shell.html"
if [ ! -f "$SHELL_HTML" ]; then
    echo "Error: $SHELL_HTML not found" >&2
    exit 1
fi

echo "  LINK   $BUILD_DIR/index.html"
emcc $CFLAGS -o "$BUILD_DIR/index.html" $APP_OBJS "$RAYLIB_LIB" \
    -s USE_GLFW=3 \
    -s WASM=1 \
    -s ASYNCIFY \
    -s SHELL_FILE="$PWD/$SHELL_HTML" \
    -s EXPORTED_FUNCTIONS='["_main","_load_file_web"]' \
    -s EXPORTED_RUNTIME_METHODS='["ccall","cwrap"]' \
    --preload-file resources \
    "$@"

echo "Build complete: $BUILD_DIR/index.html"
