#!/usr/bin/env bash
# Runs `make test package watchapp android` inside the local build-image
# container, mirroring what the Gitea Actions build workflow does -
# useful for testing build-image changes locally before pushing
# anything to cr.ladkau.de.
#
# Usage: ./run-image.sh [VERSION]
#   VERSION is passed through to `make` (see the Makefile's `package`/
#   `watchapp`/`android` targets); omit it for their own git-tag-based
#   default.
set -euo pipefail

cd "$(dirname "${BASH_SOURCE[0]}")"
ROOT="$(pwd)"

fail() { echo "PREFLIGHT FAIL: $*" >&2; exit 1; }

command -v docker >/dev/null 2>&1 \
    || fail "docker not found in PATH"

[ -f "$ROOT/registry.env" ] \
    || fail "registry.env not found — copy registry.env.example to registry.env and fill in your cr.ladkau.de credentials"

# shellcheck disable=SC1091
source "$ROOT/registry.env"

: "${REGISTRY_IMAGE:?registry.env must set REGISTRY_IMAGE}"

IMAGE_TAG="$(<"$ROOT/build-image/VERSION")"
[ -n "$IMAGE_TAG" ] || fail "build-image/VERSION is empty"
IMAGE="$REGISTRY_IMAGE:$IMAGE_TAG"

docker image inspect "$IMAGE" >/dev/null 2>&1 \
    || fail "$IMAGE not found locally — run ./build-image.sh first"

VERSION="${1:-${VERSION:-}}"

# CI always starts from a fresh checkout, but this script bind-mounts the
# live host repo — so build output left over from a previous local run
# (build/, dist/, watch/build, the generated watch resources below, and
# the Android app's own build/generated-resource dirs) would make this
# run skip work a real fresh checkout wouldn't, silently hiding bugs that
# only show up in CI. Wipe them first so every run exercises a true
# from-scratch build, same as CI.
echo "== Cleaning generated build artifacts for a fresh build =="
rm -rf \
    "$ROOT/build" "$ROOT/dist" "$ROOT/watch/build" \
    "$ROOT/watch/resources/img" "$ROOT/watch/resources/app_icon.png" \
    "$ROOT/watch/src/c/i18n_tables.auto.c" \
    "$ROOT/android/build" "$ROOT/android/app/build" "$ROOT/android/app/.cxx" \
    "$ROOT/android/app/src/main/assets/i18n" "$ROOT/android/app/src/main/res/drawable-nodpi" \
    "$ROOT/android/app/src/main/res"/mipmap-mdpi "$ROOT/android/app/src/main/res"/mipmap-hdpi \
    "$ROOT/android/app/src/main/res"/mipmap-xhdpi "$ROOT/android/app/src/main/res"/mipmap-xxhdpi \
    "$ROOT/android/app/src/main/res"/mipmap-xxxhdpi

echo "== Running make test package watchapp android inside $IMAGE =="
# The container runs as root (needed for the toolchain baked into the
# image), so anything it writes into this bind mount — dist/, build/,
# watch/build, android/.gradle, etc. — would otherwise come back owned
# by root, leaving the host repo unusable without sudo. Chown everything
# back to the host user on exit, whether the build succeeds or fails.
docker run --rm \
    -v "$ROOT:/workspace" \
    -w /workspace \
    -e VERSION="$VERSION" \
    -e HOST_UID="$(id -u)" \
    -e HOST_GID="$(id -g)" \
    "$IMAGE" \
    bash -c '
        git config --global --add safe.directory /workspace
        trap "chown -R \"$HOST_UID:$HOST_GID\" /workspace" EXIT
        make test package watchapp android
    '

echo "== Done — artifacts in dist/ =="
ls -la "$ROOT/dist"
