#!/bin/bash +x
# legge da file ~/calendario lista di scadenze con formato 
# YYYY-MM-DD HH:MM DESCRIZIONE
# e scrive sul file ~/promemoria due avvisi,1 giorno e 1 ora prima della scadenza
#
# questa prima versione che utilizza un file temporaneo per pianificare i task e verificarli 
# periodicamente, cercandoli testualmente nel file

FILEALLARMI=$(mktemp) #crea file temporaneo
cat ~/calendario | while read DATA ORA DESCRIZIONE
	do
		SCADENZA=$(date +%s -d "$DATA $ORA") # conversione in secondi dal 1970-01-01 01:00
		GIORNOPRIMA=$(( SCADENZA - 24*60*60 ))
		ORAPRIMA=$(( SCADENZA - 60*60 ))
		echo "$GIORNOPRIMA $DATA $ORA $DESCRIZIONE" >> "$FILEALLARMI"
		echo "$ORAPRIMA $DATA $ORA $DESCRIZIONE" >> "$FILEALLARMI"
	done

#ho necessità di far eseguire il controllo una e una sola volta ogni minuto,
#una possibilità è ciclare più di frequente e controllare se il minuto cambia
#in questo modo compenso anche l'imprevedibilità dei tempi di esecuzione
#del corpo del ciclo (mentre se usassi sleep 60 potrei andare alla deriva)

NOW=0
while sleep 20 ; do
	[[ $(date +%M) -eq $NOW ]] && continue
	
	NOW=$(date +%M)
	
	# nota: i timestamp originali hanno la granularità del minuto,
	# ma il tempo corrente considera i secondi, devo troncarli
	# trick, ma si può fare in altri modi: la divisione per 60 restituisce un intero...
	CURRENTMINUTE=$(( $(date +%s) / 60 * 60))
	
	# nota: ci possono essere zero, una o più righe col timestamp corrente
	# grep | while è il modo più semplice di gestirle, un'iterazione per ogni riga
	# incluso il caso di zero iterazioni nei minuti per cui non ci sono corrispondenze
	egrep "^$CURRENTMINUTE" "$FILEALLARMI" | while read TIMESTAMP DATA ORA DESCRIZIONE ; do
		echo "$DESCRIZIONE scade il $DATA alle $ORA"
	done >> ~/promemoria #redirige stdout del while in append

done