#!/bin/bash
# Start zinit-server and verify client connectivity
# Platform-aware: uses /run/zinit.sock on Linux, $HOME/hero/var/zinit.sock on macOS/Windows

set -e

SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
cd "$SCRIPT_DIR"

# Detect OS
OS=$(uname -s)
case "$OS" in
    Linux)
        DEFAULT_SOCKET="/run/zinit.sock"
        DEFAULT_CONFIG="/etc/zinit/services"
        ;;
    Darwin|MINGW*|MSYS*|CYGWIN*)
        # macOS, Windows (git bash, MSYS, Cygwin)
        DEFAULT_SOCKET="$HOME/hero/var/zinit.sock"
        DEFAULT_CONFIG="$HOME/hero/cfg/zinit"
        ;;
    *)
        echo "Unknown OS: $OS"
        exit 1
        ;;
esac

# Configuration (can be overridden by env vars)
SOCKET="${ZINIT_SOCKET:-$DEFAULT_SOCKET}"
CONFIG_DIR="${ZINIT_CONFIG_DIR:-$DEFAULT_CONFIG}"
LOG_LEVEL="${ZINIT_LOG_LEVEL:-info}"
INSTALL_DIR="$HOME/hero/bin"

# Colors
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color

echo "=== zinit development runner ==="
echo "  OS: $OS"
echo "  Socket: $SOCKET"
echo "  Config: $CONFIG_DIR"
echo "  Install: $INSTALL_DIR"
echo ""

# Build and install binaries
echo "Building and installing zinit..."
./build.sh

# Kill any existing zinit-server
echo -n "Stopping existing zinit-server... "
pkill -f "zinit-server" 2>/dev/null || true
sleep 0.5
# Force kill if still running
pkill -9 -f "zinit-server" 2>/dev/null || true
echo -e "${GREEN}done${NC}"

# Clean up old socket
if [ -e "$SOCKET" ]; then
    rm -f "$SOCKET"
fi

# Create parent directories if needed
mkdir -p "$(dirname "$SOCKET")"
mkdir -p "$CONFIG_DIR"

# Start server in background using installed binary
echo -n "Starting zinit-server... "
ZINIT_LOG_LEVEL="$LOG_LEVEL" \
ZINIT_SOCKET="$SOCKET" \
ZINIT_CONFIG_DIR="$CONFIG_DIR" \
"$INSTALL_DIR/zinit-server" \
    > /tmp/zinit-server.log 2>&1 &
SERVER_PID=$!
echo -e "${GREEN}started (PID: $SERVER_PID)${NC}"

# Wait for socket to be available
echo -n "Waiting for server to be ready... "
for i in {1..50}; do
    if [ -S "$SOCKET" ]; then
        break
    fi
    sleep 0.1
done

if [ ! -S "$SOCKET" ]; then
    echo -e "${RED}FAILED${NC}"
    echo "Server did not create socket within 5 seconds"
    echo "Server log:"
    cat /tmp/zinit-server.log
    exit 1
fi
echo -e "${GREEN}ready${NC}"

# Test client connectivity (no ZINIT_SOCKET needed - CLI auto-detects)
echo -n "Testing client connectivity... "
if "$INSTALL_DIR/zinit" list > /dev/null 2>&1; then
    echo -e "${GREEN}OK${NC}"
else
    echo -e "${RED}FAILED${NC}"
    echo "Client could not connect to server"
    echo "Server log:"
    cat /tmp/zinit-server.log
    exit 1
fi

echo ""
echo -e "${GREEN}=== zinit-server is running ===${NC}"
echo "  Socket: $SOCKET"
echo "  Config: $CONFIG_DIR"
echo "  PID:    $SERVER_PID"
echo "  Log:    /tmp/zinit-server.log"
echo "  Binary: $INSTALL_DIR/zinit-server"
echo ""
echo "Usage (socket path auto-detected):"
echo "  zinit list"
echo "  zinit status <service>"
echo "  zinit start <service>"
echo ""
echo "To stop:"
echo "  kill $SERVER_PID"
echo ""
echo "Add to PATH for convenience:"
echo "  export PATH=\"\$HOME/hero/bin:\$PATH\""
