build_dir := justfile_directory() + "/build/just-albert"

_:
    just --justfile={{justfile()}} --choose

build B=build_dir:
    #!/usr/bin/env bash
    set -xeuo pipefail
    cmake -S "{{justfile_directory()}}" -B "{{B}}"
    cmake --build "{{B}}"

launch B=build_dir *args="":
    QT_LOGGING_RULES="albert*=true" "{{B}}/bin/albert" -p "{{B}}/lib" {{args}}

test B=build_dir:
    #!/usr/bin/env bash
    set -xeuo pipefail
    cmake -S "{{justfile_directory()}}" -B "{{B}}" -DBUILD_TESTS=ON
    cmake --build "{{B}}"
    ctest --test-dir "{{B}}"

install B=build_dir:
    #!/usr/bin/env bash
    set -xeuo pipefail
    cmake -S "{{justfile_directory()}}" -B "{{B}}" -DBUILD_TESTS=ON
    cmake --build "{{B}}"
    ctest --test-dir "{{B}}"
    cmake --install "{{B}}" --prefix /usr

test-plugin plugin B=build_dir:
    #!/usr/bin/env bash
    set -xeuo pipefail
    build_dir="{{B}}-plugin-{{plugin}}"
    cmake -S "{{justfile_directory()}}/plugins/{{plugin}}" -B "$build_dir" -DBUILD_TESTS=ON
    cmake --build "$build_dir"
    ctest --test-dir "$build_dir"
    cmake --install "{{B}}" --prefix /usr

_full-test B=build_dir: (install B) (test-plugin "applications" B)

# --- Dockerized ---

_build_image os="ubuntu" version="latest" *args="":
    docker build \
      --progress plain \
      --file "{{justfile_directory()}}/.docker/{{os}}.Dockerfile" \
      --build-arg BASE_IMAGE="{{os}}:{{version}}" \
      --tag albert:{{os}}-{{version}} \
      {{args}} .

build_image os version *args: (_build_image os version "--target base" args)

build_dev_image os version *args: (_build_image os version "--target dev" args)

build-image-archlinux version='latest':
    @just build_image "archlinux" {{version}} --platform linux/amd64

build-image-fedora version='latest':
    @just build_image "fedora" {{version}}

build-image-ubuntu version='latest':
    @just build_image "ubuntu" {{version}}

run-in-build-env os version *args:
    docker run --rm \
      -v "${HOST_WORKSPACE:-{{justfile_directory()}}}:/src:ro" \
      -v albert-build-{{os}}-{{version}}:/build \
      -v albert-ccache-{{os}}-{{version}}:/root/.cache/ccache \
      -w /src \
      --name "albert-{{os}}-{{version}}" \
      {{args}}

build-on os="ubuntu" version="24.04":
    @just --justfile={{justfile()}} build-image-{{os}} {{version}}
    @just --justfile={{justfile()}} run-in-build-env {{os}} {{version}} \
      albert:{{os}}-{{version}} \
      just build /build

full-test-on os="ubuntu" version="24.04":
    @just --justfile={{justfile()}} build-image-{{os}} {{version}}
    @just --justfile={{justfile()}} run-in-build-env {{os}} {{version}} \
      albert:{{os}}-{{version}} \
      just _full-test /build

full-test-all: (full-test-on "archlinux" "latest") \
               (full-test-on "fedora" "latest") \
               (full-test-on "ubuntu" "24.04")

launch-on os="ubuntu" version="latest" *args="": (build-on os version)
    @just --justfile={{justfile()}} run-in-build-env {{os}} {{version}} \
      -e QT_LOGGING_RULES="albert*=true" \
      -e DISPLAY="host.docker.internal:0" \
      albert:{{os}}-{{version}} \
      just full-test /build \
      /build/bin/albert -p /build/lib {{args}}
