#!/usr/bin/env bash


DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
source "$DIR/common"
export DISPLAY=:0.0

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


# Stolen from sxmo
lookupnumberfromcallid() {
	local id=$1
	mmcli -m "$modem" --voice-list-calls -o "$id" -K |
		grep call.properties.number |
		cut -d ':' -f 2 |
		tr -d ' '
}

# Stolen from sxmo
toggleflag() {
	TOGGLEFLAG=$1
	shift
	FLAGS="$*"

	echo -- "$FLAGS" | grep -- "$TOGGLEFLAG" >&2 &&
		NEWFLAGS="$(echo -- "$FLAGS" | sed "s/$TOGGLEFLAG//g")" ||
		NEWFLAGS="$(echo -- "$FLAGS $TOGGLEFLAG")"

	NEWFLAGS="$(echo -- "$NEWFLAGS" | sed "s/--//g; s/  / /g")"

	# shellcheck disable=SC2086
	megiaudioroute $NEWFLAGS
	echo -- "$NEWFLAGS"
}

# Stolen from sxmo
toggleflagset() {
	FLAGS="$(toggleflag "$1" "$FLAGS")"
}


lookupcontact(){
	local contact="$(contact-numbers "$1" | cut -d '	' -f 1)"
	if [ -n "$contact" ]; then
		echo "$contact"
	else
		echo "$1" |
			# Remove the +44 and replace with 0
			sed 's/^\+44/0/'
	fi
}

dtmf(){
	local id="$1"
	svkbd-numbers &
	local choice="$( (
		echo "Exit"
		) | rofi -dmenu -i -me-accept-entry '!MousePrimary' -p "Tones" -normal-window -font 'Iosevka 20' )"
	if [ "$choice" = "Exit" ]; then
		return
	fi
	echo "$choice" | grep -o '.' | while read -r tone; do
	sleep 0.5
		mmcli -m "$modem" -o "$id" --send-dtmf="$tone"
	done
	pkill svkbd-numbers

}

ongoingCall(){
	local id="$1"

	# Stolen from sxmo
	FLAGS=" "
	toggleflagset "-e"
	toggleflagset "-m"
	toggleflagset "-2"
	toggleflagset "-2"
	toggleflagset "-2"

	notify-send "I get here"

	while : ; do
		choice="$( (
			echo "Hang Up"
			echo "DTMF Tones"
			echo "Volume Up"
			echo "Volume Down"
			) | trofi)"

		case "$choice" in
			"Hang Up") rejectCall "$1"; break ;;
			"DTMF Tones") dtmf "$1" ;;
			"Volume"*) notify-send "Still need to implement" ;;
		esac

	done
}

answerCall(){

	pkill mpv
	sleep 0.2

	echo "answer call $1" > /dev/tty
	mmcli -m "$modem" -o "$1" --accept

	ongoingCall "$1"
}

rejectCall(){
	pkill mpv
	echo "reject call $1" > /dev/tty
	mmcli -m "$modem" -o "$1" --hangup
	mmcli -m "$modem" --voice-delete-call="$1"

	mmcli -m "$modem" --voice-hangup-all
	for CALLID in $( mmcli -m "$modem" --voice-list-calls | grep -oE "Call\/[0-9]+" | cut -d'/' -f2); do
		echo mmcli -m "$modem" --voice-delete-call "$CALLID" > ~/.hangup.log
	done

	# Not sure why but sometimes the modem changes
	# To be sure, re-check the modem and delete all calls
	local tmpmodem="$(mmcli -L | grep -oE 'Modem\/[0-9]+' | head -n 1 | cut -d'/' -f2)"

	mmcli -m "$tmpmodem" --voice-hangup-all
	for CALLID in $( mmcli -m "$tmpmodem" --voice-list-calls | grep -oE "Call\/[0-9]+" | cut -d'/' -f2); do
		echo mmcli -m "$tmpmodem" --voice-delete-call "$CALLID" > ~/.hangup.log
	done

	alsactl --file "$ALSA_CONF_DIR/default_alsa_sound.conf" restore
}

promptIncoming(){
	export DISPLAY=:0.0

	local answer=""
	local reject=""

	local choice=''
	local contact="$1"

	local prompt="$(echo -en "Incoming Call\n$contact")"

	choice="$(echo -e "$answer\n$reject" | rofi -dmenu -i \
		-theme themes/incoming-call.rasi -a 0 -u 1 \
		-p "$prompt" \
		-window-title "call-from-$contact" \
		-me-select-entry '' -me-accept-entry MousePrimary)"

	case "$choice" in
		"$answer") echo "accept" ;;
		"$reject") echo "reject" ;;
	esac
}

checkOutgoing(){
	export DISPLAY=:0.0
	if [ "$dryrun" = "true" ]; then
		return
	fi
	notify-send "outgoing call" "$1"
	mmcli -m "$modem" -o "$1" --start

	ongoingCall "$1"
}

checkIncoming(){
	export DISPLAY=:0.0
	if [ "$dryrun" = "true" ]; then
		promptIncoming "+441234567890"
		return
	fi
	local id="$( mmcli -m "$modem" --voice-list-calls |
		grep -Eo '[0-9]+ incoming \(ringing-in\)' | grep -Eo '[0-9]+' )"

	local count="$(echo "$id" | deleteEmptyLines | wc -l)"

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

	local number="$(lookupnumberfromcallid "$id")"
	local contact="$(lookupcontact "$number")"

	local action=""
	while mmcli -m "$modem" --voice-list-calls | grep -Eoq "$id"' incoming \(ringing-in\)' && [ -z "$action" ]; do
		mpv "$HOME/.local/share/soundeffects/ringtone" --loop &
		action="$(promptIncoming "$contact")"
	done
	case "$action" in
		"accept") answerCall "$id"; ;;
		"reject") rejectCall "$id"; ;;
	esac

}

checkFinished(){
	local ids="$( mmcli -m "$modem" --voice-list-calls |
		grep -Eo '[0-9]+ incoming \(terminated\)' | grep -Eo '[0-9]+' )"

	local count="$(echo "$ids" | deleteEmptyLines | wc -l)"
	echo "Finished Count: $count"

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

	echo "$ids" | while read -r id; do
		# Delete from the modem
		local number="$(lookupnumberfromcallid "$id")"
		local contact="$(lookupcontact "$number")"

		echo "I get here"

		# If there is a rofi process with the title of "call-from-number", then
		# it hasn't been answerd yet.
		# Treat as a missed call
		if ps aux | grep -E '\Wrofi' | grep -q "call-from-$contact"; then
			echo -e "$(date '+%s')\t$contact\t$number" >> "$CALL_DIR/missed-calls"
			pkill mpv
			mmcli -m "$modem" --voice-delete-call "$id"
			ps aux | grep -E '\Wrofi' | grep "call-from-$contact" |
				awk '{print $2}' | xargs kill
		fi


			
	done
}

mkdir -p "$CALL_DIR"

dryrun="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)"



# 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

if [ -n "$1" ]; then
	checkOutgoing "$1" &
else
	checkIncoming &
	checkFinished &
fi



