#!/bin/bash

# EspoCRM Check & Rebuild Script
# Prüft auf häufige Fehler und führt bei Fehlerfreiheit einen Rebuild durch

set -e

SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
CUSTOM_DIR="$SCRIPT_DIR/custom"
ERRORS=0
WARNINGS=0

echo "=========================================="
echo "EspoCRM Check & Rebuild Script"
echo "=========================================="
echo ""

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

# 1. JSON-Syntax prüfen
echo -e "${BLUE}[1/3] Prüfe JSON-Syntax...${NC}"
echo "---"

JSON_FILES=$(find "$CUSTOM_DIR" -type f -name "*.json" 2>/dev/null)
JSON_COUNT=$(echo "$JSON_FILES" | grep -c . || echo 0)

if [ "$JSON_COUNT" -eq 0 ]; then
    echo -e "${YELLOW}⚠ Warnung: Keine JSON-Dateien im custom/ Verzeichnis gefunden${NC}"
    WARNINGS=$((WARNINGS + 1))
else
    echo "Gefundene JSON-Dateien: $JSON_COUNT"
    
    INVALID_JSON=0
    while IFS= read -r file; do
        if [ -n "$file" ]; then
            if ! jq empty "$file" 2>/dev/null; then
                echo -e "${RED}✗ Fehler: Ungültiges JSON in $file${NC}"
                ERRORS=$((ERRORS + 1))
                INVALID_JSON=$((INVALID_JSON + 1))
            fi
        fi
    done <<< "$JSON_FILES"
    
    if [ "$INVALID_JSON" -eq 0 ]; then
        echo -e "${GREEN}✓ Alle JSON-Dateien sind gültig${NC}"
    else
        echo -e "${RED}✗ $INVALID_JSON JSON-Dateien mit Syntaxfehlern gefunden${NC}"
    fi
fi

echo ""

# 2. Dateirechte prüfen und korrigieren
echo -e "${BLUE}[2/3] Prüfe Dateirechte...${NC}"
echo "---"

WRONG_OWNER=0
FIXED_FILES=0
CUSTOM_FILES=$(find "$CUSTOM_DIR" -type f 2>/dev/null || echo "")
CUSTOM_DIRS=$(find "$CUSTOM_DIR" -type d 2>/dev/null || echo "")

if [ -z "$CUSTOM_FILES" ]; then
    echo -e "${YELLOW}⚠ Warnung: Keine Dateien im custom/ Verzeichnis gefunden${NC}"
    WARNINGS=$((WARNINGS + 1))
else
    # Prüfe und korrigiere Dateien einzeln
    while IFS= read -r file; do
        if [ -n "$file" ]; then
            OWNER=$(stat -c '%U:%G' "$file" 2>/dev/null || echo "unknown:unknown")
            if [ "$OWNER" != "www-data:www-data" ]; then
                WRONG_OWNER=$((WRONG_OWNER + 1))
                # Korrigiere direkt nur diese Datei
                if sudo chown www-data:www-data "$file" 2>/dev/null && sudo chmod 664 "$file" 2>/dev/null; then
                    FIXED_FILES=$((FIXED_FILES + 1))
                fi
            fi
        fi
    done <<< "$CUSTOM_FILES"
    
    # Prüfe und korrigiere Verzeichnisse einzeln
    while IFS= read -r dir; do
        if [ -n "$dir" ]; then
            OWNER=$(stat -c '%U:%G' "$dir" 2>/dev/null || echo "unknown:unknown")
            if [ "$OWNER" != "www-data:www-data" ]; then
                sudo chown www-data:www-data "$dir" 2>/dev/null && sudo chmod 775 "$dir" 2>/dev/null
            fi
        fi
    done <<< "$CUSTOM_DIRS"
    
    if [ "$WRONG_OWNER" -eq 0 ]; then
        echo -e "${GREEN}✓ Alle Dateien haben korrekte Berechtigungen (www-data:www-data)${NC}"
    else
        if [ "$FIXED_FILES" -eq "$WRONG_OWNER" ]; then
            echo -e "${GREEN}✓ $FIXED_FILES Dateien korrigiert${NC}"
        else
            echo -e "${RED}✗ Fehler: Konnte nicht alle Berechtigungen korrigieren${NC}"
            ERRORS=$((ERRORS + 1))
        fi
    fi
fi

echo ""

# 3. Cache-Verzeichnis prüfen
echo -e "${BLUE}[3/3] Prüfe System...${NC}"
echo "---"

if [ ! -d "$SCRIPT_DIR/data/cache" ]; then
    echo -e "${RED}✗ Fehler: Cache-Verzeichnis existiert nicht${NC}"
    ERRORS=$((ERRORS + 1))
else
    echo -e "${GREEN}✓ Cache-Verzeichnis existiert${NC}"
fi

if [ ! -d "$SCRIPT_DIR/data/logs" ]; then
    echo -e "${RED}✗ Fehler: Logs-Verzeichnis existiert nicht${NC}"
    ERRORS=$((ERRORS + 1))
else
    echo -e "${GREEN}✓ Logs-Verzeichnis existiert${NC}"
fi

echo ""
echo "=========================================="
echo "Zusammenfassung:"
echo "---"

if [ "$ERRORS" -eq 0 ] && [ "$WARNINGS" -eq 0 ]; then
    echo -e "${GREEN}✓ Keine Fehler oder Warnungen gefunden${NC}"
elif [ "$ERRORS" -eq 0 ]; then
    echo -e "${YELLOW}⚠ $WARNINGS Warnung(en) gefunden (Rebuild wird trotzdem ausgeführt)${NC}"
else
    echo -e "${RED}✗ $ERRORS Fehler und $WARNINGS Warnung(en) gefunden${NC}"
fi

echo "=========================================="
echo ""

# Entscheidung: Rebuild durchführen oder nicht
if [ "$ERRORS" -gt 0 ]; then
    echo -e "${RED}REBUILD WIRD NICHT DURCHGEFÜHRT${NC}"
    echo "Bitte behebe die oben genannten Fehler und führe das Script erneut aus."
    exit 1
else
    echo -e "${GREEN}Starte Rebuild und Cache-Bereinigung...${NC}"
    echo ""
    
    # Rebuild und Cache-Bereinigung durchführen
    if command -v docker &> /dev/null; then
        echo -e "${BLUE}[1/2] Führe Clear Cache aus...${NC}"
        if docker exec espocrm php /var/www/html/command.php ClearCache 2>&1; then
            echo -e "${GREEN}✓ Cache erfolgreich gelöscht${NC}"
            echo ""
            
            echo -e "${BLUE}[2/2] Führe Rebuild aus...${NC}"
            if docker exec espocrm php /var/www/html/command.php rebuild 2>&1; then
                echo ""
                echo -e "${GREEN}=========================================="
                echo "✓ REBUILD ERFOLGREICH ABGESCHLOSSEN"
                echo "==========================================${NC}"
                exit 0
            else
                echo ""
                echo -e "${RED}=========================================="
                echo "✗ REBUILD FEHLGESCHLAGEN"
                echo "==========================================${NC}"
                echo "Prüfe die Logs unter data/logs/ für weitere Details."
                exit 1
            fi
        else
            echo -e "${RED}✗ Clear Cache fehlgeschlagen${NC}"
            echo "Fahre mit Rebuild fort..."
            echo ""
            
            if docker exec espocrm php /var/www/html/command.php rebuild 2>&1; then
                echo ""
                echo -e "${GREEN}=========================================="
                echo "✓ REBUILD ERFOLGREICH ABGESCHLOSSEN"
                echo "==========================================${NC}"
                exit 0
            else
                echo ""
                echo -e "${RED}=========================================="
                echo "✗ REBUILD FEHLGESCHLAGEN"
                echo "==========================================${NC}"
                echo "Prüfe die Logs unter data/logs/ für weitere Details."
                exit 1
            fi
        fi
    else
        echo -e "${RED}✗ Docker nicht gefunden. Rebuild kann nicht durchgeführt werden.${NC}"
        exit 1
    fi
fi
