#!/usr/bin/env bash
# =============================================================================
# deploy.sh — Transfiere serf-cloud al servidor vía SFTP
# Ejecutar desde la estación de desarrollo después de compile.sh.
#
# Uso:
#   bash deploy.sh USUARIO SERVIDOR
#   bash deploy.sh sysdevops apibatch.fidelitas.com.ar
#
# Variables de entorno opcionales:
#   SFTP_PORT      Puerto SSH (default: 22)
#   SFTP_KEY       Ruta a clave privada SSH (default: ~/.ssh/id_rsa)
#   REMOTE_DIR     Directorio destino en el servidor (default: /var/www/html/serf-cloud/app)
# =============================================================================

set -e

USUARIO="${1:?Uso: bash deploy.sh USUARIO SERVIDOR}"
SERVIDOR="${2:?Uso: bash deploy.sh USUARIO SERVIDOR}"
SFTP_PORT="${SFTP_PORT:-22}"
SFTP_KEY="${SFTP_KEY:-$HOME/.ssh/id_rsa}"
REMOTE_DIR="${REMOTE_DIR:-/var/www/html/serf-cloud/app}"
PROYECTO_DIR="$(cd "$(dirname "$0")" && pwd)"

echo "=================================================="
echo " SERF Cloud — Deploy vía SFTP"
echo " Origen:  $PROYECTO_DIR"
echo " Destino: $USUARIO@$SERVIDOR:$REMOTE_DIR"
echo "=================================================="

# Verificar que node_modules existe (compile.sh debe haber corrido antes)
if [ ! -d "$PROYECTO_DIR/node_modules" ]; then
    echo "ERROR: node_modules no encontrado. Ejecutar compile.sh primero."
    exit 1
fi

# Archivos y directorios a excluir del deploy
EXCLUIR=(
    ".env"
    ".git"
    ".gitignore"
    "logs"
    "portadas"
    "data"
    "deploy.sh"
    "compile.sh"
    ".env.example"
    "db"
    "docs"
    "hotfolder"
)

# Construir lista de archivos a transferir
TMPLIST="$(mktemp /tmp/serf-deploy-XXXXXX.txt)"
trap 'rm -f "$TMPLIST"' EXIT

# Listar todo en el proyecto excluyendo los directorios/archivos no deseados
find "$PROYECTO_DIR" -maxdepth 1 \( -type f -o -type d \) | while read -r item; do
    nombre="$(basename "$item")"
    # Saltar el propio directorio raíz
    [ "$item" = "$PROYECTO_DIR" ] && continue
    # Verificar si está en la lista de exclusión
    excluido=0
    for ex in "${EXCLUIR[@]}"; do
        [ "$nombre" = "$ex" ] && excluido=1 && break
    done
    [ $excluido -eq 0 ] && echo "$item"
done > "$TMPLIST"

echo ""
echo "Archivos a transferir:"
cat "$TMPLIST" | sed "s|$PROYECTO_DIR/||" | sort
echo ""

# Generar script SFTP
SFTP_SCRIPT="$(mktemp /tmp/serf-sftp-XXXXXX.txt)"
trap 'rm -f "$SFTP_SCRIPT" "$TMPLIST"' EXIT

{
    echo "-mkdir $REMOTE_DIR"
    echo "lcd $PROYECTO_DIR"
    echo "cd $REMOTE_DIR"

    # Transferir archivos de primer nivel
    while IFS= read -r item; do
        nombre="$(basename "$item")"
        if [ -f "$item" ]; then
            echo "put $item $REMOTE_DIR/$nombre"
        elif [ -d "$item" ]; then
            echo "-mkdir $REMOTE_DIR/$nombre"
            echo "put -r $item $REMOTE_DIR/$nombre"
        fi
    done < "$TMPLIST"

    echo "bye"
} > "$SFTP_SCRIPT"

# Ejecutar SFTP
echo "Conectando a $SERVIDOR..."
sftp -P "$SFTP_PORT" \
     -i "$SFTP_KEY" \
     -b "$SFTP_SCRIPT" \
     -o "StrictHostKeyChecking=accept-new" \
     -o "BatchMode=yes" \
     "$USUARIO@$SERVIDOR"

echo ""
echo "=================================================="
echo " Deploy completado."
echo ""
echo " En el servidor, verificar y reiniciar el servicio:"
echo "   ssh $USUARIO@$SERVIDOR"
echo "   sudo chown -R serfapp:serfapp $REMOTE_DIR"
echo "   sudo -u serfapp pm2 reload fide-serf"
echo "=================================================="
