#!/bin/bash

# C-Relay Build and Restart Script
# Builds the project first, then stops any running relay and starts a new one in the background

echo "=== C Nostr Relay Build and Restart Script ==="

# Parse command line arguments
PRESERVE_CONFIG=false
HELP=false

while [[ $# -gt 0 ]]; do
    case $1 in
        --preserve-config|-p)
            PRESERVE_CONFIG=true
            shift
            ;;
        --help|-h)
            HELP=true
            shift
            ;;
        *)
            echo "Unknown option: $1"
            HELP=true
            shift
            ;;
    esac
done

# Show help
if [ "$HELP" = true ]; then
    echo "Usage: $0 [OPTIONS]"
    echo ""
    echo "Options:"
    echo "  --preserve-config  Keep existing configuration file (don't regenerate)"
    echo "  --help, -h         Show this help message"
    echo ""
    echo "Default behavior: Automatically regenerates configuration file on each build"
    echo "                 for development purposes"
    exit 0
fi

# Handle configuration file regeneration
CONFIG_FILE="$HOME/.config/c-relay/c_relay_config_event.json"
if [ "$PRESERVE_CONFIG" = false ] && [ -f "$CONFIG_FILE" ]; then
    echo "Removing old configuration file to trigger regeneration..."
    rm -f "$CONFIG_FILE"
    echo "✓ Configuration file removed - will be regenerated with latest database values"
elif [ "$PRESERVE_CONFIG" = true ] && [ -f "$CONFIG_FILE" ]; then
    echo "Preserving existing configuration file as requested"
elif [ ! -f "$CONFIG_FILE" ]; then
    echo "No existing configuration file found - will generate new one"
fi

# Build the project first
echo "Building project..."
make clean all

# Check if build was successful
if [ $? -ne 0 ]; then
    echo "ERROR: Build failed. Cannot restart relay."
    exit 1
fi

# Check if relay binary exists after build - detect architecture
ARCH=$(uname -m)
case "$ARCH" in
    x86_64)
        BINARY_PATH="./build/c_relay_x86"
        ;;
    aarch64|arm64)
        BINARY_PATH="./build/c_relay_arm64"
        ;;
    *)
        BINARY_PATH="./build/c_relay_$ARCH"
        ;;
esac

if [ ! -f "$BINARY_PATH" ]; then
    echo "ERROR: Relay binary not found at $BINARY_PATH after build. Build may have failed."
    exit 1
fi

echo "Build successful. Proceeding with relay restart..."

# Kill existing relay if running
echo "Stopping any existing relay servers..."
pkill -f "c_relay_" 2>/dev/null
sleep 2  # Give time for shutdown

# Check if port is still bound
if lsof -i :8888 >/dev/null 2>&1; then
    echo "Port 8888 still in use, force killing..."
    fuser -k 8888/tcp 2>/dev/null || echo "No process on port 8888"
fi

# Get any remaining processes
REMAINING_PIDS=$(pgrep -f "c_relay_" || echo "")
if [ -n "$REMAINING_PIDS" ]; then
    echo "Force killing remaining processes: $REMAINING_PIDS"
    kill -9 $REMAINING_PIDS 2>/dev/null
    sleep 1
else
    echo "No existing relay found"
fi

# Clean up PID file
rm -f relay.pid

# Initialize database if needed
if [ ! -f "./db/c_nostr_relay.db" ]; then
    echo "Initializing database..."
    ./db/init.sh --force >/dev/null 2>&1
fi

# Start relay in background with output redirection
echo "Starting relay server..."
echo "Debug: Current processes: $(ps aux | grep 'c_relay_' | grep -v grep || echo 'None')"

# Start relay in background and capture its PID
$BINARY_PATH > relay.log 2>&1 &
RELAY_PID=$!

echo "Started with PID: $RELAY_PID"

# Check if server is still running after short delay
sleep 3

# Check if process is still alive
if ps -p "$RELAY_PID" >/dev/null 2>&1; then
    echo "Relay started successfully!"
    echo "PID: $RELAY_PID"
    echo "WebSocket endpoint: ws://127.0.0.1:8888"
    echo "Log file: relay.log"
    echo ""

    # Save PID for debugging
    echo $RELAY_PID > relay.pid

    # Check if a new private key was generated and display it
    sleep 1  # Give relay time to write initial logs
    if grep -q "GENERATED RELAY ADMIN PRIVATE KEY" relay.log 2>/dev/null; then
        echo "=== IMPORTANT: NEW ADMIN PRIVATE KEY GENERATED ==="
        echo ""
        # Extract and display the private key section from the log
        grep -A 8 -B 2 "GENERATED RELAY ADMIN PRIVATE KEY" relay.log | head -n 12
        echo ""
        echo "⚠️  SAVE THIS PRIVATE KEY SECURELY - IT CONTROLS YOUR RELAY!"
        echo "⚠️  This key is also logged in relay.log for reference"
        echo ""
    fi

    echo "=== Relay server running in background ==="
    echo "To kill relay: pkill -f 'c_relay_'"
    echo "To check status: ps aux | grep c_relay_"
    echo "To view logs: tail -f relay.log"
    echo "Binary: $BINARY_PATH"
    echo "Ready for Nostr client connections!"
else
    echo "ERROR: Relay failed to start"
    echo "Debug: Check relay.log for error details:"
    echo "--- Last 10 lines of relay.log ---"
    tail -n 10 relay.log 2>/dev/null || echo "No log file found"
    echo "--- End log ---"
    exit 1
fi

echo ""