#!/usr/bin/env bash

set -euo pipefail

if [[ $(id -u) -ne 0 ]]; then
    echo "This script must be run as root. Re-run with sudo, e.g. sudo ./setup_docker.sh"
    exit 1
fi

SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"

export DEBIAN_FRONTEND=noninteractive

apt-get update
apt-get install -y \
    ca-certificates \
    curl \
    gnupg \
    lsb-release \
    netcat-traditional

install -m 0755 -d /etc/apt/keyrings
if [[ ! -f /etc/apt/keyrings/docker.gpg ]]; then
    curl -fsSL https://download.docker.com/linux/ubuntu/gpg | \
        gpg --dearmor -o /etc/apt/keyrings/docker.gpg
fi
chmod a+r /etc/apt/keyrings/docker.gpg

cat <<EOF > /etc/apt/sources.list.d/docker.list
deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable
EOF

apt-get update
apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

if command -v systemctl >/dev/null 2>&1; then
    systemctl enable docker || true
    systemctl start docker || true
elif command -v service >/dev/null 2>&1; then
    service docker start || true
fi

INVOCATION_USER="${SUDO_USER:-}"
if [[ -n "$INVOCATION_USER" && "$INVOCATION_USER" != "root" ]]; then
    if ! getent group docker >/dev/null; then
        groupadd docker
    fi
    if id -nG "$INVOCATION_USER" | grep -qw docker; then
        echo "User $INVOCATION_USER is already in the docker group."
    else
        usermod -aG docker "$INVOCATION_USER"
        echo "Added $INVOCATION_USER to the docker group. Log out and back in for the change to take effect."
    fi
fi

docker compose version

START_SCRIPT="$SCRIPT_DIR/start_docker.sh"
if [[ -x "$START_SCRIPT" ]]; then
    pushd "$SCRIPT_DIR" >/dev/null
    "$START_SCRIPT" --detached
    popd >/dev/null
else
    echo "Warning: $START_SCRIPT is not executable; skipping automatic container startup."
fi
