#!/bin/bash

# Comprueba los parametros
if [ "$#" -ne 1 ]; then
    printf "Uso: %s FILE_NAME\n" "$(basename "$0")"
    exit 0
else
    # Comprueba si existe el fichero
    if ! test -f "$1"; then
        printf "File %s does not exist.\n" "$1"
        exit 0
    fi
fi

# Variables
FILE_DIR="$(cd "$(dirname "$1")" && pwd)"
readonly FILE_DIR

FILE_NAME="$(basename "$1")"
readonly FILE_NAME

SUFFIX=".tar.gz"
readonly SUFFIX

# Crea una copia del fichero y le añade al nombre la fecha
OLD_DATE="$(date -r "$1" "+%Y-%m-%d_%H:%M:%S")"
cp "${FILE_DIR}/${FILE_NAME}" "${FILE_DIR}/${FILE_NAME}.${OLD_DATE}"

# Añade la copia del fichero al fichero .tar.gz o crea uno nuevo
if ! test -f "${FILE_DIR}/${FILE_NAME}${SUFFIX}"; then
    tar -C "${FILE_DIR}" -caf "${FILE_DIR}/${FILE_NAME}${SUFFIX}" "${FILE_NAME}.${OLD_DATE}"
    printf "File %s${SUFFIX} created.\n" "${FILE_NAME}"
else
    gunzip "${FILE_DIR}/${FILE_NAME}${SUFFIX}"
    tar -C "${FILE_DIR}" -uf "${FILE_DIR}/${FILE_NAME}.tar" "${FILE_NAME}.${OLD_DATE}"
    gzip "${FILE_DIR}/${FILE_NAME}.tar"
fi
printf "%s\n" "${FILE_NAME}.${OLD_DATE} added"
rm "${FILE_DIR}/${FILE_NAME}.${OLD_DATE}"

# Comprueba cada cierto tiempo si el fichero se ha modificado
while true; do
    sleep 60
    # Obten la fecha del fichero
    DATE="$(date -r "$1" "+%Y-%m-%d_%H:%M:%S")"
    # Si la fecha del fichero ha cambiado respecto a la que tenia almacenada es porque es una versión
    # nueva del fichero y se procede a hacer una copia en el fichero .tar.gz
    if [ "$DATE" != "$OLD_DATE" ]; then
        # Crea una copia del fichero y le añade al nombre la fecha
        cp "${FILE_DIR}/${FILE_NAME}" "${FILE_DIR}/${FILE_NAME}.${DATE}"
        # Añade la copia del fichero al fichero .tar.gz
        gunzip "${FILE_DIR}/${FILE_NAME}${SUFFIX}"
        tar -C "${FILE_DIR}" -uf "${FILE_DIR}/${FILE_NAME}.tar" "${FILE_NAME}.${DATE}"
        gzip "${FILE_DIR}/${FILE_NAME}.tar"
        # Elimina la copia del fichero
        rm "${FILE_DIR}/${FILE_NAME}.${DATE}"
        # Actualiza la fecha del fichero a la de la última copia
        OLD_DATE=$DATE
        # Informa por pantalla
        printf "%s\n" "${FILE_NAME}.${DATE} added"
    fi
done
