#!/bin/sh
# configversion: 1

# we disable shellcheck SC2154 (unreferenced variable used)
# shellcheck disable=SC2154

# include common definitions
# shellcheck source=scripts/core/sxmo_icons.sh
. "$(which sxmo_icons.sh)"
# shellcheck source=scripts/core/sxmo_common.sh
. "$(which sxmo_common.sh)"

set_time() {
	date +%H:%M | head -c -1 | sxmo_status.sh add 99-time
}

set_locked() {
	if sxmo_screenlock.sh getCurState | grep -q unlock; then
		sxmo_status.sh del 0-locked
	else
		sxmo_status.sh add 0-locked "$icon_lck" # You can also use "$icon_nto"
	fi
}

set_call_duration() {
	if ! pgrep sxmo_modemcall.sh > /dev/null; then
		sxmo_status.sh del 0-call-duration
		return
	fi

	NOWS="$(date +"%s")"
	CALLSTARTS="$(date +"%s" -d "$(
		grep -aE 'call_start|call_pickup' "$XDG_DATA_HOME"/sxmo/modem/modemlog.tsv |
		tail -n1 |
		cut -f1
	)")"
	CALLSECONDS="$(printf "%s - %s" "$NOWS" "$CALLSTARTS" | bc)"
	printf "%ss " "$CALLSECONDS" | sxmo_status.sh add 5-call-duration
}

_modem() {
	MMCLI="$(mmcli -m any -J 2>/dev/null)"
	MODEMSTATUS=""

	if [ -z "$MMCLI" ]; then
		printf "%s" "$icon_cls"
	else
		MODEMSTATUS="$(printf %s "$MMCLI" | jq -r .modem.generic.state)"
		case "$MODEMSTATUS" in
			locked)
				printf "%s" "$icon_plk"
				;;
			initializing)
				printf "I"
				;;
			disabled) # low power state
				printf "%s" "$icon_mdd"
				;;
			disabling)
				printf ">%s" "$icon_mdd"
				;;
			enabling) # modem enabled but neither registered (cell) nor connected (data)
				printf ">%s" "$icon_ena"
				;;
			enabled)
				printf "%s" "$icon_ena"
				;;
			searching) # i.e. registering
				printf "%s" "$icon_dot"
				;;
			registered|connected|connecting|disconnecting)
				MODEMSIGNAL="$(printf %s "$MMCLI" | jq -r '.modem.generic."signal-quality".value')"
				if [ "$MODEMSIGNAL" -lt 20 ]; then
					printf ""
				elif [ "$MODEMSIGNAL" -lt 40 ]; then
					printf ""
				elif [ "$MODEMSIGNAL" -lt 60 ]; then
					printf ""
				elif [ "$MODEMSIGNAL" -lt 80 ]; then
					printf ""
				else
					printf ""
				fi
				;;
			*)
				# FAILED, UNKNOWN
				# see https://www.freedesktop.org/software/ModemManager/doc/latest/ModemManager/ModemManager-Flags-and-Enumerations.html#MMModemState
				sxmo_log "WARNING: MODEMSTATUS: $MODEMSTATUS"
				printf "<%s>" "$MODEMSTATUS"
				;;
		esac
	fi

	case "$MODEMSTATUS" in
		"connected")
			printf " "
			USEDTECHS="$(printf %s "$MMCLI" | jq -r '.modem.generic."access-technologies"[]')"
			case "$USEDTECHS" in
				*5gnr*)
					printf 5g # no icon yet
					;;
				*lte*)
					printf 4g # ﰒ is in the bad range
					;;
				*umts*|*hsdpa*|*hsupa*|*hspa*|*1xrtt*|*evdo0*|*evdoa*|*evdob*)
					printf 3g # ﰑ is in the bad range
					;;
				*edge*)
					printf E
					;;
				*pots*|*gsm*|*gprs*)
					printf 2g # ﰐ is in the bad range
					;;
				*)
					sxmo_log "WARNING: USEDTECHS: $USEDTECHS"
					printf "<%s>" "$USEDTECHS"
					;;
			esac
			;;
		"connecting")
			printf " >>"
			;;
		"disconnecting")
			printf " <<"
			;;
	esac
}

set_modem() {
	_modem | sxmo_status.sh add 10-modem-status
}

set_modem_monitor() {
	if sxmo_daemons.sh running modem_monitor -q; then
		sxmo_status.sh add 20-modem-monitor-status "$icon_mod"
	else
		sxmo_status.sh del 20-modem-monitor-status
	fi
}

set_wifi() {
	WLANSTATE="$(tr -d "\n" < /sys/class/net/wlan0/operstate)"
	if [ "$WLANSTATE" = "up" ]; then
		sxmo_status.sh add 30-wifi-status "$icon_wif"
	else
		sxmo_status.sh del 30-wifi-status
	fi
}

set_vpn() {
	VPNDEVICE="$(nmcli con show | grep vpn | awk '{ print $4 }')"
	WGDEVICE="$(nmcli con show | grep wireguard | awk '{ print $4 }')"
	if [ -n "$VPNDEVICE" ] && [ "$VPNDEVICE" != "--" ]; then
		sxmo_status.sh add 30-vpn-status "$icon_key"
	elif [ -n "$WGDEVICE" ] && [ "$WGDEVICE" != "--" ]; then
		sxmo_status.sh add 30-vpn-status "$icon_key"
	else
		sxmo_status.sh del 30-vpn-status
	fi
}

_battery() {
	for power_supply in /sys/class/power_supply/*; do
		if [ "$(cat "$power_supply"/type)" = "Battery" ]; then
			PCT="$(cat "$power_supply"/capacity)"
			BATSTATUS="$(cut -c1 "$power_supply"/status)"

			if [ "$BATSTATUS" = "C" ]; then
				if [ "$PCT" -lt 20 ]; then
					printf ""
				elif [ "$PCT" -lt 30 ]; then
					printf ""
				elif [ "$PCT" -lt 40 ]; then
					printf ""
				elif [ "$PCT" -lt 60 ]; then
					printf ""
				elif [ "$PCT" -lt 80 ]; then
					printf ""
				elif [ "$PCT" -lt 90 ]; then
					printf ""
				else
					printf ""
				fi
			else
				if [ "$PCT" -lt 10 ]; then
					printf ""
				elif [ "$PCT" -lt 20 ]; then
					printf ""
				elif [ "$PCT" -lt 30 ]; then
					printf ""
				elif [ "$PCT" -lt 40 ]; then
					printf ""
				elif [ "$PCT" -lt 50 ]; then
					printf ""
				elif [ "$PCT" -lt 60 ]; then
					printf ""
				elif [ "$PCT" -lt 70 ]; then
					printf ""
				elif [ "$PCT" -lt 80 ]; then
					printf ""
				elif [ "$PCT" -lt 90 ]; then
					printf ""
				else
					printf ""
			fi
		fi

		[ -z "$SXMO_BAR_HIDE_BAT_PER" ] && printf " %s%%" "$PCT"
	fi
done
}

set_battery() {
	 _battery | sxmo_status.sh add 40-battery-status
}

_volume() {
	case "$(sxmo_audio.sh device get 2>/dev/null)" in
		Speaker|"")
			# nothing for default or pulse devices
			;;
		Headphones)
			printf "%s " "$icon_hdp"
			;;
		Earpiece)
			printf "%s " "$icon_ear"
			;;
	esac

	VOL="$(sxmo_audio.sh vol get)"
	if [ -z "$VOL" ] || [ "$VOL" -eq 0 ]; then
		printf "%s " "$icon_mut"
	elif [ "$VOL" -gt 66 ]; then
		printf "%s" "$icon_spk"
	elif [ "$VOL" -gt 33 ]; then
		printf "%s" "$icon_spm"
	elif [ "$VOL" -gt 0 ]; then
		printf "%s" "$icon_spl"
	fi
}

set_volume() {
	 _volume | sxmo_status.sh add 50-volume
}

_cputemp() {
        sensors cpu0_thermal-virtual-0 | cut -d' ' -f9 | sed '3!d' | tr -d + 
}

set_cputemp() {
        _cputemp | sxmo_status.sh add 08-cputemp
}

_ram() {
        printf '%s  %s' "$icon_ram" "$(free -h | awk '{print $3}' | sed '2!d')"
}

set_ram() {
        _ram | sxmo_status.sh add 09-ram
}

_cpuusage() {
        printf "%s %s%%" "$icon_cpu" "$(printf "scale=2;%s/%s\n" "$(ps aux | awk 'BEGIN {sum=0} {sum+=$3}; END {print sum}')" "$(nproc --all)" | bc)"
}

set_cpuusage() {
        _cpuusage | sxmo_status.sh add 07-cpuusage
}

_linux() {
        printf '%s %s' "$icon_tux" "$(uname -r)"
}

set_linux() {
        _linux | sxmo_status.sh add 01-linux
}

case "$1" in
	network_wlan0)
		set_wifi
		;;
	time|call_duration|modem|modem_monitor|vpn|battery|volume|ram|cputemp|cpuusage|linux|locked)
		set_"$1"
		;;
	periodics|state_change) # 55 s loop and screenlock triggers
		set_time
		set_modem
		set_battery
                set_ram
                set_cputemp
                set_cpuusage
		;;
	all)
		sxmo_status.sh reset
		set_time
		set_call_duration
		set_modem
		set_modem_monitor
		set_wifi
		set_vpn
		set_battery
		set_volume
                set_ram
                set_cputemp
                set_cpuusage
                set_linux
		set_locked
		;;
	*)              
		exit # swallow it !
		;;
esac

