#!/usr/bin/env bash
# Despliegue completo a producción via FTP.
# Sube todo el proyecto compilado (vendor, assets, caché, .env.local).
# Uso: bash scripts/deploy-full-ftp.sh
set -euo pipefail

ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
cd "$ROOT_DIR"

# ── Credenciales ────────────────────────────────────────────────────────────
if [ -f ".env.deploy" ]; then
    set -a; source ".env.deploy"; set +a
fi
: "${FTP_HOST:?Falta FTP_HOST en .env.deploy}"
: "${FTP_PORT:=21}"
: "${FTP_USER:?Falta FTP_USER en .env.deploy}"
: "${FTP_PASS:?Falta FTP_PASS en .env.deploy}"
: "${FTP_REMOTE_PATH:=/public_html}"
PHP="${PHP_BIN:-/usr/local/bin/php}"

# ── Build ────────────────────────────────────────────────────────────────────
echo "==> [1/4] composer install --no-dev"
"$PHP" /usr/local/bin/composer install --no-dev --optimize-autoloader --no-interaction --quiet

echo "==> [2/4] Compilar assets"
APP_ENV=prod "$PHP" bin/console asset-map:compile --quiet

echo "==> [3/4] Caché de producción"
APP_ENV=prod "$PHP" bin/console cache:clear  --quiet
APP_ENV=prod "$PHP" bin/console cache:warmup --quiet

echo "==> [4/4] Subiendo archivos via FTP..."

# Archivos y directorios a excluir absolutamente
EXCLUDE_PATTERN='^\./(\.|\.git|\.vscode|\.env\.deploy|\.env\.local\.dev|tests|compose\.yaml|compose\.override\.yaml|phpunit\.dist\.xml)'

# Recopila lista de archivos a subir en un fichero temporal
FILE_LIST="$(mktemp)"
find . -type f \
    ! -path './.git/*' \
    ! -path './.vscode/*' \
    ! -path './tests/*' \
    ! -path './var/*' \
    ! -name '.env.deploy' \
    ! -name '.env.local.dev' \
    ! -name 'compose.yaml' \
    ! -name 'compose.override.yaml' \
    ! -name 'phpunit.dist.xml' \
    | sort > "$FILE_LIST"

# Añade .env.local si existe
if [ -f ".env.local" ]; then
    echo "./.env.local" >> "$FILE_LIST"
fi

TOTAL=$(wc -l < "$FILE_LIST")
DONE=0
ERRORS=0
PROGRESS_FILE="$(mktemp)"
echo "0" > "$PROGRESS_FILE"

# Proceso en segundo plano: imprime % cada 5 s
(
    while true; do
        sleep 5
        CURRENT=$(cat "$PROGRESS_FILE" 2>/dev/null || echo 0)
        [ "$CURRENT" -ge "$TOTAL" ] && break
        PCT=$(( CURRENT * 100 / TOTAL ))
        printf "\r  [Progreso] %d/%d archivos (%d%%)   " "$CURRENT" "$TOTAL" "$PCT"
    done
) &
PROGRESS_PID=$!

while IFS= read -r local_path; do
    relative_path="${local_path#./}"
    encoded_path="$(printf '%s' "$relative_path" | sed 's/ /%20/g')"
    remote_url="ftp://${FTP_HOST}:${FTP_PORT}${FTP_REMOTE_PATH}/${encoded_path}"

    if curl --silent --show-error --fail --ftp-create-dirs \
            --user "${FTP_USER}:${FTP_PASS}" \
            --upload-file "$local_path" \
            "$remote_url"; then
        DONE=$(( DONE + 1 ))
    else
        ERRORS=$(( ERRORS + 1 ))
        echo "  ERROR: $relative_path" >&2
    fi
    echo "$DONE" > "$PROGRESS_FILE"
done < "$FILE_LIST"

kill "$PROGRESS_PID" 2>/dev/null; wait "$PROGRESS_PID" 2>/dev/null || true
rm -f "$PROGRESS_FILE" "$FILE_LIST"
printf "\r  [Progreso] %d/%d archivos (100%%)   \n" "$TOTAL" "$TOTAL"

echo ""
echo "✓ Despliegue completo terminado → https://huertoscastellon.es"
