# Include guard to prevent running hooks more than once
if [ -n "${_catkin_setup_hook_loaded:-}" ]; then return; fi
_catkin_setup_hook_loaded=1

# Load catkin environment hooks. This mimics the behavior of _setup_util.py.

declare -gA _catkinPackagesSeen
declare -gA _catkinGenericEnvHooks
declare -gA _catkinSpecificEnvHooks

_findCatkinEnvHooks() {
  local pkg="$1"
  local pkgEnvHookDir="$pkg/etc/catkin/profile.d"
  # Deduplicate the packages
  if [ -z "${_catkinPackagesSeen["$pkg"]:-}" ] && [ -d "$pkgEnvHookDir" ]; then
    while IFS= read -rd '' hook; do
      case "$hook" in
        *.sh) _catkinGenericEnvHooks["$(basename "$hook")"]="$hook" ;;
        *) _catkinSpecificEnvHooks["$(basename "$hook")"]="$hook" ;;
      esac
    done < <(find "$pkgEnvHookDir" \( -name "*.sh" -o -name "*.$CATKIN_SHELL" \) -print0)
  fi
  _catkinPackagesSeen["$pkg"]=1
}
addEnvHooks "$targetOffset" _findCatkinEnvHooks

_runCatkinEnvHook() {
  [ -n "$1" ] || return 0
  # Causes hooks to look in the wrong place
  unset CATKIN_ENV_HOOK_WORKSPACE
  # Some hooks assume set +u
  set +u
  # Some hooks fail in stripped down bash during builds
  source "$1" || true
  set -u
}

_runCatkinEnvHooksArray() {
  # Run hooks in sorted order of their file names
  # This would fail if a filename contained EOT
  
  # Work around https://github.com/NixOS/nix/issues/5262
  local eot=$(printf '\004')
  while IFS= read -rd '' hook; do
    _runCatkinEnvHook "$hook"
  done < <(printf "%s\0" "$@" | \
           # Replace final / with EOT, separating the file name
           sed -z 's|\(.*\)/|\1'${eot}'|' | \
           # Sort on second EOT separated field (file name)
           LC_ALL=C sort -zt${eot} -k2 | \
           # Substitute / back in for EOT
           sed -z 's|'${eot}'|/|')
}

_runCatkinEnvHooks() {
  _runCatkinEnvHooksArray "${_catkinGenericEnvHooks[@]}"
  _runCatkinEnvHooksArray "${_catkinSpecificEnvHooks[@]}"
}
postHooks+=(_runCatkinEnvHooks)

_catkinPostPatchHook() {
  while IFS= read -rd '' cfg; do
    patchShebangs "$cfg"
  done < <(find . -name '*.cfg' -executable -print0)
}
postPatchHooks+=(_catkinPostPatchHook)

_catkinPreConfigureHook() {
  cmakeFlags+=" -DCATKIN_ENABLE_TESTING=${doCheck:-OFF}"
  # Don't try to detect Debian/Ubuntu when sandbox is disabled
  cmakeFlags+=" -DSETUPTOOLS_DEB_LAYOUT=OFF"
  # Don't install setup scripts or .catkin workspace marker. Unfortunately,
  # we still need the marker for the environment hooks, so it is created
  # manually.
  cmakeFlags+=" -DCATKIN_BUILD_BINARY_PACKAGE=ON"
}
preConfigureHooks+=(_catkinPreConfigureHook)

_catkinMarkerHook() {
  # The ROS_PACKAGE_PATH hook needs the .catkin marker
  touch "$out/.catkin"
}
postInstallHooks+=(_catkinMarkerHook)

_catkinWrapperHook() {
  wrapPythonPrograms
}
postFixupHooks+=(_catkinWrapperHook)

export CATKIN_SHELL=bash
