#!/usr/bin/env bash

set -euo pipefail

readonly SCRIPT_DIR="$(CDPATH= cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)"
readonly REGISTRY_IMAGE="registry.assecutor.org/votianlt"
readonly BACKEND_DIR="${SCRIPT_DIR}"

usage() {
  cat <<'EOF'
Verwendung:
  ./docker_push.sh [x.y.z]

Beispiel:
  ./docker_push.sh 0.9.13
  ./docker_push.sh

Voraussetzungen:
  - Docker Buildx ist installiert
  - Login zur Registry wurde bereits ausgeführt:
    docker login registry.assecutor.org

Ohne Versionsargument wird automatisch die Version aus der pom.xml verwendet.
EOF
}

fail() {
  echo "Fehler: $*" >&2
  exit 1
}

require_command() {
  command -v "$1" >/dev/null 2>&1 || fail "'$1' wurde nicht gefunden."
}

resolve_pom_version() {
  [[ -x "${BACKEND_DIR}/mvnw" ]] || fail "'${BACKEND_DIR}/mvnw' wurde nicht gefunden oder ist nicht ausführbar."

  local version
  version="$(
    cd "${BACKEND_DIR}" && ./mvnw -q -DforceStdout help:evaluate -Dexpression=project.version \
      | awk 'NF { last = $0 } END { print last }'
  )"

  [[ -n "${version}" ]] || fail "Version konnte nicht aus der pom.xml ermittelt werden."
  echo "${version}"
}

VERSION="${1:-$(resolve_pom_version)}"

if [[ "${VERSION}" == "-h" || "${VERSION}" == "--help" ]]; then
  usage
  exit 0
fi

if [[ ! "${VERSION}" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
  fail "Versionsnummer muss das Format x.y.z haben."
fi

require_command docker
docker buildx version >/dev/null 2>&1 || fail "Docker Buildx ist nicht verfügbar."

cd "${SCRIPT_DIR}"

echo "Verwende Release-Version ${VERSION}."
echo "Baue Production-JAR für Version ${VERSION} ..."
(cd "${BACKEND_DIR}" && ./mvnw -Pproduction -DskipTests -Drevision="${VERSION}" package)

JAR_FILE_REL="target/votianlt-${VERSION}.jar"
JAR_FILE_ABS="${BACKEND_DIR}/${JAR_FILE_REL}"
[[ -f "${JAR_FILE_ABS}" ]] || fail "Release-JAR wurde nicht gefunden: ${JAR_FILE_ABS}"

echo "Pushe Image ${REGISTRY_IMAGE}:${VERSION} ..."
docker buildx build \
  --platform linux/amd64 \
  -f "${BACKEND_DIR}/Dockerfile" \
  --build-arg "JAR_FILE=${JAR_FILE_REL}" \
  -t "${REGISTRY_IMAGE}:${VERSION}" \
  --push \
  "${BACKEND_DIR}"

echo "Fertig: ${REGISTRY_IMAGE}:${VERSION}"
