#!/bin/bash

# Description: This script outputs days until the next time zone
# discontinuity using 'zdump' and 'date'.

#=================ADJUST ME=======================
SCRIPT_TZ="America/Los_Angeles" # Timezone to check for discontinuities
#=================================================

yell() { echo "$0: $*" >&2; } # Yell, Die, Try Three-Fingered Claw technique; # Ref/Attrib: https://stackoverflow.com/a/25515370
die() { yell "$*"; exit 111; }
try() { "$@" || die "cannot $*"; }

# Declare variables
declare -a datesDiscontArray #array

SCRIPT_YEAR=$(date +%Y)
SCRIPT_YEAR_NEXT=$(( $(date +%Y) + 1))
SCRIPT_YEAR_NEXT2=$(( $(date +%Y) + 2))
SCRIPT_RUN_DATE_SECONDS=$(date +%s)

# Save zdump output for SCRIPT_YEAR (for how multiline data saved in variable, see https://stackoverflow.com/a/613580 )
datesDiscont="$(zdump -c "$SCRIPT_YEAR","$SCRIPT_YEAR_NEXT2" -v $SCRIPT_TZ | grep "$SCRIPT_YEAR\|$SCRIPT_YEAR_NEXT" |  awk '{ print $2 " " $3 " " $4 " " $5 " " $6 " " $7 }'; echo)"
if [ -z "$datesDiscont" ]; then
    echo "No time discontinuity this year.";
    exit 1;
fi;

###yell "DEBUG:datesDiscont----------";
###echo "$datesDiscont" 1>&2;
###yell "DEBUG:-----------";

# Count lines in datesDiscont (for counting lines in a variable, see https://stackoverflow.com/a/6314682 )
#datesDiscontLineCount=$(echo "$datesDiscont" | wc -l)

# Convert datesDiscont into array (for how to process each line in a multiline variable, see https://superuser.com/a/284226 )
while IFS= read -r line; do
    #echo "$line"
    #datesDiscontArray+="$line"
    datesDiscontArray+=($(date --date="$line" +%s))
    #echo ${datesDiscontArray[-1]}
done <<< "$datesDiscont"
#yell ${datesDiscontArray[@]}

# Sort datesDiscontArray (see https://stackoverflow.com/a/11789688 )
IFS=$'\n' datesDiscontArray=($(sort <<<"${datesDiscontArray[*]}"))
unset IFS

###yell "DEBUG:";
###yell "DEBUG:datesDiscontArray:";
###yell "${datesDiscontArray[@]}";
###yell "DEBUG:";

# Get earliest date in datesDiscontArray that isn't in the past.
for discontinuityDate in "${datesDiscontArray[@]}"; do
    ###yell "DEBUG:Discontinuity date (seconds):"$discontinuityDate
    ###yell "DEBUG:SCRIPT_RUN_DATE_SECONDS     :"$SCRIPT_RUN_DATE_SECONDS
    if [ $discontinuityDate -gt $SCRIPT_RUN_DATE_SECONDS ]; then
	###yell "DEBUG:Date in future."
	nextDiscontDate="$discontinuityDate"
	break
    fi
done

# Check that nextDiscontDate is not empty
if [ -z "$nextDiscontDate" ]; then
    echo "ERROR:nextDiscontDate empty"
fi;
   

###yell "DEBUG:nextDiscontDate:$nextDiscontDate";
###yell "DEBUG:SCRIPT_RUN_DATE_SECONDS:$SCRIPT_RUN_DATE_SECONDS";

echo $(( ( $nextDiscontDate - $SCRIPT_RUN_DATE_SECONDS )/86400 ))" days" # Days until next discontinuity date