#!/usr/bin/env bash

# respaldo_videos_por_fecha_carpeta_7dias.sh
#
# Procesa carpetas antiguas en:
#   /var/www/html/uploads/videos
#   /var/www/html/uploads/events
#
# CRITERIO IMPORTANTE:
#   La antigüedad NO se calcula por fecha de modificación del directorio (-mtime).
#   Se calcula por el NOMBRE de la carpeta, que debe tener formato YYYY-MM-DD.
#
# Ejemplo:
#   Si hoy es 2026-06-18 y DIAS_ANTIGUEDAD=7,
#   la fecha de corte es 2026-06-11.
#   Se procesan carpetas con nombre ANTERIOR a 2026-06-11:
#       2026-06-10, 2026-06-09, 2026-06-08, etc.
#
# Para cada carpeta válida y antigua:
#   1) La comprime en .tar.gz
#   2) La envía por rsync al servidor gpsur2.dyndns.org
#   3) Solo si el envío fue correcto, elimina la carpeta original
#
# Si una carpeta no existe o falla, NO se cae el proceso:
# registra el error y continúa con la siguiente.

DESTINO_SERVIDOR="gpsur2.dyndns.org"
DESTINO_BASE="/BACKUP/videos"

USUARIO_SSH="ubuntu"
SSH_PORT="22"
DIAS_ANTIGUEDAD="4"

TMP_DIR="/tmp/respaldo_uploads"
LOG="/var/log/respaldo_uploads_antiguos.log"
LOCKFILE="/tmp/respaldo_uploads_antiguos.lock"

SSH_KEY="/root/.ssh/id_rsa_sd2"
SSH_OPTS="-p $SSH_PORT -i $SSH_KEY -o PubkeyAcceptedAlgorithms=+ssh-rsa -o HostkeyAlgorithms=+ssh-rsa"

mkdir -p "$TMP_DIR"

# Evita que el proceso se ejecute más de una vez en paralelo.
exec 9>"$LOCKFILE"
if ! flock -n 9; then
    echo "$(date '+%Y-%m-%d %H:%M:%S') - Proceso ya está corriendo. Se omite esta ejecución." >> "$LOG"
    echo "Proceso ya está corriendo. Se omite esta ejecución."
    exit 0
fi

TOTAL_GLOBAL_ENCONTRADAS=0
TOTAL_GLOBAL_COMPRIMIDAS=0
TOTAL_GLOBAL_ENVIADAS=0
TOTAL_GLOBAL_BORRADAS=0
TOTAL_GLOBAL_OMITIDAS=0
TOTAL_GLOBAL_ERRORES=0

FECHA_HOY=$(date '+%Y-%m-%d')
FECHA_CORTE=$(date -d "-$DIAS_ANTIGUEDAD days" '+%Y-%m-%d')

# Devuelve carpetas de primer nivel cuyo nombre sea YYYY-MM-DD y sea anterior a FECHA_CORTE.
# Usa comparación alfabética porque el formato YYYY-MM-DD ordena igual que la fecha real.
listar_carpetas_por_fecha_nombre() {
    local ORIGEN_BASE="$1"

    find "$ORIGEN_BASE" -mindepth 1 -maxdepth 1 -type d -printf '%f|%p\n' 2>/dev/null \
    | while IFS='|' read -r NOMBRE_CARPETA RUTA_CARPETA; do
        # Solo considera carpetas con formato exacto YYYY-MM-DD.
        if [[ ! "$NOMBRE_CARPETA" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then
            continue
        fi

        # Valida que sea una fecha real.
        if ! date -d "$NOMBRE_CARPETA" '+%Y-%m-%d' >/dev/null 2>&1; then
            continue
        fi

        # Mayor que 7 días: estrictamente anterior a la fecha de corte.
        # Para incluir exactamente la fecha de corte, cambiar '<' por '<=' usando lógica adicional.
        if [[ "$NOMBRE_CARPETA" < "$FECHA_CORTE" ]]; then
            echo "$RUTA_CARPETA"
        fi
    done \
    | sort
}

procesar_origen() {
    local ORIGEN_BASE="$1"
    local TIPO="$2"
    local DESTINO_RUTA="$DESTINO_BASE/$TIPO"

    echo "============================================================" >> "$LOG"
    echo "INICIO PROCESO $TIPO: $(date '+%Y-%m-%d %H:%M:%S')" >> "$LOG"
    echo "Origen base       : $ORIGEN_BASE" >> "$LOG"
    echo "Criterio          : nombre de carpeta YYYY-MM-DD" >> "$LOG"
    echo "Fecha hoy         : $FECHA_HOY" >> "$LOG"
    echo "Fecha corte       : $FECHA_CORTE" >> "$LOG"
    echo "Antigüedad        : más de $DIAS_ANTIGUEDAD días" >> "$LOG"
    echo "Destino           : $USUARIO_SSH@$DESTINO_SERVIDOR:$DESTINO_RUTA" >> "$LOG"

    if [ ! -d "$ORIGEN_BASE" ]; then
        echo "ERROR: No existe ORIGEN_BASE: $ORIGEN_BASE" >> "$LOG"
        TOTAL_GLOBAL_ERRORES=$((TOTAL_GLOBAL_ERRORES + 1))
        return
    fi

    mapfile -t CARPETAS < <(listar_carpetas_por_fecha_nombre "$ORIGEN_BASE")

    local TOTAL_ENCONTRADAS=${#CARPETAS[@]}
    local TOTAL_COMPRIMIDAS=0
    local TOTAL_ENVIADAS=0
    local TOTAL_BORRADAS=0
    local TOTAL_OMITIDAS=0
    local TOTAL_ERRORES=0

    TOTAL_GLOBAL_ENCONTRADAS=$((TOTAL_GLOBAL_ENCONTRADAS + TOTAL_ENCONTRADAS))

    echo "Carpetas encontradas por nombre fecha: $TOTAL_ENCONTRADAS" >> "$LOG"

    if [ "$TOTAL_ENCONTRADAS" -eq 0 ]; then
        echo "No hay carpetas con nombre YYYY-MM-DD mayores a $DIAS_ANTIGUEDAD días en $ORIGEN_BASE." >> "$LOG"
        return
    fi

    for CARPETA_ORIGEN in "${CARPETAS[@]}"; do
        local NOMBRE_CARPETA
        local ARCHIVO_TAR
        local TAMANO

        NOMBRE_CARPETA=$(basename "$CARPETA_ORIGEN")
        ARCHIVO_TAR="$TMP_DIR/${TIPO}_${NOMBRE_CARPETA}.tar.gz"

        echo "------------------------------------------------------------" >> "$LOG"
        echo "Procesando carpeta : $CARPETA_ORIGEN" >> "$LOG"
        echo "Fecha por nombre   : $NOMBRE_CARPETA" >> "$LOG"
        echo "Archivo temporal   : $ARCHIVO_TAR" >> "$LOG"

        if [ ! -d "$CARPETA_ORIGEN" ]; then
            echo "OMITIDA: La carpeta ya no existe: $CARPETA_ORIGEN" >> "$LOG"
            TOTAL_OMITIDAS=$((TOTAL_OMITIDAS + 1))
            continue
        fi

        echo "Comprimiendo..." >> "$LOG"
        rm -f "$ARCHIVO_TAR"

        tar -czf "$ARCHIVO_TAR" -C "$ORIGEN_BASE" "$NOMBRE_CARPETA"

        if [ $? -ne 0 ]; then
            echo "ERROR: Falló la compresión: $CARPETA_ORIGEN" >> "$LOG"
            rm -f "$ARCHIVO_TAR"
            TOTAL_ERRORES=$((TOTAL_ERRORES + 1))
            continue
        fi

        if [ ! -s "$ARCHIVO_TAR" ]; then
            echo "ERROR: Archivo comprimido vacío/no existe: $ARCHIVO_TAR" >> "$LOG"
            rm -f "$ARCHIVO_TAR"
            TOTAL_ERRORES=$((TOTAL_ERRORES + 1))
            continue
        fi

        TOTAL_COMPRIMIDAS=$((TOTAL_COMPRIMIDAS + 1))
        TAMANO=$(du -h "$ARCHIVO_TAR" | awk '{print $1}')
        echo "OK: Comprimido generado: $ARCHIVO_TAR ($TAMANO)" >> "$LOG"

        echo "Creando carpeta destino si no existe..." >> "$LOG"

        ssh $SSH_OPTS "$USUARIO_SSH@$DESTINO_SERVIDOR" "mkdir -p '$DESTINO_RUTA'"

        if [ $? -ne 0 ]; then
            echo "ERROR: No se pudo crear/verificar destino remoto: $DESTINO_RUTA" >> "$LOG"
            rm -f "$ARCHIVO_TAR"
            TOTAL_ERRORES=$((TOTAL_ERRORES + 1))
            continue
        fi

        echo "Enviando por rsync..." >> "$LOG"

        rsync -avzh --progress \
            -e "ssh $SSH_OPTS" \
            "$ARCHIVO_TAR" "$USUARIO_SSH@$DESTINO_SERVIDOR:$DESTINO_RUTA/"

        if [ $? -ne 0 ]; then
            echo "ERROR: Falló rsync para: $ARCHIVO_TAR" >> "$LOG"
            echo "No se elimina la carpeta origen: $CARPETA_ORIGEN" >> "$LOG"
            rm -f "$ARCHIVO_TAR"
            TOTAL_ERRORES=$((TOTAL_ERRORES + 1))
            continue
        fi

        TOTAL_ENVIADAS=$((TOTAL_ENVIADAS + 1))
        echo "OK: Transferencia completada: $ARCHIVO_TAR" >> "$LOG"

        if [ ! -d "$CARPETA_ORIGEN" ]; then
            echo "OMITIDA_BORRADO: La carpeta ya no existe al momento de borrar: $CARPETA_ORIGEN" >> "$LOG"
            rm -f "$ARCHIVO_TAR"
            TOTAL_OMITIDAS=$((TOTAL_OMITIDAS + 1))
            continue
        fi

        echo "Eliminando carpeta origen..." >> "$LOG"

        rm -rf "$CARPETA_ORIGEN"

        if [ $? -eq 0 ]; then
            echo "OK: Carpeta origen eliminada: $CARPETA_ORIGEN" >> "$LOG"
            TOTAL_BORRADAS=$((TOTAL_BORRADAS + 1))
        else
            echo "ERROR: No se pudo eliminar carpeta origen: $CARPETA_ORIGEN" >> "$LOG"
            TOTAL_ERRORES=$((TOTAL_ERRORES + 1))
        fi

        echo "Eliminando archivo temporal local..." >> "$LOG"
        rm -f "$ARCHIVO_TAR"
    done

    TOTAL_GLOBAL_COMPRIMIDAS=$((TOTAL_GLOBAL_COMPRIMIDAS + TOTAL_COMPRIMIDAS))
    TOTAL_GLOBAL_ENVIADAS=$((TOTAL_GLOBAL_ENVIADAS + TOTAL_ENVIADAS))
    TOTAL_GLOBAL_BORRADAS=$((TOTAL_GLOBAL_BORRADAS + TOTAL_BORRADAS))
    TOTAL_GLOBAL_OMITIDAS=$((TOTAL_GLOBAL_OMITIDAS + TOTAL_OMITIDAS))
    TOTAL_GLOBAL_ERRORES=$((TOTAL_GLOBAL_ERRORES + TOTAL_ERRORES))

    echo "------------------------------------------------------------" >> "$LOG"
    echo "RESUMEN $TIPO:" >> "$LOG"
    echo "Carpetas encontradas : $TOTAL_ENCONTRADAS" >> "$LOG"
    echo "Carpetas comprimidas : $TOTAL_COMPRIMIDAS" >> "$LOG"
    echo "Archivos enviados    : $TOTAL_ENVIADAS" >> "$LOG"
    echo "Carpetas borradas    : $TOTAL_BORRADAS" >> "$LOG"
    echo "Carpetas omitidas    : $TOTAL_OMITIDAS" >> "$LOG"
    echo "Errores              : $TOTAL_ERRORES" >> "$LOG"
}

{
    echo "============================================================"
    echo "INICIO GENERAL: $(date '+%Y-%m-%d %H:%M:%S')"
    echo "Criterio general: procesar carpetas con nombre YYYY-MM-DD anterior a $FECHA_CORTE"
    echo "============================================================"
} >> "$LOG"

procesar_origen "/var/www/html/uploads/videos" "videos"
procesar_origen "/var/www/html/uploads/events" "events"

{
    echo "============================================================"
    echo "RESUMEN GENERAL:"
    echo "Carpetas encontradas : $TOTAL_GLOBAL_ENCONTRADAS"
    echo "Carpetas comprimidas : $TOTAL_GLOBAL_COMPRIMIDAS"
    echo "Archivos enviados    : $TOTAL_GLOBAL_ENVIADAS"
    echo "Carpetas borradas    : $TOTAL_GLOBAL_BORRADAS"
    echo "Carpetas omitidas    : $TOTAL_GLOBAL_OMITIDAS"
    echo "Errores              : $TOTAL_GLOBAL_ERRORES"
    echo "FIN GENERAL: $(date '+%Y-%m-%d %H:%M:%S')"
    echo "============================================================"
    echo ""
} >> "$LOG"

echo "Proceso terminado."
echo "Criterio    : nombre carpeta YYYY-MM-DD < $FECHA_CORTE"
echo "Encontradas : $TOTAL_GLOBAL_ENCONTRADAS"
echo "Comprimidas : $TOTAL_GLOBAL_COMPRIMIDAS"
echo "Enviadas    : $TOTAL_GLOBAL_ENVIADAS"
echo "Borradas    : $TOTAL_GLOBAL_BORRADAS"
echo "Omitidas    : $TOTAL_GLOBAL_OMITIDAS"
echo "Errores     : $TOTAL_GLOBAL_ERRORES"
echo "Log         : $LOG"
