#!/bin/bash

# WildlifeSystems
#
# This script is part of the WildlifeSystems project. For further information
# please refer to https://docs.wildlife.systems, or for more information on
# the project itself, please refer to https://wildlife.systems.

# Return codes
#
# Further information on WildlifeSystems standard return codes can be found
# at https://docs.wildlife.systems/return-codes.html
# 0 - Success
# 1 - Already running
# 11 - Incorrect filename pattern


#Check if this script already running
if [[ "$(pgrep -c ws-run-audio)" -gt 1 ]]; then
  echo "ws-run-audio already running. Exiting."
  exit 1
fi

trap "echo 'Terminating ws-run-audio...'; exit 0" SIGINT SIGTERM

echo "Starting ws-run-audio..."

#Config
CONFIG_FILE="/etc/ws/audio.conf"
if [[ ! -f "$CONFIG_FILE" || ! -r "$CONFIG_FILE" ]]; then
  echo "Error: Config file '$CONFIG_FILE' not found or not readable."
  exit 2
fi
CONFIG=$(cat "$CONFIG_FILE")

#Check config exists
if [[ -z "$CONFIG" ]]; then
  echo "No config file found."
  exit 2
fi

FNTYPE=$(echo "$CONFIG" | jq -r '.init .filenaming')

function onOff {
  pi-pwr off "$(echo "$CONFIG" | jq -r '.init .off[]' | tr '\n' ' ')"
  pi-pwr on "$(echo "$CONFIG" | jq -r '.init .on[]' | tr '\n' ' ')"
}

while true;
do

	case $FNTYPE in
			timestamp)
					FN=$(date +%s)
					;;
			*)
					echo "Incorrect filename pattern"
					exit 11;
					;;
	esac

	# File to be created in /var/ws/audio
	if [[ ! -d "/var/ws/audio" ]]; then
		mkdir -p "/var/ws/audio"
	fi

	FN="/var/ws/audio/$FN"

	# Create empty array to store filenames
	FNARRAY=()

	N=$(echo "$CONFIG" | jq -r ".run | length")
	I=0
	while [ "$I" -lt "$N" ];
	do
		pi-pwr off $(echo "$CONFIG" | jq -r ".run[$I] .off[]" | tr '\n' ' ')
		pi-pwr on $(echo "$CONFIG" | jq -r ".run[$I] .on[]" | tr '\n' ' ')
		ACTION=$(echo "$CONFIG" | jq -r ".run[$I] .action")
		echo "$ACTION"
		sudo ws-heartbeat "$ACTION" &
        	case  "$ACTION" in
				record)
					DURATION=$(echo "$CONFIG" | jq -r ".run[$I] .duration")
					CHANNELS=$(echo "$CONFIG" | jq -r ".run[$I] .channels")
					BITRATE=$(echo "$CONFIG" | jq -r ".run[$I] .bitrate")
					FORMAT=$(echo "$CONFIG" | jq -r ".run[$I] .format")
					ws-indicate record "arecord -c $CHANNELS -r $BITRATE -f $FORMAT -d $DURATION $FN.wav"
					
					# Add file to FNARRAY
					FNARRAY+=("$FN.wav")
					;;
				sleep)
					DURATION=$(echo "$CONFIG" | jq -r ".run[$I] .duration")
					sleep "$DURATION"
					;;
				check-network)
					# Check if we can ping default gateway
					GATEWAY=$(pi-data default-gateway)
					if [[ -z "$GATEWAY" ]]; then
						pi-util reset-network
					fi
					if ! ping -c 1 "$GATEWAY" &> /dev/null; then
						pi-util reset-network
					fi

					;;
				 upload-delete)
					METHOD=$(echo "$CONFIG" | jq -r ".run[$I] .method")
					UPPATH=$(echo "$CONFIG" | jq -r ".run[$I] .path")
					EXTENSION=$(echo "$CONFIG" | jq -r ".run[$I] .extension")
					ASYNC=$(echo "$CONFIG" | jq -r ".run[$I] .async")
					case $METHOD in
						s3cmd)
							S3UP=$(eval echo "s3cmd put $FN.$EXTENSION s3://$UPPATH")
							S3UP="$S3UP && rm $FN.$EXTENSION"
							if [[ "$ASYNC" == "true" ]]; then
								S3UP="( $S3UP )&";
							fi
							eval "$S3UP"
							;;
						mv)
							MVUPPATH=$(eval "echo ${UPPATH}")

							# Check if the destination directory exists
							if [[ ! -d "$MVUPPATH" ]]; then
											mkdir -p "$MVUPPATH"
							fi

							mv "$FN.$EXTENSION" "$MVUPPATH" &
							;;
						script)
							SCRIPT=$(echo "$CONFIG" | jq -r ".run[$I] .script")
							if [[ ! -x "$SCRIPT" ]]; then
								echo "Script $SCRIPT not executable."
							fi
						    # Loop over the files in the array
							for FILE in "${FNARRAY[@]}"; do
								# Check if the file exists
								if [[ -f "$FILE" ]]; then
									#Call the script with the file as an argument
									"$SCRIPT" "$FILE" &
								else
									echo "File $FILE not found."
								fi
								# Remove the file from the array
								FNARRAY=("${FNARRAY[@]/$FILE}")
							done
							;;
					esac
					;;
				clearup)
					METHOD=$(echo "$CONFIG" | jq -r ".run[$I] .method")
					case $METHOD in
						script)
							SCRIPT=$(echo "$CONFIG" | jq -r ".run[$I] .script")
							# Check if the script exists and is executable
							if [[ -x "$SCRIPT" ]]; then
									"$SCRIPT" &
							else
									echo "Script $SCRIPT not found or not executable."
							fi
							;;
						*)
							echo "Unknown method: $METHOD" 1>&2
							;;
					esac
					;;
				*)
					echo "Unknown action: $ACTION" 1>&2
					;;
			esac

		I=$((I + 1))
		ws-indicate heartbeat
		onOff
	done
done
