#!/bin/sh

THISDIR=$(cd "$(dirname "$0")" && pwd)
CONFIG_LOG="$THISDIR/config.log"
MAKE=$("${R_HOME}/bin/R" CMD config MAKE)
CC=$("${R_HOME}/bin/R" CMD config CC | awk '{print $1}')
AR=$("${R_HOME}/bin/R" CMD config AR | awk '{print $1}')
TINYCC_SRC="$THISDIR/src/tinycc"
TINYCC_DEST="$THISDIR/inst/tinycc"

: > "$CONFIG_LOG"

log() {
    printf '%s\n' "$1" | tee -a "$CONFIG_LOG"
}

run_logged() {
    log "RUN: $*"
    "$@" >> "$CONFIG_LOG" 2>&1
}

cleanup_source() {
    if [ -d "$TINYCC_SRC" ]; then
        log "Removing temporary source tree: $TINYCC_SRC"
        rm -rf "$TINYCC_SRC" >> "$CONFIG_LOG" 2>&1 || true
    fi
}

trap cleanup_source EXIT

log "Starting configure for Rtinycc"
log "Package source directory: $THISDIR"
log "TinyCC source directory: $TINYCC_SRC"
log "TinyCC install directory: $TINYCC_DEST"

log "Unpacking vendored TinyCC source"
run_logged "${R_HOME}/bin/Rscript" "$THISDIR/tools/vendortinycc.R" unpack || exit 1

if [ ! -d "$TINYCC_SRC" ]; then
    log "ERROR: TinyCC source directory not found after unpack"
    exit 1
fi

if [ -d "$TINYCC_DEST" ]; then
    log "Removing existing TinyCC installation"
    rm -rf "$TINYCC_DEST" >> "$CONFIG_LOG" 2>&1 || exit 1
fi
run_logged mkdir -p "$TINYCC_DEST/lib" "$TINYCC_DEST/include" || exit 1

cd "$TINYCC_SRC" || exit 1
log "Building TinyCC in $PWD"

if [ "$(uname)" = "Darwin" ]; then
    log "Removing -flat_namespace from TinyCC Makefile for macOS"
    run_logged sed -i '' -e 's/-flat_namespace//g' "$TINYCC_SRC/Makefile" || exit 1
    SHLIB=libtcc.dylib
else
    SHLIB=libtcc.so
fi
log "Selected shared library target: $SHLIB"

run_logged ./configure \
    --prefix="$TINYCC_DEST" \
    --cc="$CC" \
    --ar="$AR" \
    --extra-cflags=-fPIC \
    --debug || exit 1

run_logged "$MAKE" CONFIG_static=no libtcc.a "$SHLIB" libtcc1.a tcc || exit 1
run_logged "$MAKE" install || exit 1

LIBTCC1_SRC=$(find "$TINYCC_SRC" -name 'libtcc1.a' | head -n 1)
if [ -n "$LIBTCC1_SRC" ]; then
    run_logged mkdir -p "$TINYCC_DEST/lib/tcc" || exit 1
    run_logged cp "$LIBTCC1_SRC" "$TINYCC_DEST/lib/tcc/" || true
else
    log "WARNING: libtcc1.a not found during build"
fi

for so in "$TINYCC_SRC/libtcc.so" "$TINYCC_SRC/libtcc.dylib"; do
    if [ -f "$so" ]; then
        run_logged cp "$so" "$TINYCC_DEST/lib/" || true
    fi
done

if [ -x "$THISDIR/tools/run_tcc_minimal_test.sh" ]; then
    log "Running minimal TCC JIT test"
    (
        cd "$THISDIR/tools" || exit 1
        ./run_tcc_minimal_test.sh
    ) >> "$CONFIG_LOG" 2>&1
    TCC_MINIMAL_EXIT=$?
    log "Minimal TCC JIT test exit code: $TCC_MINIMAL_EXIT"
    if [ "$TCC_MINIMAL_EXIT" -ne 0 ]; then
        log "ERROR: Minimal TCC JIT test failed"
        exit 1
    fi
    rm -f "$THISDIR/tools/tcc_minimal_test" >> "$CONFIG_LOG" 2>&1 || true
else
    log "Minimal TCC JIT test script not found; skipping"
fi

log "TinyCC built and installed successfully"
