#!/bin/bash
# deploy-all-projects.sh

# Configuración
GIT_USER="bambujm"
GIT_PASS="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"
BRANCH="refactor-carpetas-pg"
BASE_DIR="/var/www/html"
LOG_FILE="/var/log/deploy-projects.log"
DEPLOY_USER="kevinmatos"

# BLACKLIST - Proyectos a ignorar
BLACKLIST=(
    "colgate"
    "colgatebeta"
    "Upload-pg"
    "Upload3.0"
    "scrappers"
    "sdownload"
)

# Función para verificar si un proyecto está en la blacklist
is_blacklisted() {
    local project_name=$1
    for blacklisted in "${BLACKLIST[@]}"; do
        if [ "$project_name" == "$blacklisted" ]; then
            return 0
        fi
    done
    return 1
}

# Función para corregir permisos de un proyecto
fix_project_permissions() {
    local project_dir=$1
    local project_name=$(basename "$project_dir")
    
    echo "[DEBUG] Corrigiendo permisos de: $project_name" | tee -a "$LOG_FILE"
    
    # Solo cambiar propietario del .git y archivos git
    chown -R $DEPLOY_USER:$DEPLOY_USER "$project_dir/.git" 2>/dev/null
    
    # Añadir como directorio seguro
    sudo -u $DEPLOY_USER git config --global --add safe.directory "$project_dir" 2>/dev/null
}

# Función para procesar cada proyecto
process_project() {
    local project_dir=$1
    local project_name=$(basename "$project_dir")
    
    echo "================================" | tee -a "$LOG_FILE"
    echo "Procesando: $project_name" | tee -a "$LOG_FILE"
    echo "Fecha: $(date)" | tee -a "$LOG_FILE"

    # Verificar blacklist
    if is_blacklisted "$project_name"; then
        echo "[DEBUG] Proyecto en BLACKLIST, omitiendo..." | tee -a "$LOG_FILE"
        return 0
    fi
    
    cd "$project_dir" || return 1
    
    # Verificar si es un repositorio git
    if [ ! -d ".git" ]; then
        echo "[DEBUG] No es un repositorio git, omitiendo..." | tee -a "$LOG_FILE"
        return 0
    fi

    # CORREGIR PERMISOS ANTES DE CUALQUIER OPERACIÓN GIT
    fix_project_permissions "$project_dir"
    
    # Obtener la branch actual (ahora como el usuario correcto)
    current_branch=$(sudo -u $DEPLOY_USER git -C "$project_dir" rev-parse --abbrev-ref HEAD 2>/dev/null)
    
    if [ $? -ne 0 ]; then
        echo "[ERROR] Error al obtener la branch actual en $project_name" | tee -a "$LOG_FILE"
        return 1
    fi
    
    echo "[DEBUG] Branch actual: $current_branch" | tee -a "$LOG_FILE"
    
    # Validar si está en la branch correcta
    if [ "$current_branch" != "$BRANCH" ]; then
        echo "[DEBUG] El proyecto NO está en la branch '$BRANCH', omitiendo..." | tee -a "$LOG_FILE"
        echo "[DEBUG] (Está en: $current_branch)" | tee -a "$LOG_FILE"
        return 0
    fi
    
    echo "[DEBUG] Branch correcta, procediendo con el pull..." | tee -a "$LOG_FILE"
    
    # Git pull con credenciales
    echo "[DEBUG] Bajando cambios de Git..." | tee -a "$LOG_FILE"
    
    sudo -u $DEPLOY_USER bash -c "
        cd '$project_dir'
        git pull https://${GIT_USER}:${GIT_PASS}@github.com/Bambu-B2B/Modular.git $BRANCH 2>&1
    " | tee -a "$LOG_FILE"
    
    if [ ${PIPESTATUS[0]} -ne 0 ]; then
        echo "[ERROR] Error al hacer git pull en $project_name" | tee -a "$LOG_FILE"
        return 1
    fi
    
    # VOLVER A CORREGIR PERMISOS DESPUÉS DEL PULL (archivos nuevos)
    fix_project_permissions "$project_dir"
    
    # Comandos de Laravel
    echo "[DEBUG] Ejecutando comandos de Laravel..." | tee -a "$LOG_FILE"

    sudo -E -u $DEPLOY_USER composer install 2>&1 | tee -a "$LOG_FILE"
    
    sudo -u $DEPLOY_USER php artisan config:clear 2>&1 | tee -a "$LOG_FILE"
    sudo -u $DEPLOY_USER php artisan route:clear 2>&1 | tee -a "$LOG_FILE"
    sudo -u $DEPLOY_USER php artisan optimize 2>&1 | tee -a "$LOG_FILE"
    sudo -u $DEPLOY_USER php artisan cache:clear 2>&1 | tee -a "$LOG_FILE"
    
    echo "[OK] $project_name actualizado correctamente" | tee -a "$LOG_FILE"
    echo "" | tee -a "$LOG_FILE"
}

# Verificar que el log file sea escribible
touch "$LOG_FILE" 2>/dev/null || {
    echo "[ERROR] No se puede escribir en $LOG_FILE"
    LOG_FILE="/tmp/deploy-projects.log"
    echo "[DEBUG] Usando log alternativo: $LOG_FILE"
}

# Buscar todos los proyectos
echo "[DEBUG] Iniciando despliegue masivo - $(date)" | tee -a "$LOG_FILE"
echo "[DEBUG] Branch objetivo: $BRANCH" | tee -a "$LOG_FILE"
echo "[DEBUG] Usuario de ejecución: $DEPLOY_USER" | tee -a "$LOG_FILE"
echo "" | tee -a "$LOG_FILE"

for dir in "$BASE_DIR"/*/; do
    if [ -d "$dir" ]; then
        process_project "$dir"
    fi
done

echo "================================" | tee -a "$LOG_FILE"
echo "[OK] Despliegue completado - $(date)" | tee -a "$LOG_FILE"
