FROM ros:jazzy

# Create the workspace and copy all source directories into it
WORKDIR /ros2_ws
ARG TARGETARCH

COPY src ./src/
COPY patches ./patches/
COPY upstream.jazzy.repos ./upstream.jazzy.repos

# Import all upstream repostories
RUN mkdir -p src/upstream && vcs import ./src/upstream < ./upstream.jazzy.repos

# Apply patches to upstream
RUN ./patches/apply_patches.sh

# system deps from frozen rosdep manifest — no rosdep at build or startup
# NOTE: There should be a check in your CI that this file is up to date.
# Something like: 
#   ./scripts/freeze-rosdep.sh && git diff --exit-code rosdep-packages.txt
# COPY rosdep-packages.txt /tmp/rosdep-packages.txt
# The --mount=type=cache option caches the apt packages with buildkit
# The id-apt-cache-${TARGETARCH} option allows for separate caches for different architectures
# this enables parallel builds for different architectures without cache conflicts
# RUN --mount=type=cache,target=/var/cache/apt,sharing=locked,id=apt-cache-${TARGETARCH} \
#     rm -f /etc/apt/apt.conf.d/docker-clean \
#     && apt-get update \
#     && xargs -r -a /tmp/rosdep-packages.txt apt-get install -y --no-install-recommends \
#     && rm -rf /var/lib/apt/lists/*

# Make sure the base image is completely up to date
# ros:jazzy ships /etc/apt/apt.conf.d/docker-clean which purges downloaded .debs;
# remove it so the --mount=type=cache on /var/cache/apt actually retains archives.
RUN --mount=type=cache,target=/var/cache/apt,sharing=locked,id=apt-cache-${TARGETARCH} \
    rm -f /etc/apt/apt.conf.d/docker-clean \
    && apt-get update \
    && apt-get upgrade -y \
    && rm -rf /var/lib/apt/lists/*


# Install dependencies with rosdep
# This will catch anything that wasn't installed via .deb's from the frozen rosdep manifest.
RUN --mount=type=cache,target=/var/cache/apt,sharing=locked,id=apt-cache-${TARGETARCH} \
    rm -f /etc/apt/apt.conf.d/docker-clean && \
    apt-get update && \
    rosdep update && \
    rosdep install --from-paths src --ignore-src -r -y && \
    rm -rf /var/lib/apt/lists/*

# Build the workspace with symlink install
# livox_sdk is now an ament_cmake package built by colcon (no manual /usr/local install needed).
RUN . /opt/ros/jazzy/setup.sh && \
    colcon build --symlink-install
# Source the overlay on container startup
RUN echo "source /opt/ros/jazzy/setup.bash" >> /root/.bashrc && \
    echo "source /ros2_ws/install/setup.bash" >> /root/.bashrc

CMD ["bash"]
