#!/bin/bash
# Close TalkEdit processes (Tauri dev and Python backend)

KILLED_ANY=0

kill_pids() {
    local label=$1
    shift
    local pids=("$@")

    [[ ${#pids[@]} -eq 0 ]] && return

    echo "Stopping $label (PID(s): ${pids[*]})..."
    kill -TERM "${pids[@]}" 2>/dev/null || true
    sleep 0.7

    local survivors=()
    local pid
    for pid in "${pids[@]}"; do
        if kill -0 "$pid" 2>/dev/null; then
            survivors+=("$pid")
        fi
    done

    if [[ ${#survivors[@]} -gt 0 ]]; then
        echo "Force killing stubborn $label PID(s): ${survivors[*]}"
        kill -KILL "${survivors[@]}" 2>/dev/null || true
    fi

    KILLED_ANY=1
}

kill_tree() {
    local pid=$1
    local children
    children=$(pgrep -P "$pid" 2>/dev/null || true)
    if [[ -n "$children" ]]; then
        local child
        for child in $children; do
            kill_tree "$child"
        done
    fi
    kill_pids "process tree" "$pid"
}

kill_port() {
    local port=$1
    local name=$2
    local pids
    pids=$(lsof -ti tcp:"$port" 2>/dev/null)
    if [[ -n "$pids" ]]; then
        # Kill any children first so watcher subprocesses do not survive.
        local pid
        for pid in $pids; do
            kill_tree "$pid"
        done
        kill_pids "$name listener on port $port" $pids
    fi
}

kill_pattern() {
    local pattern=$1
    local label=$2
    local pids
    pids=$(pgrep -f "$pattern" 2>/dev/null)
    if [[ -n "$pids" ]]; then
        kill_pids "$label" $pids
    fi
}

# --- TalkEdit (Tauri, port 8000) ---
kill_port 8000 "TalkEdit"
kill_port 5173 "TalkEdit frontend"
kill_pattern "tauri.*TalkEdit\|TalkEdit.*tauri\|cargo.*tauri dev\|/TalkEdit/target/debug" "TalkEdit (Tauri dev)"
# Vite dev server for TalkEdit (fallback when not bound to 5173 yet)
kill_pattern "[/ ]vite([[:space:]]|$)\|[/ ]rsbuild([[:space:]]|$)" "TalkEdit frontend dev server"

# --- Orphaned uvicorn workers ---
kill_pattern "uvicorn.*main:app.*--port 8000" "leftover uvicorn workers (TalkEdit)"
kill_pattern "uvicorn.*main:app.*--port 8642" "leftover uvicorn workers"

if [[ $KILLED_ANY -eq 0 ]]; then
    echo "Nothing to close — no TalkEdit processes found."
else
    echo "Done."
fi
