#!/bin/bash
set -e

# Configurer git pour faire confiance à /var/www pour éviter l'erreur de dubious ownership
if command -v git &> /dev/null; then
    git config --global --add safe.directory /var/www || true
fi

# ==============================================================================
# entrypoint.sh - Script d'initialisation automatique pour les conteneurs Laravel
# Ce script gère : l'attente de MySQL, l'installation de Composer,
# les migrations, et le démarrage du service approprié.
# ==============================================================================

echo "🚀 [Entrypoint] Démarrage du conteneur Laravel..."

# Sauvegarder la valeur de DB_HOST passée par Docker (prioritaire)
DOCKER_DB_HOST="$DB_HOST"

# --- 0. Charger les variables d'environnement depuis le fichier .env ---
if [ -f /var/www/.env ]; then
    while IFS= read -r line || [ -n "$line" ]; do
        # Supprimer le retour chariot Windows éventuel (\r)
        line=$(echo "$line" | tr -d '\r')
        # Retirer les espaces au début et à la fin
        line=$(echo "$line" | xargs 2>/dev/null || echo "$line")
        
        # Ignorer les lignes vides ou commençant par #
        if [[ -z "$line" || "$line" =~ ^# ]]; then
            continue
        fi
        
        # Retirer les commentaires de fin de ligne (inline)
        clean_line="${line%%#*}"
        clean_line=$(echo "$clean_line" | xargs 2>/dev/null || echo "$clean_line")
        
        # Extraire la clé et la valeur
        if [[ "$clean_line" =~ ^([A-Za-z_][A-Za-z0-9_]*)=(.*)$ ]]; then
            key="${BASH_REMATCH[1]}"
            val="${BASH_REMATCH[2]}"
            
            # Retirer les guillemets éventuels autour de la valeur
            val="${val%\"}"
            val="${val#\"}"
            val="${val%\'}"
            val="${val#\'}"
            
            # Exporter la variable
            export "$key"="$val"
        fi
    done < /var/www/.env
fi

# Restaurer la valeur de DB_HOST passée par Docker (prioritaire)
if [ -n "$DOCKER_DB_HOST" ]; then
    export DB_HOST="$DOCKER_DB_HOST"
fi

# --- 1. Attendre que MySQL soit prêt ---
echo "⏳ [Entrypoint] Attente de la base de données MySQL (host=$DB_HOST, db=$DB_DATABASE)..."
MAX_RETRIES=30
RETRY_COUNT=0
until php -r "
    try {
        new PDO(
            'mysql:host=' . getenv('DB_HOST') . ';port=3306;dbname=' . getenv('DB_DATABASE'),
            getenv('DB_USERNAME'),
            getenv('DB_PASSWORD')
        );
        echo 'OK';
        exit(0);
    } catch (Exception \$e) {
        exit(1);
    }
" 2>/dev/null; do
    RETRY_COUNT=$((RETRY_COUNT + 1))
    if [ $RETRY_COUNT -ge $MAX_RETRIES ]; then
        echo "❌ [Entrypoint] MySQL n'est pas disponible après ${MAX_RETRIES} tentatives. Abandon."
        exit 1
    fi
    echo "⏳ [Entrypoint] MySQL pas encore prêt... tentative ${RETRY_COUNT}/${MAX_RETRIES}"
    sleep 2
done
echo "✅ [Entrypoint] MySQL est prêt !"

# --- 2. Installer les dépendances Composer si nécessaire ---
if [ ! -f /var/www/vendor/autoload.php ]; then
    echo "📦 [Entrypoint] Installation des dépendances Composer..."
    composer install --no-interaction --optimize-autoloader --no-dev
    echo "✅ [Entrypoint] Dépendances Composer installées."
else
    echo "✅ [Entrypoint] Dépendances Composer déjà présentes."
fi

# --- 3. Fixer les permissions de stockage Laravel ---
chown -R www-data:www-data /var/www/storage /var/www/bootstrap/cache 2>/dev/null || true
chmod -R 775 /var/www/storage /var/www/bootstrap/cache 2>/dev/null || true

# --- 4. Exécuter les migrations (seulement pour le conteneur API principal) ---
if [ "$CONTAINER_ROLE" = "api" ]; then
    echo "🗄️ [Entrypoint] Exécution des migrations de base de données..."
    php artisan migrate --force || echo "⚠️ [Entrypoint] Migrations échouées (peut-être déjà à jour)."

    echo "📋 [Entrypoint] Mise en cache de la configuration..."
    php artisan config:cache || true
    php artisan view:cache || true
    # On ne cache PAS les routes à cause du doublon user.wallet.transactions
    php artisan route:clear || true

    echo "✅ [Entrypoint] Initialisation Laravel terminée."
fi

# --- 5. Démarrer le service demandé ---
echo "🏁 [Entrypoint] Démarrage du service : $@"
exec "$@"
