#!/bin/bash

# PHP Extension Configure Options Analyzer
# Analysiert automatisch, welche Option (--with oder --enable) für jede Extension benötigt wird

set -euo pipefail

# Farben für bessere Lesbarkeit
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[0;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

# Funktion zur Ausgabe mit Farben
print_colored() {
    local color=$1
    local message=$2
    echo -e "${color}${message}${NC}"
}

# Prüfen, ob wir im PHP-Quellcode-Verzeichnis sind
if [[ ! -f "./configure" ]]; then
    print_colored $RED "Fehler: configure-Script nicht gefunden!"
    print_colored $YELLOW "Bitte führe das Script im PHP-Quellcode-Verzeichnis aus."
    exit 1
fi

# Erstelle temporäre Dateien für die Analyse
HELP_OUTPUT=$(mktemp)
EXT_DIR_LIST=$(mktemp)
RESULTS_FILE=$(mktemp)

# Cleanup-Funktion
cleanup() {
    rm -f "$HELP_OUTPUT" "$EXT_DIR_LIST" "$RESULTS_FILE"
}
trap cleanup EXIT

print_colored $BLUE "🔍 Analysiere PHP Configure-Optionen..."

# Erstelle Liste aller Erweiterungen im ext-Verzeichnis
if [[ -d "./ext" ]]; then
    find ./ext -maxdepth 1 -type d -name "*" -exec basename {} \; | grep -v "^ext$" | sort > "$EXT_DIR_LIST"
else
    print_colored $RED "Fehler: ext-Verzeichnis nicht gefunden!"
    exit 1
fi

# Hole configure --help Output
./configure --help > "$HELP_OUTPUT" 2>&1

print_colored $BLUE "📊 Erstelle Analyse-Report..."

# Header für den Report
cat > "$RESULTS_FILE" << 'EOF'
# PHP Extension Configure Options Report
# Automatisch generiert

EXTENSIONS_WITH_WITH=()
EXTENSIONS_WITH_ENABLE=()
EXTENSIONS_NOT_CONFIGURABLE=()
CONFIGURE_OPTIONS=()

EOF

# Arrays für die verschiedenen Kategorien
declare -a with_extensions=()
declare -a enable_extensions=()
declare -a not_configurable=()

# Analysiere jede Extension
while IFS= read -r ext_name; do
    # Suche nach --with-$ext_name
    with_match=$(grep -E "^\s*--with-${ext_name}(\[|=|\s)" "$HELP_OUTPUT" || true)
    
    # Suche nach --enable-$ext_name
    enable_match=$(grep -E "^\s*--enable-${ext_name}(\[|=|\s)" "$HELP_OUTPUT" || true)
    
    if [[ -n "$with_match" ]]; then
        with_extensions+=("$ext_name")
        # Extrahiere die Beschreibung
        description=$(echo "$with_match" | sed 's/^[[:space:]]*--with-[^[:space:]]*//' | sed 's/^[[:space:]]*//')
        echo "CONFIGURE_OPTIONS+=(\"--with-${ext_name}\")" >> "$RESULTS_FILE"
        printf "%-20s %s %s\n" "$ext_name" "--with-${ext_name}" "$description"
    elif [[ -n "$enable_match" ]]; then
        enable_extensions+=("$ext_name")
        # Extrahiere die Beschreibung
        description=$(echo "$enable_match" | sed 's/^[[:space:]]*--enable-[^[:space:]]*//' | sed 's/^[[:space:]]*//')
        echo "CONFIGURE_OPTIONS+=(\"--enable-${ext_name}\")" >> "$RESULTS_FILE"
        printf "%-20s %s %s\n" "$ext_name" "--enable-${ext_name}" "$description"
    else
        not_configurable+=("$ext_name")
    fi
done < "$EXT_DIR_LIST"

# Schreibe Arrays in die Ergebnis-Datei
echo "" >> "$RESULTS_FILE"
echo "# Extensions mit --with Option:" >> "$RESULTS_FILE"
for ext in "${with_extensions[@]}"; do
    [[ $ext = *snmp* ]] && continue
    [[ $ext = *readline* ]] && ext=libedit
    echo "EXTENSIONS_WITH_WITH+=(\"$ext\")" >> "$RESULTS_FILE"
done

echo "" >> "$RESULTS_FILE"
echo "# Extensions mit --enable Option:" >> "$RESULTS_FILE"
for ext in "${enable_extensions[@]}"; do
    echo "EXTENSIONS_WITH_ENABLE+=(\"$ext\")" >> "$RESULTS_FILE"
done

echo "" >> "$RESULTS_FILE"
echo "# Extensions ohne configure Option:" >> "$RESULTS_FILE"
for ext in "${not_configurable[@]}"; do
    echo "EXTENSIONS_NOT_CONFIGURABLE+=(\"$ext\")" >> "$RESULTS_FILE"
done

# Zusammenfassung ausgeben
print_colored $GREEN "\n📈 Zusammenfassung:"
print_colored $YELLOW "Extensions mit --with:     ${#with_extensions[@]}"
print_colored $YELLOW "Extensions mit --enable:   ${#enable_extensions[@]}"
print_colored $YELLOW "Nicht konfigurierbar:      ${#not_configurable[@]}"

# Detaillierte Ausgabe
print_colored $GREEN "\n🟢 Extensions mit --with-Option:"
printf "%-20s %-25s %s\n" "Extension" "Configure Option" "Beschreibung"
print_colored $BLUE "$(printf '%.0s-' {1..80})"

for ext in "${with_extensions[@]}"; do
    with_match=$(grep -E "^\s*--with-${ext}(\[|=|\s)" "$HELP_OUTPUT")
    description=$(echo "$with_match" | sed 's/^[[:space:]]*--with-[^[:space:]]*//' | sed 's/^[[:space:]]*//')
    printf "%-20s %-25s %s\n" "$ext" "--with-${ext}" "$description"
done

print_colored $GREEN "\n🔵 Extensions mit --enable-Option:"
printf "%-20s %-25s %s\n" "Extension" "Configure Option" "Beschreibung"
print_colored $BLUE "$(printf '%.0s-' {1..80})"

for ext in "${enable_extensions[@]}"; do
    enable_match=$(grep -E "^\s*--enable-${ext}(\[|=|\s)" "$HELP_OUTPUT")
    description=$(echo "$enable_match" | sed 's/^[[:space:]]*--enable-[^[:space:]]*//' | sed 's/^[[:space:]]*//')
    printf "%-20s %-25s %s\n" "$ext" "--enable-${ext}" "$description"
done

if [[ ${#not_configurable[@]} -gt 0 ]]; then
    print_colored $RED "\n🔴 Extensions ohne Configure-Option:"
    for ext in "${not_configurable[@]}"; do
        printf "%-20s %s\n" "$ext" "(nicht konfigurierbar oder bereits standardmäßig aktiviert)"
    done
fi

# Generiere ein praktisches Configure-Script
print_colored $BLUE "\n🚀 Generiere beispielhaftes Configure-Command..."

SAMPLE_CONFIGURE="./configure"
for ext in "${with_extensions[@]:0:5}"; do  # Nur die ersten 5 als Beispiel
    SAMPLE_CONFIGURE+=" --with-${ext}"
done
for ext in "${enable_extensions[@]:0:5}"; do  # Nur die ersten 5 als Beispiel
    SAMPLE_CONFIGURE+=" --enable-${ext}"
done

print_colored $GREEN "\n💡 Beispiel-Configure-Command (erste 5 jeder Kategorie):"
echo "$SAMPLE_CONFIGURE"

# Speichere Report
REPORT_FILE="php_extension_analysis_$(date +%Y%m%d_%H%M%S).txt"
cp "$RESULTS_FILE" "$REPORT_FILE"

print_colored $GREEN "\n💾 Vollständiger Report gespeichert als: $REPORT_FILE"
print_colored $YELLOW "Du kannst die Arrays aus dieser Datei in anderen Scripts verwenden:"
print_colored $BLUE "source $REPORT_FILE"