#!/bin/bash +x
# formato record calendario 
# YYYY-MM-DD HH:MM DESCRIZIONE
# Questo script può accertarsi che remind.sh venga eseguito da cron. Per fare ciò
# estrae il file di configurazione attivo di cron, e prima di aggiungere la riga 
# che schedula remind.sh, ripulisce il file di cron da eventuali righe che già 
# siano presenti con la stessa direttiva, per evitare di duplicarle. Infine 
# installa la nuova configurazione.

function removeAlerts() {
#$1 file calendario
#$2 file allarmi
# formato record calendario 
# YYYY-MM-DD HH:MM DESCRIZIONE
# formato record allarmi
# SECONDI YYYY-MM-DD HH:MM DESCRIZIONE

test -f "$1" || {
	echo "$FUNCNAME" il primo parametro deve essere un file calendario esistente
	exit 1
}
test -f "$2" || {
	echo "$FUNCNAME" il secondo parametro deve essere un file allarmi esistente
	exit 1
}

TMPALARM=$(mktemp) #crea file notifiche temporaneo

cat "$2" | while read SCADENZA DATA ORA DESCRIZIONE
do
	ROWALERT="$SCADENZA $DATA $ORA $DESCRIZIONE"
	ROWCAL="$DATA $ORA $DESCRIZIONE"
	grep -qx "$ROWCAL" "$1" && echo "$ROWALERT" >> "$TMPALARM" # append degli eventi presenti in calendario
done

echo "$TMPALARM" > "$2" #sovrascrive file allarmi
rm -f "$TMPALARM"  #elimina file allarmi temporaneo

}

test -f "$1" || { #controllo parametri
	echo il primo parametro deve essere un file calendario esistente
	exit 1
}

test "$2" || {
	echo servono due parametri, il secondo deve essere un nome di file delle scadenze da creare o aggiornare
	exit 2
}

CALENDARIO="$1"
FILEALLARMI="$2"

removeAlarms "$CALENDARIO" "$FILEALLARMI" # rimuove eventi non presenti in calendario da file allarmi


cat "$CALENDARIO" | while read DATA ORA DESCRIZIONE
do
	SCADENZA=$(date +%s -d "$DATA $ORA") # conversione in secondi dal 1970-01-01 01:00
	RIGAGIORNOPRIMA="$(( SCADENZA - 24*60*60 )) $DATA $ORA $DESCRIZIONE"
	RIGAORAPRIMA="$(( SCADENZA - 60*60 )) $DATA $ORA $DESCRIZIONE"
	grep -qx "$RIGAGIORNOPRIMA" "$FILEALLARMI" || echo "$RIGAGIORNOPRIMA" >> "$FILEALLARMI" #accoda al file delle scadenze solo quelle che non sono gia presenti
	grep -qx "$RIGAORAPRIMA" "$FILEALLARMI" || echo "$RIGAORAPRIMA" >> "$FILEALLARMI"
done

TMPCRON=$(mktemp)
RIGACRON="* * * * * $HOME/remind.sh $FILEALLARMI"

crontab -l | grep -Fvx "$RIGACRON" > "$TMPCRON" 
#grep -F disattiva RE e cerca il parametro letteralmente, 
# -x fa match solo con l'intera riga, 
# -v restituisce solo le righe che NON contengono l'espressione; quindi sovrascriviamo il file temporaneo togliendo eventuali righe con la stessa direttiva

echo "$RIGACRON" >> "$TMPCRON" #aggiungiamo la direttiva al file temporaneo

crontab "$TMPCRON" #prende file temporaneo come parametro
rm -f "$TMPCRON"