#!/bin/bash

# --- Caricamento variabili d'ambiente ---
if [ -f .env ]; then
    export $(grep -v '^#' .env | xargs)
else
    echo "❌ Errore: File .env non trovato."
    exit 1
fi

# --- Configurazione Parallelismo ---
THREADS=${1:-${FTP_THREADS:-30}}

# --- Configurazione FTP ---
FTP_HOST="ftp.canticristiani.it"
FTP_USER="canticristiani.it"
FTP_PASS="$FTP_PASSWORD"
REMOTE_DIR="${BASE_HREF%/}" # Rimuove lo slash finale se presente per la directory remota

if [ -z "$FTP_PASS" ]; then
    echo "❌ Errore: FTP_PASSWORD non definita nel file .env"
    exit 1
fi

# --- Aggiornamento Versione ---
VERSION=$(date +'%Y.%m.%d.%H%M')
echo "export const VERSION = '$VERSION';" > src/app/version.ts
echo "🏷️ Versione aggiornata a: $VERSION"

# --- Configurazione Email Parametrica ---
node -e "
const fs = require('fs');
const envEmail = process.env.CONTACT_EMAIL || 'info@canticristiani.it';
['src/environments/environment.ts', 'src/environments/environment.prod.ts'].forEach(file => {
  if (fs.existsSync(file)) {
    let content = fs.readFileSync(file, 'utf8');
    content = content.replace(/contactEmail:\s*'[^']*'/g, \`contactEmail: '\${envEmail}'\`);
    fs.writeFileSync(file, content, 'utf8');
    console.log(\`📧 Aggiornata email di contatto in \${file} a: \${envEmail}\`);
  }
});
"

# --- Build della PWA ---
echo "📦 1/2 Build della PWA (Production) in corso..."
# Usiamo la variabile d'ambiente BASE_HREF dal file .env
npm run build -- --configuration=production --base-href=$BASE_HREF || { echo "❌ Errore nella build"; exit 1; }

if [ ! -d "www" ]; then
    echo "❌ Errore: Cartella 'www' non trovata."
    exit 1
fi

# --- Upload via FTP ---
echo "🚀 2/2 Caricamento parallelo ($THREADS connessioni) su $FTP_HOST$REMOTE_DIR..."
cd www

TOTAL_FILES=$(find . -type f | wc -l | xargs)
PROGRESS_LOG=$(mktemp)
ERROR_LOG=$(mktemp)

show_progress() {
    local current=0
    while [ "$current" -lt "$TOTAL_FILES" ]; do
        current=$(wc -l < "$PROGRESS_LOG" | xargs)
        local percent=$((current * 100 / TOTAL_FILES))
        local bar_size=20
        local num_hash=$((percent * bar_size / 100))
        local bar=$(printf "%${num_hash}s" | tr ' ' '#' 2>/dev/null)
        local spaces=$(printf "%$((bar_size - num_hash))s" | tr ' ' '-')
        printf "\r[%-20s] %d%% (%d/%d) caricati..." "$bar$spaces" "$percent" "$current" "$TOTAL_FILES"
        sleep 0.2
    done
}

show_progress &
BAR_PID=$!

# Lancio dei job paralleli
find . -type f | while read -r file; do
    REMOTE_FILE_PATH=${file#./}
    
    # Eseguiamo curl e segniamo SEMPRE il progresso (anche se fallisce)
    # Se fallisce, scriviamo il nome del file nell'error log
    (
        # Usiamo --retry per gestire errori temporanei di connessione
        if ! curl -s --retry 3 --retry-delay 1 --connect-timeout 10 -u "$FTP_USER:$FTP_PASS" --ftp-pasv --ftp-create-dirs -T "$file" "ftp://$FTP_HOST$REMOTE_DIR/$REMOTE_FILE_PATH"; then
            echo "$REMOTE_FILE_PATH" >> "$ERROR_LOG"
        fi
        echo 1 >> "$PROGRESS_LOG"
    ) &
    
    # Gestione THREADS
    while [ $(jobs -r | wc -l) -ge "$THREADS" ]; do
        sleep 0.05
    done
done

# Attendi fine caricamenti
wait

# Stop barra
sleep 0.5
kill $BAR_PID 2>/dev/null
echo ""

# Controllo errori
ERRORS=$(wc -l < "$ERROR_LOG" | xargs)
if [ "$ERRORS" -gt 0 ]; then
    echo "⚠️ Deploy completato con $ERRORS errori."
    echo "I seguenti file non sono stati caricati:"
    cat "$ERROR_LOG"
else
    echo "✅ Deploy completato con successo senza errori!"
fi

# Cleanup
rm "$PROGRESS_LOG" "$ERROR_LOG"
printf "L'app è disponibile su http://canticristiani.it${BASE_HREF}\n"
