#!/bin/sh

case $1 in
	sent)
		find /var/spool/sms/sent/ -type f 2>/dev/null | sort -r | awk '
		{
			file = $0
			n = split(file, parts, "/")
			filename = parts[n]
			to = ""; sent = ""; time = ""; content = ""
			in_header = 1
			while ((getline < file) > 0) {
				sub(/\r$/, "", $0)
				if (in_header) {
					if (/^To:/) { to = $2; gsub(/[^+0-9]/, "", to) }
					else if (/^Sent:/) { sent = $0; sub(/^Sent:[ \t]*/, "", sent) }
					else if (/^Sending_time:/) { time = $2 }
					else if (/^$/) { in_header = 0; is_first_line = 1 }
				} else {
					if (is_first_line) { content = $0; is_first_line = 0 }
					else { content = content "<br />" $0 }
				}
			}
			close(file)
			gsub(/---TAB---|---MSG---/, " ", to)
			gsub(/---TAB---|---MSG---/, " ", sent)
			gsub(/---TAB---|---MSG---/, " ", time)
			gsub(/---TAB---|---MSG---/, " ", content)
			sub(/^(<br \/>)+/, "", content)
			sub(/(<br \/>)+$/, "", content)
			printf "%s---TAB---%s---TAB---%s---TAB---%s---TAB---%s\n", filename, to, sent, time, content
		}' | \
		jq -a -R 'split("---TAB---") | select(length >= 5) | {file: .[0], to: .[1], sent: .[2], time: .[3], content: .[4]} | select(.to != "" and .to != null)' | jq -a -s '{ "sent": (sort_by(.sent) | reverse) }'
	;;
	recv)
		find /var/spool/sms/incoming/ -type f 2>/dev/null | sort -r | awk '
		function hex2dec(h) {
			hex = "0123456789ABCDEF"
			h = toupper(h)
			res = 0
			for (i = 1; i <= length(h); i++) {
				res = res * 16 + index(hex, substr(h, i, 1)) - 1
			}
			return res
		}
		{
			file = $0
			n = split(file, parts, "/")
			filename = parts[n]
			from = ""; srecv = ""; drecv = ""; content = ""; udh = ""
			in_header = 1
			while ((getline < file) > 0) {
				sub(/\r$/, "", $0)
				if (in_header) {
					if (/^From:/) { from = $2; gsub(/\021/, " ", from) }
					else if (/^Sent:/) { srecv = $0; sub(/^Sent:[ \t]*/, "", srecv) }
					else if (/^Received:/) { drecv = $0; sub(/^Received:[ \t]*/, "", drecv) }
					else if (/^UDH-DATA:/) { udh = $0; sub(/^UDH-DATA:[ \t]*/, "", udh) }
					else if (/^$/) { in_header = 0; is_first_line = 1 }
				} else {
					if (is_first_line) { content = $0; is_first_line = 0 }
					else { content = content "<br />" $0 }
				}
			}
			close(file)
			gsub(/---TAB---|---MSG---/, " ", from)
			gsub(/---TAB---|---MSG---/, " ", srecv)
			gsub(/---TAB---|---MSG---/, " ", drecv)
			gsub(/---TAB---|---MSG---/, " ", content)

			part = 1; total = 1; ref = filename
			if (udh != "") {
				n_udh = split(udh, udh_arr, " ")
				if (n_udh >= 6) {
					part = hex2dec(udh_arr[n_udh])
					total = hex2dec(udh_arr[n_udh-1])
					ref = from "_" srecv "_" udh_arr[n_udh-2]
					if (n_udh >= 7 && udh_arr[2] == "08") {
						ref = from "_" srecv "_" udh_arr[n_udh-3] "_" udh_arr[n_udh-2]
					}
				}
			}

			if (!(ref in msgs)) {
				msgs[ref] = 1
				msgs_from[ref] = from
				msgs_srecv[ref] = srecv
				msgs_drecv[ref] = drecv
			}
			msgs_content[ref, part] = content
			if (msgs_files[ref] == "") {
				msgs_files[ref] = filename
			} else {
				msgs_files[ref] = msgs_files[ref] "," filename
			}
			msgs_total[ref] = total
		}
		END {
			for (ref in msgs) {
				full_content = ""
				for (p = 1; p <= msgs_total[ref]; p++) {
					if ((ref, p) in msgs_content) {
						full_content = full_content msgs_content[ref, p]
					}
				}
				sub(/^(<br \/>)+/, "", full_content)
				sub(/(<br \/>)+$/, "", full_content)
				printf "%s---TAB---%s---TAB---%s---TAB---%s---TAB---%s\n", msgs_files[ref], msgs_from[ref], msgs_srecv[ref], msgs_drecv[ref], full_content
			}
		}' | \
		jq -a -R 'split("---TAB---") | select(length >= 5) | {file: .[0], from: .[1], srecv: .[2], drecv: .[3], content: .[4]} | select(.from != "" and .from != null)' | jq -a -s '{ "recv": (sort_by(.drecv) | reverse) }'
	;;
	rmsent) rm -rf /var/spool/sms/sent/* ;;
	rmrecv) rm -rf /var/spool/sms/incoming/* ;;
	delsent)
		base=$(basename "$2")
		[ -n "$base" ] && rm -f "/var/spool/sms/sent/$base"
	;;
	delrecv)
		for base in $(echo "$2" | tr ',' ' '); do
			base=$(basename "$base")
			[ -n "$base" ] && rm -f "/var/spool/sms/incoming/$base"
		done
	;;
esac
