#!/bin/bash
set -e
export DEBIAN_FRONTEND=noninteractive
export RUST_VERSION=stable

sudo mkdir -p /var/cache/apt/archives
mkdir -p ~/ci-cache/apt/
sudo cp -a ~/ci-cache/apt/. /var/cache/apt/archives/ 2>/dev/null || true

sudo apt-get update

# Install eatmydata, then use it for the rest.
sudo apt-get install --no-install-recommends --allow-unauthenticated -yy \
     -o APT::Keep-Downloaded-Packages=true \
     eatmydata

sudo eatmydata apt-get install --no-install-recommends --allow-unauthenticated -yy \
    -o APT::Keep-Downloaded-Packages=true \
     autoconf \
     automake \
     binfmt-support \
     build-essential \
     clang \
     cppcheck \
     docbook-xml \
     gcc-aarch64-linux-gnu \
     gcc-arm-linux-gnueabihf \
     gcc-arm-none-eabi \
     gettext \
     git \
     gnupg \
     jq \
     libc6-dev-arm64-cross \
     libc6-dev-armhf-cross \
     libev-dev \
     libevent-dev \
     libffi-dev \
     libicu-dev \
     libpq-dev \
     libprotobuf-c-dev \
     libsodium-dev \
     libsqlite3-dev \
     libssl-dev \
     pkg-config \
     libtool \
     libxml2-utils \
     locales \
     lowdown \
     net-tools \
     postgresql \
     python3 \
     python3-dev \
     python3-pip \
     python3-setuptools \
     qemu-system \
     qemu-system-arm \
     qemu-user-static \
     shellcheck \
     software-properties-common \
     sudo \
     tcl \
     tclsh \
     tshark \
     unzip \
     valgrind \
     wget \
     wireshark-common \
     xsltproc \
     systemtap-sdt-dev \
     zlib1g-dev

echo "tester ALL=(root) NOPASSWD:ALL" | sudo tee /etc/sudoers.d/tester
sudo chmod 0440 /etc/sudoers.d/tester

"$(dirname "$0")"/install-bitcoind.sh ~/ci-cache/

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- \
     -y --default-toolchain ${RUST_VERSION}

uv sync --all-extras --all-groups
# required for reckless till poetry to uv migration
uv tool install poetry

# We also need a relatively recent protobuf-compiler, at least 3.12.0,
# in order to support the experimental `optional` flag.

# BUT WAIT!  Gentoo wants this to match the version from the Python protobuf,
# which comes from the same tree.  Makes sense!

# And
#   grpcio-tools-1.69.0` requires `protobuf = ">=5.26.1,<6.0dev"`

# Now, protoc changed to date-based releases, BUT Python protobuf
# didn't, so Python protobuf 4.21.12 (in Ubuntu 23.04) corresponds to
# protoc 21.12 (which, FYI, is packaged in Ubuntu as version 3.21.12).

# In general protobuf version x.y.z corresponds to protoc version y.z

# Honorable mention go to Matt Whitlock for spelunking this horror with me!

PROTOC_VERSION=29.4
PB_REL="https://github.com/protocolbuffers/protobuf/releases"
PROTOC_ZIP=protoc-${PROTOC_VERSION}-linux-x86_64.zip
if [ ! -f ~/ci-cache/$PROTOC_ZIP ]; then
    curl -LO $PB_REL/download/v${PROTOC_VERSION}/$PROTOC_ZIP
    # Check it before we commit it to the cache!
    unzip -t $PROTOC_ZIP
    cp $PROTOC_ZIP ~/ci-cache/
fi
sudo unzip ~/ci-cache/$PROTOC_ZIP -d /usr/local/
sudo chmod a+x /usr/local/bin/protoc
export PROTOC=/usr/local/bin/protoc
export PATH=$PATH:/usr/local/bin
env
ls -lha /usr/local/bin

# wireshark-common normally does this, but GH runners are special, so we
# do it explicitly
sudo groupadd -f wireshark
sudo chgrp wireshark /usr/bin/dumpcap
sudo chmod 750 /usr/bin/dumpcap
sudo setcap cap_net_raw,cap_net_admin=eip /usr/bin/dumpcap

# Add ourselves to the wireshark group (still need "sg wireshark..." for it to take effect)
sudo usermod -aG wireshark "$(id -nu)"

# Copy archives back for caching
cp /var/cache/apt/archives/*.deb ~/ci-cache/apt/ || true
