ARG from=ros:noetic
FROM ${from}
# install build tools
# RUN apt-get update && apt-get install -y \
#     python-catkin-tools \
#     && rm -rf /var/lib/apt/lists/*
RUN apt-get update && apt-get install -y python3-pip git ca-certificates
RUN apt-get update && apt-get install -y libsdl2-dev libusb-1.0-0-dev build-essential cmake ffmpeg python3-opencv libavcodec-dev libavdevice-dev libavfilter-dev libavformat-dev libavresample-dev libavutil-dev libpostproc-dev libswresample-dev libswscale-dev iputils-ping net-tools openssh-server sudo nano ros-noetic-cv-bridge v4l-utils
RUN apt-get update && apt-get install -y ros-noetic-tf

RUN pip3 install git+https://github.com/catkin/catkin_tools.git
RUN pip install opencv-python
RUN pip install pyproj

# set up udev and usb stuff
WORKDIR /opt
RUN mkdir -p /etc/udev/rules.d && touch /etc/udev/rules.d/DJIDevice.rules \
&& echo 'SUBSYSTEM=="usb", ATTRS{idVendor}=="2ca3", MODE="0666"' >> /etc/udev/rules.d/DJIDevice.rules \
&& echo 'SUBSYSTEM=="tty", ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="ea60", SYMLINK+="dji_usb"' >> /etc/udev/rules.d/DJIDevice.rules
# && usermod -a -G dialout $USER

# clone and install the onboard sdk first
RUN git clone http://git.caslab.ece.vt.edu/hlarkin3/onboard-sdk-arm.git
RUN mkdir onboard-sdk-arm/build
WORKDIR /opt/onboard-sdk-arm/build
RUN cmake .. \
&& make -j4\
&& make install\
&& cp ../sample/platform/linux/common/UserConfig.txt bin/ \
&& echo "app_id : 1069806" > bin/UserConfig.txt \
&& echo "app_key : e180b993ca8365653437fbafe7211ba040386d77c3c87627882857a11bd8efbd" >> bin/UserConfig.txt \
&& echo "device : /dev/dji_usb" >> bin/UserConfig.txt \
&& echo "baudrate : 921600" >> bin/UserConfig.txt \
&& echo "acm_port : /dev/ttyACM0" >> bin/UserConfig.txt \
&& cp bin/UserConfig.txt /root/.ros/UserConfig.txt

# clone eigen into correct location and rename
WORKDIR /usr/local/include/
RUN git clone https://github.com/libigl/eigen.git && mv eigen/ Eigen3/ && cp -r ./Eigen3/Eigen/ ./Eigen/

RUN echo "refreshest"

# clone ros package repo
ENV ROS_WS /opt/ros_ws
RUN mkdir -p $ROS_WS/src
WORKDIR $ROS_WS
RUN git -C src clone http://git.caslab.ece.vt.edu/hlarkin3/drone-ros-packages.git -b replicants

WORKDIR $ROS_WS/src/drone-ros-packages
RUN git submodule init && git submodule update
WORKDIR $ROS_WS

ENV ROS_IP service-drone

# install ros package dependencies
RUN apt-get update && \
    rosdep update && \
    rosdep install -y --from-paths src/* --ignore-src && \
    rm -rf /var/lib/apt/lists/*

# build ros package source
RUN catkin config \
      --extend /opt/ros/$ROS_DISTRO && \
    catkin build --cmake-args -DCMAKE_CXX_FLAGS="-std=c++17"
    # \
    #   roscpp_tutorials

COPY bashCheckRoscore.sh /usr/local/bin/bashCheckRoscore.sh
COPY ros_entrypoint.sh /usr/local/bin/ros_entrypoint.sh

RUN useradd -m -s /bin/bash -p $(openssl passwd -1 password) ssher
RUN usermod -aG sudo ssher
# add ssher user to the video group to allow streaming
RUN adduser ssher video
RUN usermod -a -G video ssher

RUN chmod 755 /usr/local/bin/bashCheckRoscore.sh && chmod 755 /usr/local/bin/ros_entrypoint.sh

# make ssh-ing easier
RUN echo "source /opt/ros/noetic/setup.bash" >> /home/ssher/.bashrc
RUN echo "source /opt/ros_ws/devel/setup.bash" >> /home/ssher/.bashrc
# also need to put env variables in here
RUN echo "ssh-keyscan -H service-master >> /home/ssher/.ssh/known_hosts" >> /home/ssher/.bashrc
RUN echo "ssh-keyscan -H service-drone >> /home/ssher/.ssh/known_hosts" >> /home/ssher/.bashrc
# these will be run with env loader but also nice to have from an ssh
RUN echo "export ROS_MASTER_URI=http://service-master:11311" >> /home/ssher/.bashrc
RUN echo "export ROS_HOSTNAME=service-drone" >> /home/ssher/.bashrc

# put environment file in ros folder, to be referenced by base station machines.launch file
RUN touch /opt/ros/noetic/kube_setup.sh \
&& echo "#!/bin/bash" > /opt/ros/noetic/kube_setup.sh \
&& echo "export ROS_WS=/opt/ros_ws" >> /opt/ros/noetic/kube_setup.sh \
&& echo "source /opt/ros_ws/devel/setup.bash" >> /opt/ros/noetic/kube_setup.sh \
&& echo "export PATH=/opt/ros/noetic/share/ros/bin:/opt/ros/noetic/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin" >> /opt/ros/noetic/kube_setup.sh \
&& echo "export ROS_PACKAGE_PATH=/opt/ros_ws/src/drone-ros-packages/audio_common/audio_common:/opt/ros_ws/src/drone-ros-packages/audio_common/audio_common_msgs:/opt/ros_ws/src/drone-ros-packages/audio_common/audio_capture:/opt/ros_ws/src/drone-ros-packages/audio_common/audio_play:/opt/ros_ws/src/drone-ros-packages/Onboard-SDK-ROS:/opt/ros_ws/src/drone-ros-packages/position_sync:/opt/ros_ws/src/drone-ros-packages/puredata:/opt/ros_ws/src/drone-ros-packages/audio_common/sound_play:/opt/ros/noetic/share:/opt/ros_ws" >> /opt/ros/noetic/kube_setup.sh \
&& echo "export ROS_MASTER_URI=http://service-master:11311" >> /opt/ros/noetic/kube_setup.sh \
&& echo "export ROS_HOSTNAME=service-drone" >> /opt/ros/noetic/kube_setup.sh \
&& echo 'exec "$@"' >> /opt/ros/noetic/kube_setup.sh

# also need to own and execute said setup file
RUN chown ssher /opt/ros/noetic/kube_setup.sh \
&& chmod +x /opt/ros/noetic/kube_setup.sh

# make spot for the video feed to come in
# RUN mkdir -p /dev/videoSource

# set up ssh stuff
RUN mkdir -p /home/ssher/.ssh
RUN chown -R ssher:ssher /home/ssher/.ssh
RUN service ssh start
EXPOSE 22

ENTRYPOINT ["/usr/local/bin/ros_entrypoint.sh"]
CMD ["/usr/sbin/sshd","-D"]
CMD ["bash"]

# run ros package launch file
# CMD ["roslaunch", "roscpp_tutorials", "talker_listener.launch"]