#!/usr/bin/env bash
set -euo pipefail

SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
PROJECT_DIR="$(dirname "$SCRIPT_DIR")"

cmd="${1:-help}"
shift 2>/dev/null || true

usage() {
    cat <<EOF
Usage: bin/service <command>

Commands:
  install    Install the dispatch packages (systemd user units +
             application files in /opt/dispatch).
  start      Start dispatch-api and dispatch-frontend.
             If already running, restart instead.
             Prints the frontend URL when ready.
  stop       Stop dispatch-api and dispatch-frontend.
  status     Show status of both services.
  logs       Tail journal output for both services.

After install, configure /etc/dispatch/dispatch-api.conf before starting.
EOF
}

install() {
    echo "==> Building fresh package..."
    "$PROJECT_DIR/bin/build-pkg"

    echo ""
    echo "==> Installing..."
    "$PROJECT_DIR/bin/install-pkg"

    systemctl --user daemon-reload
    echo ""
    echo "==> Installed. Edit /etc/dispatch/dispatch-api.conf, then run:"
    echo "      bin/service start"
}

have_units() {
    systemctl --user cat dispatch-api.service &>/dev/null
}

start() {
    if ! have_units; then
        echo "dispatch services not installed. Run: bin/service install"
        return 1
    fi
    local api_active frontend_active
    api_active=$(systemctl --user is-active dispatch-api 2>/dev/null || echo "inactive")
    frontend_active=$(systemctl --user is-active dispatch-frontend 2>/dev/null || echo "inactive")

    if [ "$api_active" = "active" ] || [ "$frontend_active" = "active" ]; then
        echo "==> Services already running (api=$api_active frontend=$frontend_active) — restarting"
        systemctl --user restart dispatch-api dispatch-frontend
    else
        systemctl --user start dispatch-api dispatch-frontend
    fi
    echo "dispatch-api + dispatch-frontend $( [ "$api_active" = "active" ] || [ "$frontend_active" = "active" ] && echo restarted || echo started )"
    echo "  → http://localhost:18391"
}

status() {
    if ! have_units; then
        echo "dispatch services not installed."
        return 1
    fi
    systemctl --user status dispatch-api dispatch-frontend --no-pager 2>/dev/null || true
}

logs() {
    journalctl --user -u dispatch-api -u dispatch-frontend -f "$@"
}

case "$cmd" in
    install)  install ;;
    start)    start ;;
    stop)     stop ;;
    status)   status ;;
    logs)     logs "$@" ;;
    help|--help|-h) usage ;;
    *)  echo "Unknown command: $cmd"; echo; usage; exit 1 ;;
esac
