#!/bin/bash
# vi: sw=2 ts=4

# Shameless copy of the script from gnome-shell
# https://gitlab.gnome.org/GNOME/gnome-shell/-/blob/main/.gitlab-ci/build-toolbox-image.sh?ref_type=heads

set -e

die() {
  echo "$@" >&2
  exit 1
}

check_image_base() {
  local base=$(
    skopeo inspect docker://$TOOLBOX_IMAGE 2>/dev/null |
    jq -r '.Labels["org.opencontainers.image.base.name"]')
  [[ "$base" == "$BASE_CI_IMAGE" ]]
}

build_container() {
  echo Building $TOOLBOX_IMAGE from $BASE_CI_IMAGE

  export BUILDAH_ISOLATION=chroot
  export BUILDAH_FORMAT=docker

  local build_cntr=$(buildah from $BASE_CI_IMAGE)
  local build_mnt=$(buildah mount $build_cntr)

  [[ -n "$build_mnt" && -n "$build_cntr" ]] || die "Failed to mount the container"

  # Copy pasted from github
  # https://github.com/containers/toolbox/blob/main/images/fedora/f39/extra-packages
  local extra_packages=(
    bash-completion
    bc
    bzip2
    cracklib-dicts
    diffutils
    dnf-plugins-core
    findutils
    flatpak-spawn
    fpaste
    gawk-all-langpacks
    git
    glibc-gconv-extra
    gnupg2
    gnupg2-smime
    gvfs-client
    hostname
    iproute
    iputils
    keyutils
    krb5-libs
    less
    lsof
    man-db
    man-pages
    mesa-dri-drivers
    mesa-vulkan-drivers
    mtr
    nano-default-editor
    nss-mdns
    openssh-clients
    passwd
    pigz
    procps-ng
    psmisc
    rsync
    shadow-utils
    sudo
    tcpdump
    "time"
    traceroute
    tree
    unzip
    util-linux
    vte-profile
    vulkan-loader
    wget
    which
    whois
    words
    xorg-x11-xauth
    xz
    zip
  )
  local our_extra_packages=(
    gdb
    ripgrep
    fish
    zsh
  )
  # local debug_packages=(
  #   glib2
  # )

  buildah run $build_cntr dnf install -y "${extra_packages[@]}"
  buildah run $build_cntr dnf install -y "${our_extra_packages[@]}"
  # buildah run $build_cntr dnf debuginfo-install -y "${debug_packages[@]}"

  buildah run $build_cntr dnf clean all
  buildah run $build_cntr rm -rf /var/lib/cache/dnf

  # random uid
  uid="10043"
  name="containeruser"
  buildah run $build_cntr -- groupadd $name -g $uid
  buildah run $build_cntr -- useradd -u $uid -g $uid -ms /bin/bash $name

  buildah run $build_cntr -- usermod -aG wheel $name
  buildah run $build_cntr -- bash -c "echo $name ALL=\(ALL\) NOPASSWD:ALL > /etc/sudoers.d/$name"
  buildah run $build_cntr -- chmod 0440 /etc/sudoers.d/$name

  # Remove the hardcoded HOME env var that ci-templates adds
  # https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/2433#note_2243222
  # Also add the OCI labels that toolbox expects, to advertize that image is compatible
  # Additionally add a non-root default user
  buildah config --env HOME- \
    --user $name \
    --label com.github.containers.toolbox=true \
    --label org.opencontainers.image.base.name=$BASE_CI_IMAGE \
    $build_cntr

  buildah commit $build_cntr $TOOLBOX_IMAGE
  buildah tag $TOOLBOX_IMAGE $TOOLBOX_LATEST
}

BASE_CI_IMAGE="$1"
TOOLBOX_BRANCH="$2"
GST_UPSTREAM_BRANCH="$3"

TOOLBOX_IMAGE="$CI_REGISTRY_IMAGE/$FDO_REPO_SUFFIX:gst-toolbox-${TOOLBOX_BRANCH}"
# push an unversioned tag to make it easier to use.
# ex. pull foobar:toolbox-main
TOOLBOX_LATEST="$CI_REGISTRY_IMAGE/$FDO_REPO_SUFFIX:gst-toolbox-${GST_UPSTREAM_BRANCH}"

[[ -n "$BASE_CI_IMAGE" && -n "$TOOLBOX_BRANCH" && -n "$GST_UPSTREAM_BRANCH" ]] ||
  die "Usage: $(basename $0) BASE_CI_IMAGE TOOLBOX TAG GST_UPSTREAM_BRANCH"

[[ -n "$CI_REGISTRY" && -n "$CI_REGISTRY_USER" && -n "$CI_REGISTRY_PASSWORD" ]] ||
  die "Insufficient information to log in."

podman login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY

if ! check_image_base; then
  build_container

  podman push "$TOOLBOX_IMAGE"
  podman push "$TOOLBOX_LATEST"
fi

echo "Create your toolbox with either of the following commands"
echo "     $ toolbox create gst-toolbox --image $TOOLBOX_LATEST"
echo "     $ toolbox create gst-toolbox-$TOOLBOX_BRANCH --image $TOOLBOX_IMAGE"
