#!/usr/bin/env bash
set -eu

if [[ ${GITHUB_ACTIONS-} = true && ${RUNNER_NAME-} = "Github Actions"* ]]; then
  # low disk space available on public runners...
  echo "enabled GC between builds due to restricted disk space..." >&2
  export NF_ACTIONS_TEST_GC=1
fi

NIX_BUILD_ARGS=(
  --show-trace
)
NIX_BUILD_ARGS_ASYNC=()

init_nfargs() {
  nflinksuffix="$1"
  shift

  nfargs=(
    "${NIX_BUILD_ARGS[@]}"
  )

  if [[ -n "${NF_ACTIONS_TEST_OUTLINK-}" || -n "${NF_UPDATE_CACHIX_PUSH-}" ]]; then
    nfargs+=(
      -o "${NF_ACTIONS_TEST_OUTLINK-result}$nflinksuffix"
    )
  else
    nfargs+=(
      --no-link
    )
  fi
}

nfgc() {
  if [[ -n ${NF_ACTIONS_TEST_GC-} ]]; then
    if [[ -n ${NF_UPDATE_CACHIX_PUSH-} ]]; then
      cachix push kittywitch "./${NF_ACTIONS_TEST_OUTLINK-result}$nflinksuffix"*/
      rm -f "./${NF_ACTIONS_TEST_OUTLINK-result}$nflinksuffix"*
    fi
    nix-collect-garbage -d
  fi
}

for nfsystem in "${NF_NIX_SYSTEMS[@]}"; do
  nfinstallable="${NF_CONFIG_ROOT}#nixosConfigurations.${nfsystem}.config.system.build.toplevel"
  init_nfargs "-$nfsystem"

  nfwarn=
  if [[ " ${NF_NIX_SYSTEMS_WARN[*]} " = *" $nfsystem "* ]]; then
    nfwarn=1
  fi

  if [[ -n ${NF_ACTIONS_TEST_ASYNC-} && -z $nfwarn ]]; then
    NIX_BUILD_ARGS_ASYNC+=("$nfinstallable")
    continue
  fi

  echo "building ${nfsystem}..." >&2
  echo >&2

  nfbuildexit=0
  nix build "$nfinstallable" \
    "${nfargs[@]}" \
    "$@" || nfbuildexit=$?

  if [[ $nfbuildexit -ne 0 ]]; then
    if [[ -n $nfwarn ]]; then
      echo "build failure allowed for ${nfsystem}, ignoring..." >&2
      continue
    fi
    exit $nfbuildexit
  fi

  nfgc
done

if [[ -n ${NF_ACTIONS_TEST_ASYNC-} ]]; then
  init_nfargs ""
  nix build \
    "${nfargs[@]}" \
    "${NIX_BUILD_ARGS_ASYNC[@]}" \
    "$@"

  nfgc
fi
