FROM ubuntu:22.04

ARG DEBIAN_FRONTEND=noninteractive

# Note installations that take a while (more than 10s)

RUN apt-get update
RUN apt-get install -y ca-certificates
RUN apt-get install -y ccache
RUN apt-get install -y curl
RUN apt-get install -y fish
RUN apt-get install -y gdb
# git-all: ~250s
RUN apt-get install -y git-all
RUN apt-get install -y gnupg
# liblttng-ust-dev: ~30s
RUN apt-get install -y liblttng-ust-dev
RUN apt-get install -y libssh2-1-dev
RUN apt-get install -y locales
RUN apt-get install -y ninja-build
# openssh-server: ~40s
RUN apt-get install -y openssh-server
RUN apt-get install -y pkg-config
RUN apt-get install -y software-properties-common
RUN apt-get install -y sudo
RUN apt-get install -y tzdata
RUN apt-get install -y vim
RUN apt-get install -y zip

# Python: ~30s
RUN apt-get install -y \
   python3-pip \
   python3-venv \
   && python3 -m pip install --upgrade pip

# GCC
ARG gcc_major=13
RUN \
   add-apt-repository ppa:ubuntu-toolchain-r/test \
   && apt-get update \
   && apt-get install -y g++-$gcc_major

# Clang
ARG clang_major=17
RUN \
   curl -fsSL https://apt.llvm.org/llvm-snapshot.gpg.key 2> /dev/null \
   | gpg --dearmor - \
   | tee /usr/share/keyrings/llvm-snapshot.gpg > /dev/null \
   && echo "deb [signed-by=/usr/share/keyrings/llvm-snapshot.gpg] http://apt.llvm.org/$(lsb_release -cs)/ llvm-toolchain-$(lsb_release -cs)-$clang_major main" \
   | tee -a "/etc/apt/sources.list.d/llvm.list" \
   && apt-get update \
   && apt-get install -y \
   clang-$clang_major \
   clang-format-$clang_major \
   clangd-$clang_major

# CMake
RUN set -eux \
  && apt-get update \
  && apt-get install -y --no-install-recommends ca-certificates curl gpg \
  && curl -fsSL https://apt.kitware.com/keys/kitware-archive-latest.asc \
    | gpg --dearmor -o /usr/share/keyrings/kitware-archive-keyring.gpg \
  && echo "deb [signed-by=/usr/share/keyrings/kitware-archive-keyring.gpg] https://apt.kitware.com/ubuntu/ $(lsb_release -cs) main" \
    > /etc/apt/sources.list.d/kitware.list \
  && apt-get update \
  && apt-get install -y --no-install-recommends cmake \
  && rm -rf /var/lib/apt/lists/*

# Dotnet
RUN apt-get update && apt-get install -y dotnet8

# Node
ARG node_major=18
RUN mkdir -p /etc/apt/keyrings \
   && curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key \
   | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg \
   && echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_$node_major.x nodistro main" \
   | tee /etc/apt/sources.list.d/nodesource.list \
   && apt-get update \
   && apt-get install -y nodejs

# Emumba (deps)
RUN apt-get update && apt-get -y install rapidjson-dev
# Emumba
ARG EMUMBA_DERIBIT_CONNECTOR_DEB_URL="https://api.bitbucket.org/2.0/repositories/bluetradesys/spark/downloads/emumba-deribit-connector-3.3.1-Linux.LICENSE_DISABLED.deb"
RUN --mount=type=secret,id=bitbucket_access_token \
  set -eux \
    && apt-get update \
    && TOKEN="$(cat /run/secrets/bitbucket_access_token)" \
    && curl -fL -H "Authorization: Bearer ${TOKEN}" $EMUMBA_DERIBIT_CONNECTOR_DEB_URL -o /tmp/emumba-deribit-connector.deb \
    && apt-get install -y /tmp/emumba-deribit-connector.deb \
    && rm -f /tmp/emumba-deribit-connector.deb

# Pcap
RUN apt-get update && apt-get install -y libpcap0.8-dev

# Databento (deps)
RUN apt-get update && apt-get -y install libzstd-dev

# Rakurai
ARG RAKURAI_DEB_URL="https://api.bitbucket.org/2.0/repositories/bluetradesys/spark/downloads/rakurai-dex-connector_0.0.5_amd64.deb"
RUN --mount=type=secret,id=bitbucket_access_token \
  set -eux \
    && apt-get update \
    && TOKEN="$(cat /run/secrets/bitbucket_access_token)" \
    && curl -fL -H "Authorization: Bearer ${TOKEN}" $RAKURAI_DEB_URL -o /tmp/rakurai.deb \
    # Need --force-overwrite because rakuirai and emumba-deribit-connector both include the same
    # spdlog headers.
    && apt-get install -y -o Dpkg::Options::="--force-overwrite" /tmp/rakurai.deb \
    && rm -f /tmp/rakuirai.deb

# Docker in Docker
RUN apt-get update && apt-get install -y \
    docker.io \
    docker-compose \
    docker-compose-v2

# Set up default executables (update-alternatives)
RUN \
   update-alternatives --install /usr/bin/clang clang /usr/bin/clang-$clang_major 100; \
   update-alternatives --install /usr/bin/clang++ clang++ /usr/bin/clang++-$clang_major 100; \
   update-alternatives --install /usr/bin/clang-format clang-format /usr/bin/clang-format-$clang_major 100; \
   update-alternatives --install /usr/bin/clangd clangd /usr/bin/clangd-$clang_major 100; \
   update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-$gcc_major 100; \
   update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-$gcc_major 100

# Add compiler symlinks for ccache 
RUN \
   ln -s /usr/bin/ccache /usr/local/bin/clang; \
   ln -s /usr/bin/ccache /usr/local/bin/clang++; \
   ln -s /usr/bin/ccache /usr/local/bin/clang-$clang_major; \
   ln -s /usr/bin/ccache /usr/local/bin/clang++-$clang_major; \
   ln -s /usr/bin/ccache /usr/local/bin/gcc; \
   ln -s /usr/bin/ccache /usr/local/bin/g++

RUN locale-gen en_US.UTF-8

ARG docker_user="bts"
ARG docker_uid="1000"
ARG docker_pass="bts"

RUN \
   groupadd -g "$docker_uid" "$docker_user" \
   && useradd \
   -m \
   -u "$docker_uid" \
   -g "$docker_uid" \
   -G sudo \
   --password "$(openssl passwd -1 "$docker_pass")" \
   "$docker_user"
