#!/bin/bash
# ============================================================
#  RadioRations launcher — dual AIOC (APRS + Winlink)
#  APRS: Graywolf or Direwolf on aioc-aprs (exclusive of each other)
#  Winlink: direwolf-winlink on aioc-winlink (can run with APRS)
# ============================================================

RED='\033[0;31m'
BRED='\033[0;91;49m'
GREEN='\033[0;32m'
BLUE='\033[0;34;49m'
CYBER='\x1b[32;40m'
DOS='\033[0;97;44m'
CARNAGE='\033[0;92;45m'
GRAYSCALE='\033[0;30;100m'
GRAYLINE='\033[0;90;49m'
YELLOW='\033[1;33m'
CYAN='\033[0;36m'
NC='\033[0m'

# APRS stack only — never stop direwolf-winlink here
stop_aprs_modems() {
    echo -e "${YELLOW}Stopping APRS modems (Graywolf / Direwolf)...${NC}"
    sudo systemctl stop direwolf 2>/dev/null || true
    sudo systemctl stop graywolf 2>/dev/null || true
    sleep 1
}

show_banner() {
    clear
    echo -e "${CYBER}"
    cat << 'EOF'
 ___         _  o      ___       _  o             
 ))_) ___  __)) _  __  ))_) ___  )L _  __  _ _  __
((`\ ((_( ((_( (( ((_)((`\ ((_( (( (( ((_)((\( _))
EOF
    echo -e "${NC}"
    echo -e "${CARNAGE}   KM7HBN  •  dual AIOC  •  APRS + Winlink + BBS/Chat  ${NC}"
    echo
}

show_ports() {
    echo -e "${GRAYLINE}-----------------------------------------------${NC}"
    echo " Ports:"
    echo "   APRS  Graywolf Web    : 8080"
    echo "   APRS  Graywolf KISS   : 8001 (localhost)"
    echo "   APRS  Graywolf AGW    : 8000 (if enabled)"
    echo "   APRS  Direwolf AGW    : 8000"
    echo "   APRS  Direwolf KISS   : 8001"
    echo "   Winlink Direwolf AGW  : 8002"
    echo "   Winlink Direwolf KISS : 8003"
    echo "   LinBPQ Telnet         : 8010"
    echo "   LinBPQ Web            : 8090"
    echo "   Pat Web               : 8081"
    echo "   gpsd                  : 2947"
    echo -e "${GRAYLINE}-----------------------------------------------${NC}"
}

svc_line() {
    local name="$1"
    local unit="$2"
    if systemctl is-active --quiet "$unit" 2>/dev/null; then
        echo -e "  ${name}: ${GREEN}running${NC}"
    else
        echo -e "  ${name}: ${RED}stopped${NC}"
    fi
}

# Map friendly names → systemd units
resolve_unit() {
    case "$1" in
        direwolf|aprs-direwolf)   echo "direwolf" ;;
        graywolf|aprs)            echo "graywolf" ;;
        winlink|direwolf-winlink|wl) echo "direwolf-winlink" ;;
        linbpq|bpq|bbs)           echo "linbpq" ;;
        pat)                      echo "pat" ;;
        gpsd|gps)                 echo "gpsd" ;;
        chrony|ntp|time)          echo "chrony" ;;
        *)                        echo "$1" ;;
    esac
}

restart_services() {
    if [[ $# -lt 1 ]]; then
        echo -e "${YELLOW}Usage: $0 restart <service> [service...]${NC}"
        echo "  Services: direwolf graywolf winlink linbpq pat gpsd chrony"
        echo "  Aliases:  aprs→graywolf  wl→direwolf-winlink  bpq→linbpq  gps→gpsd"
        return 1
    fi
    local arg unit
    for arg in "$@"; do
        unit="$(resolve_unit "$arg")"
        echo -e "${GREEN}Restarting ${unit}...${NC}"
        if sudo systemctl restart "$unit"; then
            sleep 0.5
            if systemctl is-active --quiet "$unit"; then
                echo -e "  ${unit}: ${GREEN}running${NC}"
            else
                echo -e "  ${unit}: ${RED}not running after restart${NC}"
                systemctl --no-pager -l status "$unit" 2>/dev/null | tail -8 || true
            fi
        else
            echo -e "  ${unit}: ${RED}restart failed${NC}"
        fi
    done
}

case "${1:-}" in
    direwolf)
        show_banner
        stop_aprs_modems
        echo -e "${GREEN}Starting APRS Direwolf + LinBPQ + Pat + Winlink TNC...${NC}"
        sudo systemctl start direwolf
        sudo systemctl start direwolf-winlink
        sudo systemctl start linbpq
        sudo systemctl start pat
        echo
        "$0" status
        ;;
    graywolf)
        show_banner
        stop_aprs_modems
        echo -e "${GREEN}Starting Graywolf (APRS) + LinBPQ + Pat + Winlink TNC...${NC}"
        sudo systemctl start graywolf
        sudo systemctl start direwolf-winlink
        sudo systemctl start linbpq
        sudo systemctl start pat
        echo
        "$0" status
        ;;
    winlink)
        show_banner
        echo -e "${GREEN}Starting Winlink TNC (direwolf-winlink) + Pat...${NC}"
        sudo systemctl start direwolf-winlink
        sudo systemctl start pat
        echo
        "$0" status
        ;;
    stop-winlink)
        show_banner
        echo -e "${YELLOW}Stopping Winlink TNC + Pat...${NC}"
        sudo systemctl stop direwolf-winlink 2>/dev/null || true
        sudo systemctl stop pat 2>/dev/null || true
        echo
        "$0" status
        ;;
    stop)
        show_banner
        echo -e "${YELLOW}Stopping all radio services...${NC}"
        sudo systemctl stop direwolf 2>/dev/null || true
        sudo systemctl stop graywolf 2>/dev/null || true
        sudo systemctl stop direwolf-winlink 2>/dev/null || true
        sudo systemctl stop linbpq 2>/dev/null || true
        sudo systemctl stop pat 2>/dev/null || true
        echo
        "$0" status
        ;;
    status)
        show_banner
        echo "==============================================="
        echo "              SERVICE STATUS"
        echo "==============================================="
        echo " APRS (aioc-aprs):"
        svc_line "  Direwolf     " direwolf
        svc_line "  Graywolf     " graywolf
        echo " Winlink (aioc-winlink):"
        svc_line "  Direwolf-WL  " direwolf-winlink
        echo " Shared:"
        svc_line "  LinBPQ       " linbpq
        svc_line "  Pat          " pat
        svc_line "  gpsd         " gpsd
        svc_line "  chrony       " chrony
        echo "==============================================="
        show_ports
        ;;
    log-direwolf)
        show_banner
        echo -e "${CYAN}=== Direwolf (APRS) log — Ctrl-C to exit ===${NC}"
        journalctl -u direwolf -f
        ;;
    log-winlink)
        show_banner
        echo -e "${CYAN}=== Direwolf Winlink log — Ctrl-C to exit ===${NC}"
        journalctl -u direwolf-winlink -f
        ;;
    log-graywolf)
        show_banner
        echo -e "${CYAN}=== Graywolf log — Ctrl-C to exit ===${NC}"
        journalctl -u graywolf -f
        ;;
    log-linbpq)
        show_banner
        echo -e "${CYAN}=== LinBPQ log — Ctrl-C to exit ===${NC}"
        journalctl -u linbpq -f
        ;;
    log-pat)
        show_banner
        echo -e "${CYAN}=== Pat log — Ctrl-C to exit ===${NC}"
        journalctl -u pat -f
        ;;
    restart)
        show_banner
        shift
        restart_services "$@"
        echo
        "$0" status
        ;;
    logs)
        show_banner
        echo "Which log?"
        echo "  1) Direwolf APRS   2) Direwolf Winlink"
        echo "  3) Graywolf        4) LinBPQ   5) Pat"
        read -r -p "Choice [1-5]: " choice
        case $choice in
            1) "$0" log-direwolf ;;
            2) "$0" log-winlink ;;
            3) "$0" log-graywolf ;;
            4) "$0" log-linbpq ;;
            5) "$0" log-pat ;;
            *) echo "Invalid choice" ;;
        esac
        ;;
    *)
        show_banner
        echo -e "Usage: ${YELLOW}$0 ${BLUE}{${BRED}graywolf${GREEN}|${BRED}direwolf${GREEN}|${BRED}winlink${GREEN}|${BRED}stop-winlink${GREEN}|${BRED}stop${GREEN}|${BRED}restart${GREEN}|${BRED}status${GREEN}|${BRED}logs${BLUE}}${NC}"
        echo
        echo "  graywolf      APRS via Graywolf (stops other APRS modem)"
        echo "                keeps/starts Winlink TNC + LinBPQ + Pat"
        echo "  direwolf      APRS via Direwolf (stops Graywolf)"
        echo "                keeps/starts Winlink TNC + LinBPQ + Pat"
        echo "  winlink       Start Winlink TNC + Pat only"
        echo "  stop-winlink  Stop Winlink TNC + Pat"
        echo "  stop          Stop everything"
        echo "  restart SVC   Restart one or more services"
        echo "                e.g. rr restart gpsd"
        echo "                     rr restart graywolf linbpq"
        echo "                SVCs: direwolf graywolf winlink linbpq pat gpsd chrony"
        echo "  status        Status + ports + devices"
        echo "  logs          Interactive log menu"
        echo
        show_ports
        exit 1
        ;;
esac
