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

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

# Dispatch runs as system service instances keyed on the *invoking* user, so
# `bin/service start` brings the services up running as you (e.g. dispatch-api@tradam).
RUN_USER="$(id -un)"
API_UNIT="dispatch-api@${RUN_USER}"
FRONTEND_UNIT="dispatch-frontend@${RUN_USER}"

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

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

Commands:
  install    Install the dispatch packages (systemd system unit templates +
             application files in /opt/dispatch).
  start      Start dispatch-api and dispatch-frontend as ${RUN_USER}.
             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.

Services run as system instances for the current user:
  ${API_UNIT}
  ${FRONTEND_UNIT}
Start/stop use sudo (system manager). 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"

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

have_units() {
    systemctl 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 is-active "$API_UNIT" 2>/dev/null || echo "inactive")
    frontend_active=$(systemctl is-active "$FRONTEND_UNIT" 2>/dev/null || echo "inactive")

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

stop() {
    if ! have_units; then
        echo "dispatch services not installed."
        return 1
    fi
    sudo systemctl stop "$API_UNIT" "$FRONTEND_UNIT"
    echo "dispatch-api + dispatch-frontend stopped"
}

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

logs() {
    sudo journalctl -u "$API_UNIT" -u "$FRONTEND_UNIT" -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
