#!/bin/bash

# omarchy:summary=Notify the user when Omarchy has pending migrations

set -euo pipefail

update_in_progress() {
  local lock="${XDG_RUNTIME_DIR:-}/omarchy-update.lock"

  [[ -n ${XDG_RUNTIME_DIR:-} && -f $lock ]] || return 1

  # flock -n only fails here when the lock is held, since the file is ours.
  ! flock -n "$lock" true 2>/dev/null
}

if update_in_progress; then
  exit 0
fi

pending_migrations=$(omarchy-migrate --pending 2>/dev/null) || exit 0
pending_count=$(printf '%s\n' "$pending_migrations" | sed '/^[[:space:]]*$/d' | wc -l)

if (( pending_count == 1 )); then
  message="Click to run 1 pending migration."
else
  message="Click to run $pending_count pending migrations."
fi

# This runs from omarchy-migrate-notify.service after graphical-session.target,
# but the target can be reached before the shell has claimed
# org.freedesktop.Notifications. Without the wait the toast is sent into the
# void and the user never learns about their pending migrations.
omarchy-notification-wait || true

# That wait is long enough for an update to start underneath us, and the count
# above is already stale by then, so re-check before spending the toast.
if update_in_progress; then
  exit 0
fi

# The shell keeps the click command with the toast, so this oneshot can hand the
# invitation over and exit instead of staying activated until it is answered.
omarchy-notification-send -u critical -g  "Pending Omarchy Migrations" "$message" \
  --exec "omarchy-launch-floating-terminal-with-presentation omarchy-migrate" && exit 0

# Reached when the notification could not be handed off, so fall back to telling
# the user in the terminal.
print_pending_migrations() {
  echo "Omarchy has pending migrations. Run omarchy-migrate in a terminal to apply them:"
  while IFS= read -r migration; do
    [[ -n $migration ]] || continue
    printf '  %s\n' "$migration"
  done <<<"$pending_migrations"
}

if [[ -t 1 ]]; then
  print_pending_migrations
else
  print_pending_migrations >&2
fi
