#!/bin/bash
set -euxo pipefail
IFS=$'\n\t'

# This script builds certbot docker and certbot dns plugins docker using the
# local Certbot files.

# Usage: ./build.sh [TAG] [all|amd64|arm32v6|arm64v8]
#   with the [TAG] value corresponding the base of the tag to give the Docker
#   images and the 2nd value being the architecture to build snaps for.
#   Values for the tag should be something like `v0.34.0` or `nightly`. The
#   given value is only the base of the tag because the things like the CPU
#   architecture are also added to the full tag.

WORK_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null && pwd )"
REPO_ROOT="$(dirname "$(dirname "${WORK_DIR}")")"
source "$WORK_DIR/lib/common"

trap Cleanup EXIT

Cleanup() {
    rm -rf "$REPO_ROOT"/qemu-*-static || true
    for plugin in "${CERTBOT_PLUGINS[@]}"; do
        rm -rf "$REPO_ROOT/certbot-$plugin"/qemu-*-static || true
    done
}

# Returns the translation from Docker to QEMU architecture
# Usage: GetQemuArch [amd64|arm32v6|arm64v8]
GetQemuArch() {
    ARCH=$1

    case "$ARCH" in
        "amd64")
            echo "x86_64"
            ;;
        "arm32v6")
            echo "arm"
            ;;
        "arm64v8")
            echo "aarch64"
            ;;
        "*")
            echo "Not supported build architecture '$1'." >&2
            exit 1
    esac
}

# Downloads QEMU static binary file for architecture
# Usage: DownloadQemuStatic [x86_64|arm|aarch64]
DownloadQemuStatic() {
    ARCH=$1

    QEMU_ARCH=$(GetQemuArch "$ARCH")
    if [ ! -f "qemu-${QEMU_ARCH}-static" ]; then
        QEMU_DOWNLOAD_URL="https://github.com/multiarch/qemu-user-static/releases/download"
        QEMU_LATEST_TAG=$(curl -s https://api.github.com/repos/multiarch/qemu-user-static/tags \
            | grep 'name.*v[0-9]' \
            | head -n 1 \
            | cut -d '"' -f 4)
        curl -SL "${QEMU_DOWNLOAD_URL}/${QEMU_LATEST_TAG}/x86_64_qemu-$QEMU_ARCH-static.tar.gz" \
            | tar xzv
    fi
}

TAG_BASE="$1"
if [ -z "$TAG_BASE" ]; then
    echo "We cannot tag Docker images with an empty string!" >&2
    exit 1
fi
ParseRequestedArch "${2}"

# Register QEMU handlers
docker run --rm --privileged multiarch/qemu-user-static:register --reset

# Step 1: Certbot core Docker
DOCKER_REPO="${DOCKER_HUB_ORG}/certbot"
for TARGET_ARCH in "${ALL_REQUESTED_ARCH[@]}"; do
    pushd "${REPO_ROOT}"
    DownloadQemuStatic "${TARGET_ARCH}"
    QEMU_ARCH=$(GetQemuArch "${TARGET_ARCH}")
    docker build \
        --build-arg TARGET_ARCH="${TARGET_ARCH}" \
        --build-arg QEMU_ARCH="${QEMU_ARCH}" \
        -f "${WORK_DIR}/core/Dockerfile" \
        -t "${DOCKER_REPO}:${TARGET_ARCH}-${TAG_BASE}" \
        .
    popd
done

# Step 2: Certbot DNS plugins Docker images
for plugin in "${CERTBOT_PLUGINS[@]}"; do
    DOCKER_REPO="${DOCKER_HUB_ORG}/${plugin}"
    pushd "${REPO_ROOT}/certbot-${plugin}"
    # Copy QEMU static binaries downloaded when building the core Certbot image
    cp ../qemu-*-static .
    for TARGET_ARCH in "${ALL_REQUESTED_ARCH[@]}"; do
        QEMU_ARCH=$(GetQemuArch "${TARGET_ARCH}")
        BASE_IMAGE="${DOCKER_HUB_ORG}/certbot:${TARGET_ARCH}-${TAG_BASE}"
        docker build \
            --build-arg BASE_IMAGE="${BASE_IMAGE}" \
            --build-arg QEMU_ARCH="${QEMU_ARCH}" \
            -f "${WORK_DIR}/plugin/Dockerfile" \
            -t "${DOCKER_REPO}:${TARGET_ARCH}-${TAG_BASE}" \
            .
    done
    popd
done
