#!/bin/zsh

set -euo pipefail

export PATH="/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:${PATH:-}"

LABEL="ai.bifrost.redis-stack"
PORT="${REDIS_STACK_PORT:-6380}"
SCRIPT_DIR=${0:A:h}
PROJECT_ROOT=${SCRIPT_DIR:h}
SOURCE_PLIST="${PROJECT_ROOT}/config/launchd/${LABEL}.plist"
TARGET_PLIST="${HOME}/Library/LaunchAgents/${LABEL}.plist"
READY_FILE="${HOME}/.local/state/mcp/ready/redis-stack-bifrost.ready"
GUI_DOMAIN="gui/$(id -u)"

usage() {
    print "Usage: redis-stack-ctl {install|start|stop|restart|status}"
}

install_plist() {
    mkdir -p "${HOME}/Library/LaunchAgents"
    cp "${SOURCE_PLIST}" "${TARGET_PLIST}"
    plutil -lint "${TARGET_PLIST}" >/dev/null
}

bootstrap() {
    launchctl bootstrap "${GUI_DOMAIN}" "${TARGET_PLIST}"
}

bootout() {
    launchctl bootout "${GUI_DOMAIN}/${LABEL}" >/dev/null 2>&1 || true
    launchctl bootout "${GUI_DOMAIN}" "${TARGET_PLIST}" >/dev/null 2>&1 || true
}

print_ready_state() {
    if [[ -f "${READY_FILE}" ]]; then
        print "ready file: ${READY_FILE}"
    else
        print "ready file missing: ${READY_FILE}"
    fi
}

case "${1:-}" in
    install)
        install_plist
        print "Installed ${TARGET_PLIST}"
        ;;
    start)
        install_plist
        bootout
        sleep 1
        bootstrap
        launchctl kickstart -k "${GUI_DOMAIN}/${LABEL}"
        ;;
    stop)
        bootout
        rm -f "${READY_FILE}"
        ;;
    restart)
        install_plist
        bootout
        sleep 1
        bootstrap
        launchctl kickstart -k "${GUI_DOMAIN}/${LABEL}"
        ;;
    status)
        if launchctl print "${GUI_DOMAIN}/${LABEL}" >/tmp/redis-stack-status.$$ 2>/dev/null; then
            rg -n "state =|pid =|last exit code =|path =" /tmp/redis-stack-status.$$
            rm -f /tmp/redis-stack-status.$$
        else
            rm -f /tmp/redis-stack-status.$$
            print "service not loaded: ${LABEL}"
        fi
        lsof -nP -iTCP:"${PORT}" -sTCP:LISTEN || true
        print_ready_state
        ;;
    *)
        usage
        exit 64
        ;;
esac
