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

ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
POS_DIR="${ROOT_DIR}/../eversatile-pos"
EBM_DIR="${ROOT_DIR}/../eversatile-business-manager"

is_listening() {
    local port="$1"
    lsof -nP -iTCP:"${port}" -sTCP:LISTEN >/dev/null 2>&1
}

add_service() {
    local name="$1"
    local port="$2"
    local cwd="$3"
    local command="$4"
    local color="$5"

    if is_listening "${port}"; then
        printf '%s already running on port %s\n' "${name}" "${port}"
        return 0
    fi

    SERVICE_NAMES+=("${name}")
    SERVICE_COLORS+=("${color}")
    SERVICE_COMMANDS+=("cd '${cwd}' && ${command}")
}

SERVICE_NAMES=()
SERVICE_COLORS=()
SERVICE_COMMANDS=()

add_service "control-panel" "8000" "${ROOT_DIR}" "php artisan serve --host=127.0.0.1 --port=8000" "#93c5fd"
add_service "control-panel-vite" "5173" "${ROOT_DIR}" "npm run dev -- --host 127.0.0.1 --port 5173" "#fdba74"
add_service "pos" "3000" "${POS_DIR}" "npm run dev -- --hostname 127.0.0.1 --port 3000" "#c4b5fd"
add_service "ebm" "3001" "${EBM_DIR}" "npm run dev -- --hostname 127.0.0.1 --port 3001" "#fb7185"

if [ "${#SERVICE_COMMANDS[@]}" -eq 0 ]; then
    printf 'All requested services are already running.\n'
    exit 0
fi
printf 'Available URLs:\n'
printf '  Control panel: http://127.0.0.1:8000\n'
printf '  Control panel Vite: http://127.0.0.1:5173\n'
printf '  POS: http://127.0.0.1:3000\n'
printf '  EBM: http://127.0.0.1:3001\n\n'

npx concurrently -k -c "$(IFS=,; echo "${SERVICE_COLORS[*]}")" --names "$(IFS=,; echo "${SERVICE_NAMES[*]}")" "${SERVICE_COMMANDS[@]}"
