#!/usr/bin/env bash

# This is largely borrowed from:
# https://git.sr.ht/~mil/sxmo-utils/tree/master/item/scripts/modem/sxmo_modemmonitor.sh

# This is where sms messages will be stored
SMS_DIR="${XDG_DATA_HOME:-$HOME/.local/share}/SMS/"

die(){
	echo "$@" > /dev/stderr
	rm "$FILE"
	exit 1
}

usage(){
	echo "checkSMS [options] [message|-]"
	echo "Options:"
	echo "  -h|--help       Display this help text"
	echo "  -m|--modem      Specify a modem"
	echo "  --dry-run       Don't actually send the message"
}


trimWhitespace(){
	sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//'
}

mkdir -p "$SMS_DIR"

dryrun="false"
edit="false"

# Assume we want the first modem
# can be overwritten by the -m option
modem="$(mmcli -L | grep -oE 'Modem\/[0-9]+' | head -n 1 | cut -d'/' -f2)"


# Iterate over options breaking -ab into -a -b when needed and --foo=bar into
# --foo bar
optstring=h
unset options
while (($#)); do
	case $1 in
		# If option is of type -ab
		-[!-]?*)
		# Loop over each character starting with the second
		for ((i=1; i < ${#1}; i++)); do
			c=${1:i:1}

			# Add current char to options
			options+=("-$c")

			# If option takes a required argument, and it's not the last char make
			# the rest of the string its argument
			if [[ $optstring = *"$c:"* && ${1:i+1} ]]; then
				options+=("${1:i+1}")
				break
			fi
		done
		;;

		# If option is of type --foo=bar
		--?*=*) options+=("${1%%=*}" "${1#*=}") ;;
		# add --endopts for --
		--) options+=(--endopts) ;;
		# Otherwise, nothing special
		*) options+=("$1") ;;
	esac
	shift
done
set -- "${options[@]}"
unset options


# Read the options and set stuff
while [[ $1 = -?* ]]; do
	case $1 in
		-h|--help) usage; exit;;
		-m|--modem) modem="$2"; shift ;;
		--dry-run) dryrun="true" ;;
		--) shift; break ;;
		*) die "invalid option: '$1'." ;;
	esac
	shift
done

# Get the ids of new texts
ids="$( mmcli -m "$modem" --messaging-list-sms |
	grep -Eo '/SMS/[0-9]+ \(received\)' | grep -Eo '[0-9]+' )"

count="$(echo -n "$ids" | wc -l)"

[ "$count" -eq 0 ] && return

echo "$ids" | while read -r id; do
	# Get the details of the message
	details="$(mmcli -m "$modem" -s "$id" -K)"
	number="$(echo "$details" | grep "sms.content.number" | cut -d':' -f2- |
		trimWhitespace)"
	text="$(echo "$details" | grep "sms.content.text" | cut -d':' -f2- |
		trimWhitespace)"
	time="$(echo "$details" | grep "sms.properties.timestamp" | cut -d':' -f2- |
		trimWhitespace)"

	# Make a directory if necesary
	mkdir -p "$SMS_DIR/$number"

	log="$SMS_DIR/$number/sms.log"

	# Store the message in the log file
	echo "RECIEVED"
	echo "SENDER: $number" >> $log
	echo "TIME: $(date -d "$time")" >> $log
	echo "----" >> $log
	echo -e "$text" >> $log
	printf '\00\n' >> $log

	mmcli -m "$modem" --messaging-delete-sms="$id"
done

notify-send "$count new messages"