# Stage 1: Build GStreamer 1.26 from source (cached early — rarely changes)
FROM nvidia/cuda:12.8.1-devel-ubuntu24.04 AS gstreamer

RUN apt-get update && apt-get install -y --no-install-recommends \
    git ca-certificates python3-pip pkg-config ninja-build \
    flex bison nasm \
    libglib2.0-dev libmount-dev \
    && rm -rf /var/lib/apt/lists/*

RUN pip3 install --break-system-packages meson

ARG GSTREAMER_VERSION=1.26.0
RUN git clone --depth 1 --branch ${GSTREAMER_VERSION} \
    https://gitlab.freedesktop.org/gstreamer/gstreamer.git /gstreamer/src

WORKDIR /gstreamer/src
RUN meson setup build --prefix=/opt/gstreamer \
    -Dbuildtype=release \
    -Dgpl=enabled \
    -Dgst-plugins-bad:nvcodec=enabled \
    -Dgst-plugins-ugly:x264=enabled \
    -Dlibav=enabled \
    -Dvaapi=disabled \
    -Drs=disabled \
    -Ddevtools=disabled \
    -Dtests=disabled \
    -Dexamples=disabled \
    -Ddoc=disabled \
    -Dintrospection=disabled \
    && ninja -C build \
    && ninja -C build install

# Stage 2: Build the Rust binary
FROM nvidia/cuda:12.8.1-devel-ubuntu24.04 AS builder

COPY --from=gstreamer /opt/gstreamer /opt/gstreamer
ENV PKG_CONFIG_PATH=/opt/gstreamer/lib/x86_64-linux-gnu/pkgconfig
ENV PATH="/opt/gstreamer/bin:${PATH}"

RUN apt-get update && apt-get install -y --no-install-recommends \
    pkg-config \
    git \
    curl \
    ca-certificates \
    cmake \
    libclang-dev \
    libglib2.0-dev \
    libacl1-dev \
    && rm -rf /var/lib/apt/lists/*

# Install Rust nightly (edition 2024 requires it)
RUN curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --default-toolchain nightly
ENV PATH="/root/.cargo/bin:${PATH}"

WORKDIR /build
COPY . .

RUN cargo build --release --bin adamo-network

# Stage 3: Runtime
FROM nvidia/cuda:12.8.1-runtime-ubuntu24.04

# Ensure NVENC/NVDEC driver libs are mounted by the NVIDIA Container Toolkit
ENV NVIDIA_DRIVER_CAPABILITIES=all

RUN apt-get update && apt-get install -y --no-install-recommends \
    libglib2.0-0 \
    && rm -rf /var/lib/apt/lists/*

# Register CUDA lib dir with ldconfig so symlinks are created dynamically
RUN echo "/usr/local/cuda/targets/x86_64-linux/lib" > /etc/ld.so.conf.d/cuda-nvrtc.conf

COPY --from=gstreamer /opt/gstreamer /opt/gstreamer
ENV GST_PLUGIN_PATH=/opt/gstreamer/lib/x86_64-linux-gnu/gstreamer-1.0
ENV LD_LIBRARY_PATH=/opt/gstreamer/lib/x86_64-linux-gnu:/usr/local/cuda/targets/x86_64-linux/lib
ENV PATH="/opt/gstreamer/bin:${PATH}"

COPY --from=builder /build/target/release/adamo-network /usr/local/bin/adamo-network

# Default to Jazzy so zenoh-bridge-ros2dds uses the correct GID format.
# Override at runtime with -e ROS_DISTRO=humble if needed.
ENV ROS_DISTRO=jazzy
ENV RUST_LOG=info

# Run ldconfig at startup to create correct libnvrtc.so symlinks for whatever
# CUDA/driver version the NVIDIA Container Toolkit injects on this host.
# Run with: docker run --network host --gpus all <image> --config /path/to/config.yaml
ENTRYPOINT ["sh", "-c", "ldconfig && exec adamo-network \"$@\"", "--"]
