#!/bin/bash

read_arg() {
    # $1 = arg name
    # $2 = arg value
    # $3 = arg parameter
    local rematch='^[^=]*=(.*)$'
    if [[ $2 =~ $rematch ]]; then
        read -r "$1" <<< "${BASH_REMATCH[1]}"
    else
        read -r "$1" <<< "$3"
        # There is no way to shift our callers args, so
        # return 1 to indicate they should do it instead.
        return 1
    fi
}

SUDO_CMD="sudo"
if docker -v |& grep -q podman; then
        # Using podman
        SUDO_CMD=""
        # Docker is actually implemented by podman, and its OCI output
        # is incompatible with some of the dockerd instances on GitLab
        # CI runners.
        export BUILDAH_FORMAT=docker
fi

set -e

base=""
base_version=""
build=0
run=0
push=0
list=0
print_help=0
no_login=0

while (($# > 0)); do
        case "${1%%=*}" in
                build) build=1;;
                run) run=1;;
                push) push=1;;
                list) list=1;;
                help) print_help=1;;
                --base|-b) read_arg base "$@" || shift;;
                --base-version) read_arg base_version "$@" || shift;;
                --no-login) no_login=1;;
                *) echo -e "\e[1;31mERROR\e[0m: Unknown option '$1'"; exit 1;;
        esac
        shift
done

if [ $print_help == 1 ]; then
        echo "$0 - Build and run Docker images"
        echo ""
        echo "Usage: $0 <command> [options] [basename]"
        echo ""
        echo "Available commands"
        echo ""
        echo "  build --base=<BASENAME> - Build Docker image <BASENAME>.Dockerfile"
        echo "  run --base=<BASENAME>   - Run Docker image <BASENAME>"
        echo "  push --base=<BASENAME>  - Push Docker image <BASENAME> to the registry"
        echo "  list                    - List available images"
        echo "  help                    - This help message"
        echo ""
        exit 0
fi

cd "$(dirname "$0")"

if [ $list == 1 ]; then
        echo "Available Docker images:"
        for f in *.Dockerfile; do
                filename=$( basename -- "$f" )
                basename="${filename%.*}"

                echo -e "  \e[1;39m$basename\e[0m"
        done
        exit 0
fi

# All commands after this require --base to be set
if [ -z "${base}" ]; then
        echo "Usage: $0 <command>"
        exit 1
fi

if [ ! -f "$base.Dockerfile" ]; then
        echo -e "\e[1;31mERROR\e[0m: Dockerfile for '$base' not found"
        exit 1
fi

if [ -z "${base_version}" ]; then
        base_version="latest"
else
        base_version="v$base_version"
fi

TAG="registry.gitlab.gnome.org/gnome/gnome-software/${base}:${base_version}"

if [ $build == 1 ]; then
        echo -e "\e[1;32mBUILDING\e[0m: ${base} as ${TAG}"
        BUILDDIR=`pwd`
        pushd ..
        $SUDO_CMD zip -9 $BUILDDIR/subprojects.meson.zip \
                meson.build \
                meson_options.txt \
                subprojects/appstream.wrap \
                subprojects/gnome-pwa-list.wrap \
                subprojects/gtk.wrap \
                subprojects/libadwaita.wrap \
                subprojects/libglib-testing.wrap \
                subprojects/libxmlb.wrap \
                subprojects/malcontent.wrap \
                subprojects/sysprof.wrap
        popd
        $SUDO_CMD docker build \
                --build-arg HOST_USER_ID="$UID" \
                --tag "${TAG}" \
                --file "${base}.Dockerfile" .
        $SUDO_CMD rm -r subprojects.meson.zip
        exit $?
fi

if [ $push == 1 ]; then
        echo -e "\e[1;32mPUSHING\e[0m: ${base} as ${TAG}"

        if [ $no_login == 0 ]; then
                $SUDO_CMD docker login registry.gitlab.gnome.org
        fi

        $SUDO_CMD docker push $TAG
        exit $?
fi

if [ $run == 1 ]; then
        echo -e "\e[1;32mRUNNING\e[0m: ${base} as ${TAG}"
        $SUDO_CMD docker run \
                --rm \
                --volume "$(pwd)/..:/home/user/app" \
                --workdir "/home/user/app" \
                --tty \
                --interactive "${TAG}" \
                bash
        exit $?
fi
