# Stage 1: Build environment
FROM ocaml/opam:debian-13-ocaml-5.4 AS build

# Install build dependencies
USER root
RUN apt-get update && \
    apt-get install -y --no-install-recommends \
        llvm-19-dev \
        clang-19 \
        cmake \
        libzstd-dev \
        zlib1g-dev \
        build-essential && \
    rm -rf /var/lib/apt/lists/*

USER opam
RUN mkdir -p /home/opam/app
WORKDIR /home/opam/app

RUN sudo ln -f /usr/bin/opam-2.3 /usr/bin/opam
RUN opam init --reinit -ni

COPY --chown=opam *.opam ./

RUN opam install --deps-only .

COPY --chown=opam dune-project ./
COPY --chown=opam .ocamlformat ./
COPY --chown=opam lib ./lib
COPY --chown=opam bin ./bin
COPY --chown=opam test ./test

# Build the compiler
RUN opam exec -- dune build

# Stage 2: Runtime environment
FROM debian:13.2-slim AS runtime

# Install runtime dependencies
RUN apt-get update && \
    apt-get install -y --no-install-recommends \
    ca-certificates \
    llvm-19 \
    clang-19 \
    make \
    wget && \
    update-alternatives --install /usr/bin/llvm-link llvm-link /usr/bin/llvm-link-19 100 && \
    update-alternatives --install /usr/bin/clang clang /usr/bin/clang-19 100 && \
    apt-get clean && \
    rm -rf /var/lib/apt/lists/*

# Install GC
ARG BOEHM_GC_VERSION=8.2.8
RUN echo $BOEHM_GC_VERSION
RUN echo https://www.hboehm.info/gc/gc_source/gc-$BOEHM_GC_VERSION.tar.gz
WORKDIR /gc
RUN wget https://www.hboehm.info/gc/gc_source/gc-${BOEHM_GC_VERSION}.tar.gz \
    && tar -xzf gc-${BOEHM_GC_VERSION}.tar.gz \
    && cd gc-${BOEHM_GC_VERSION} \
    && ./configure --prefix=/usr/local \
    && make -j$(nproc) \
    && make install \
    && ldconfig \
    && cd .. \
    && rm -rf gc-${BOEHM_GC_VERSION} gc-${BOEHM_GC_VERSION}.tar.gz \
    && apt-get remove -y wget make \
    && apt-get autoremove -y

WORKDIR /app

# Copy the compiler and dynamizer from the build stage
COPY --from=build /home/opam/app/_build/install/default/bin/grev /usr/local/bin/grev
COPY --from=build /home/opam/app/_build/install/default/bin/dynamizer /usr/local/bin/dynamizer

COPY lib/stdlib_*.c /usr/local/lib/grev/runtime/
ENV GREV_LIB_DIR=/usr/local/lib/grev/runtime

CMD ["bash"]
