#!/usr/bin/env bash
# Evomedia.net Token Savers — https://github.com/kellymichels/zscripts-token-savers
# Created by Kelly Michels · dev@evomedia.net
# Licensed under the MIT License. See LICENSE.
#
# zkill — stop local dev-server listeners for a project (bash port of ZKillOnly.ps1).
#
# Usage:
#   zkill <project> [<project> ...] [--port N] [--kill-all]

set -uo pipefail
source "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/zhelpers.sh"
z_track_start "$@"
z_need_config
z_require lsof

projects=(); port_override=0; kill_all=0
while [ $# -gt 0 ]; do
  case "$1" in
    -p|--port)  port_override="${2:-0}"; shift 2 ;;
    --kill-all) kill_all=1; shift ;;
    --)         shift; break ;;
    -*)         err "Unknown option: $1"; exit 1 ;;
    *)          projects+=("$1"); shift ;;
  esac
done

if [ "${#projects[@]}" -eq 0 ]; then
  warn "Usage: zkill <project> [<project> ...] [--port N] [--kill-all]"
  dim  "  Projects in zconfig.json: $(zproj_csv)"
  exit 1
fi

# --kill-all (kill stray project processes beyond the dev-port listener) isn't
# ported yet; announce it rather than silently accepting the flag and doing nothing.
[ "$kill_all" -eq 1 ] && warn "Note: --kill-all isn't implemented in the bash port yet - killing dev-port listeners only."

for key in "${projects[@]}"; do
  zproj_require "$key"
  label="$(zproj "$key" .label)"; [ -n "$label" ] || label="$key"

  if [ "$port_override" -gt 0 ] 2>/dev/null; then
    port="$port_override"
  else
    port="$(zproj "$key" .ports.dev)"
  fi

  printf '\n'; info "=== zkill ($label) ==="
  if [[ "$port" =~ ^[0-9]+$ ]] && [ "$port" -gt 0 ]; then
    dim "Port: $port"
    killed="$(kill_listeners "$port")"
  else
    warn "No dev port configured for '$key' - skipping port kill."
    killed=0
  fi

  # TODO (parity with ZKillOnly.ps1 -KillAll): also stop stray project processes.
  if [ "${killed:-0}" -gt 0 ]; then
    note "  $killed process(es) stopped"
  else
    ok   "  Nothing to kill"
  fi
done
printf '\n'; info "Kill complete."
