#!/bin/bash

set -euo pipefail

DETACHED=false

while [[ $# -gt 0 ]]; do
    case "$1" in
        --detached|-d)
            DETACHED=true
            shift
            ;;
        --help|-h)
            echo "Usage: $0 [--detached]"
            exit 0
            ;;
        *)
            echo "Unknown option: $1"
            echo "Usage: $0 [--detached]"
            exit 1
            ;;
    esac
done

# Function to check if a port is free
is_port_free() {
    if nc -z localhost $1 2>/dev/null; then
        return 1  # Port is in use
    else
        return 0  # Port is free
    fi
}

# Services, their default ports, and assigned ports
services=("PHP" "WS" "DB" "REDIS")
defaults=(8080 9000 5432 6379)
ports=()

echo "Checking and assigning free ports..."

for i in "${!services[@]}"; do
    port=${defaults[$i]}
    echo "Checking ${services[$i]} default port: $port"
    
    # Find the next free port starting from default
    while ! is_port_free $port; do
        port=$((port + 1))
        if [ $port -gt 65535 ]; then
            echo "Error: No free port found for ${services[$i]}"
            exit 1
        fi
    done
    
    ports[$i]=$port
    echo "${services[$i]} assigned port: $port"
done

# Write to .env file
cat > .env << EOF
PHP_PORT=${ports[0]}
WS_PORT=${ports[1]}
DB_HOST=postgres
DB_PORT=${ports[2]}
REDIS_PORT=${ports[3]}
EOF

echo "Ports assigned and saved to .env:"
cat .env

# Run docker compose
echo "Starting Docker Compose..."
compose_args=(up --build)
if [[ "$DETACHED" == "true" ]]; then
    compose_args+=(-d)
fi
docker compose "${compose_args[@]}"
