#!/bin/bash

# Desc: Set time zone environment variable TZ

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 $*"; }
setTimeZoneEV(){
    # Desc: Set time zone environment variable TZ
    # Usage: setTimeZoneEV arg1
    # Version 0.1.2
    # Input: arg1: 'date'-compatible timezone string (ex: "America/New_York")
    #        TZDIR env var (optional; default: "/usr/share/zoneinfo")
    # Output: exports TZ
    #         exit code 0 on success
    #         exit code 1 on incorrect number of arguments
    #         exit code 2 if unable to validate arg1
    # Depends: yell(), printenv 8.30, bash 5.0.3
    # Tested on: Debian 10
    local tzDir returnState argTimeZone

    argTimeZone="$1"
    if ! [[ $# -eq 1 ]]; then
	yell "ERROR:Invalid argument count.";
	return 1;
    fi

    # Read TZDIR env var if available
    if printenv TZDIR 1>/dev/null 2>&1; then
	tzDir="$(printenv TZDIR)";
    else
	tzDir="/usr/share/zoneinfo";
    fi
    
    # Validate TZ string
    if ! [[ -f "$tzDir"/"$argTimeZone" ]]; then
	yell "ERROR:Invalid time zone argument.";
	return 2;
    else
    # Export ARG1 as TZ environment variable
	TZ="$argTimeZone" && export TZ && returnState="true";
    fi

    # Determine function return code
    if [ "$returnState" = "true" ]; then
	return 0;
    fi
} # Exports TZ environment variable

#==BEGIN sample code==
date --iso-8601=seconds; echo "==============="; sleep 2

date --iso-8601=seconds
cmd1="setTimeZoneEV America/New_York"
echo "Running:$cmd1"; $cmd1; echo "Exit code:$?"
date --iso-8601=seconds; echo "==============="; sleep 2

date --iso-8601=seconds
cmd2="setTimeZoneEV Asia/Tokyo"
echo "Running:$cmd2"; $cmd2; echo "Exit code:$?"
date --iso-8601=seconds; echo "==============="; sleep 2

date --iso-8601=seconds
cmd3="setTimeZoneEV";
echo "Running:$cmd3"; $cmd3; echo "Exit code:$?"
date --iso-8601=seconds; echo "==============="; sleep 2

date --iso-8601=seconds
cmd4="setTimeZoneEV Pacific/Lemuria"
echo "Running:$cmd4"; $cmd4; echo "Exit code:$?"
date --iso-8601=seconds; echo "==============="; sleep 2

try setTimeZoneEV Atlantic/Atlantis
#==END sample code==

# Author: Steven Baltakatei Sandoval
# License: GPLv3+