#!/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/glib/${base}:${base_version}"

if [ $build == 1 ]; then
        echo -e "\e[1;32mBUILDING\e[0m: ${base} as ${TAG}"
        $SUDO_CMD docker build \
                --build-arg HOST_USER_ID="$UID" \
                --build-arg COVERITY_SCAN_PROJECT_NAME="${COVERITY_SCAN_PROJECT_NAME}" \
                --build-arg COVERITY_SCAN_TOKEN="${COVERITY_SCAN_TOKEN}" \
                --tag "${TAG}" \
                --file "${base}.Dockerfile" .
        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
