#!/usr/bin/env bash

set -eu -o pipefail

: ${BUILDX_CMD=docker buildx}
: ${BUILDKIT_IMAGE=moby/buildkit:buildx-stable-1}
: ${BUILDKIT_CFG=}
: ${DRIVER=docker-container}
: ${DRIVER_OPT=}
: ${MULTI_NODE=0}
: ${PLATFORMS=linux/amd64,linux/arm64}

function clean {
  rm -rf "$context"
  ${BUILDX_CMD} rm "$builderName"
}

context=$(mktemp -d -t buildx-output.XXXXXXXXXX)
dockerfile=${context}/Dockerfile
trap clean EXIT

builderName=buildx-test-$(openssl rand -hex 16)
buildPlatformFlag=
if [ "$DRIVER" = "docker" ]; then
  builderName=default
else
  buildPlatformFlag=--platform="${PLATFORMS}"
fi

driverOpt=image=${BUILDKIT_IMAGE}
if [ -n "$DRIVER_OPT" ]; then
  driverOpt=$driverOpt,$DRIVER_OPT
fi

# create builder except for docker driver
if [ "$DRIVER" != "docker" ]; then
  if [ "${MULTI_NODE}" = "1" ]; then
    firstNode=1
    for platform in ${PLATFORMS//,/ }; do
      createFlags=""
      if [ -f "$BUILDKIT_CFG" ]; then
        createFlags="$createFlags --config=${BUILDKIT_CFG}"
      fi
      if [ "$firstNode" = "0" ]; then
        createFlags="$createFlags --append"
      fi
      (
        set -x
        ${BUILDX_CMD} create ${createFlags} \
          --name="${builderName}" \
          --node="${builderName}-${platform/\//-}" \
          --driver="${DRIVER}" \
          --driver-opt="${driverOpt}" \
          --platform="${platform}"
      )
      firstNode=0
    done
  else
    createFlags=""
    if [ -f "$BUILDKIT_CFG" ]; then
      createFlags="$createFlags --config=${BUILDKIT_CFG}"
    fi
    (
      set -x
      ${BUILDX_CMD} create ${createFlags} \
        --name="${builderName}" \
        --driver="${DRIVER}" \
        --driver-opt="${driverOpt}" \
        --platform="${PLATFORMS}"
    )
  fi
fi

# multi-platform not supported by docker driver
buildPlatformFlag=
if [ "$DRIVER" != "docker" ]; then
  buildPlatformFlag=--platform="${PLATFORMS}"
fi

set -x

# inspect and bootstrap
${BUILDX_CMD} inspect --bootstrap --builder="${builderName}"

# create dockerfile
cat > "${dockerfile}" <<EOL
FROM busybox as build
ARG TARGETPLATFORM
ARG BUILDPLATFORM
RUN echo "I am running on \$BUILDPLATFORM, building for \$TARGETPLATFORM" > /log
FROM busybox
COPY --from=build /log /log
RUN cat /log
RUN uname -a
EOL

# build
${BUILDX_CMD} build ${buildPlatformFlag} \
  --output="type=cacheonly" \
  --builder="${builderName}" \
  "${context}"