ARG ROS_DISTRO
FROM osrf/ros:${ROS_DISTRO}-desktop-full

ARG EXT_SHELL=bash
RUN echo "Building devenv for ROS" $ROS_DISTRO "with shell" $EXT_SHELL

# Avoid warnings by switching to noninteractive
ENV DEBIAN_FRONTEND=noninteractive

# Import the key in order to be able to use the packages from the repository
# RUN apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 7E72C5B4111A50084C63C9489E7A9B1D990CF897
# NOV - 2023
RUN apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 4B63CF8FDE49746E98FA01DDAD19BAB3CBF125EA

# Setup environment
RUN apt-get update && apt-get install -y apt-utils

RUN apt-get install -y \
    locales \
    && sed -i '/en_US.UTF-8/s/^# //g' /etc/locale.gen && locale-gen en_US.UTF-8
ENV LANG en_US.UTF-8
ENV LANGUAGE en_US:en
ENV LC_ALL en_US.UTF-8

# Configure apt and install base packages
RUN apt-get update && \
    apt-get -y install --no-install-recommends \
    apt-transport-https \
    bat \
    ca-certificates \
    checkinstall \
    clang-format clang-tidy clang-tools clang clangd\
    cmake-curses-gui \
    curl \
    dbus-x11 \
    dialog 2>&1 \
    direnv \
    gawk \
    gdb \
    git \
    git-core \
    git-lfs \
    gnupg-agent \
    iputils-ping \
    less \
    nano \
    net-tools \
    openssh-client \
    python3-pip \
    ripgrep \
    software-properties-common \
    trash-cli \
    valgrind \
    wget \
    xterm

# Install zsh if requested
RUN if [ "$EXT_SHELL" = "zsh" ]; \
    then \
    apt-get -y install zsh; \
    fi

# Configure system to look for debian packages in the Tecnalia's artifactory repository
COPY auth.conf /etc/apt/auth.conf.d/tecnalia.conf
RUN curl -s https://raw.githubusercontent.com/ros/rosdistro/master/ros.asc | apt-key add -

# Configure rosdep
RUN sh -c "echo 'yaml https://git.code.tecnalia.com/tecnalia_robotics-public/gitlab_templates/raw/master/rosdistro/rosdep_tecnalia.yaml' \
    >> /etc/ros/rosdep/sources.list.d/20-default.list"

# Create a virtual environment
# RUN apt-get install -y python3-venv
# ENV VIRTUAL_ENV=/opt/venv
# RUN python3 -m venv $VIRTUAL_ENV
# ENV PATH="$VIRTUAL_ENV/bin:$PATH"

# Copy the requirements.txt file into the container
WORKDIR /tmp/dependencies/
COPY /distro_dependencies/* ./

# Install the packages listed in ${ROS_DISTRO}_requirements.txt
RUN if [ -f "${ROS_DISTRO}_requirements.txt" ]; \
    then \
    apt-get update && \
    # Install apt-get packages
    awk '/^# APT-GET PACKAGES/,/^# PIP PACKAGES/' ${ROS_DISTRO}_requirements.txt | grep -v '^#' | xargs apt-get install -y && \
    # Install pip packages
    awk '/^# PIP PACKAGES/,0' ${ROS_DISTRO}_requirements.txt | grep -v '^#' | xargs -r -n1 pip install ;\
    apt-get clean; \
    fi

RUN rm -rf *

# Install extra packages ws_dependencies
ARG PACKAGES=none
COPY /ws_dependencies/* ./
RUN echo $PACKAGES
RUN if [ "$PACKAGES" != "none" ]; \
    then \
    if [ -f "${PACKAGES}" ]; \
    then \
    # Install apt-get packages
    apt-get update && \
    awk '/^# APT-GET PACKAGES/,/^# PIP PACKAGES/' ${PACKAGES} | grep -v '^#' | xargs apt-get install -y && \
    # Install pip packages
    awk '/^# PIP PACKAGES/,0' ${PACKAGES} | grep -v '^#' | xargs -r -n1 pip install ;\
    apt-get clean; \
    fi \
    fi

RUN rm -rf *

# Install extra libs from .deb files
WORKDIR /tmp/srcs/
COPY /extra_libs/* ./

# Enviroment tools based on ubuntu version
RUN if [ -f "common_libs.txt" ]; \
    then \
    grep -v '^#' common_libs.txt | xargs wget \
    && dpkg -i *.deb; \
    fi

RUN rm -rf *

RUN apt-get --reinstall install -y libnotify-bin notify-osd

ARG PEAK_DRIVER=none
RUN if [ "$PEAK_DRIVER" = "install" ]; \
    then \
    apt-get update && apt-get install -y udev libpopt-dev linux-headers-$(uname -r) \
    && wget https://www.peak-system.com/fileadmin/media/linux/files/peak-linux-driver-8.18.0.tar.gz \
    # && wget https://www.peak-system.com/quick/PEAK-Linux-Driver -O peak-linux-driver.tar.gz \
    && wget https://www.peak-system.com/quick/BasicLinux -O PCAN-Basic_Linux.tar.gz \
    && tar -xvf peak-linux-driver-8.18.0.tar.gz \
    && cd peak-linux-driver-8.18.0 \
    && make clean && make install || echo 'make failed but move forward'\
    && cd .. \
    && tar -xvf PCAN-Basic_Linux.tar.gz \
    && cd PCAN-Basic_Linux-4.9.0.7/libpcanbasic \
    && make clean && make install || echo 'make failed but move forward';\
    fi

# Update this date to re-run the image final update
LABEL image.date=14-10-2024

# Update final image
RUN apt-get update \
    && apt-get -y upgrade \
    && apt-get -y autoremove \
    && apt-get -y autoclean

# Set entrypoint
COPY ./ros_entrypoint.sh /
RUN chmod a+x /ros_entrypoint.sh

ENV ROS_DISTRO "${ROS_DISTRO}"

ENV EXT_SHELL "${EXT_SHELL}"
ENV RUNNING_IN_DOCKER true

# Switch back to dialog for any ad-hoc use of apt-get
ENV DEBIAN_FRONTEND=

# Enable localhost only ROS2
ENV ROS_LOCALHOST_ONLY=1
ENV RMW_IMPLEMENTATION=rmw_cyclonedds_cpp

ARG SHELL=/bin/bash
ENV SHELL="${SHELL}"

ENTRYPOINT ["/ros_entrypoint.sh"]
CMD $EXT_SHELL