#!/bin/sh

USB=$1

rm -rf /tmp/luci-*
AUTOMODEM="$(uci -q get modeminfo.@general[0].automodem)"; [ -z "$AUTOMODEM" ] || [ "$AUTOMODEM" = "0" ] && exit 0

[ -f /etc/hotplug.d/tty/25-modemmanager-tty ] && rm /etc/hotplug.d/tty/25-modemmanager-tty
[ -f /usr/share/luci/menu.d/luci-proto-modemmanager.json ] && rm /usr/share/luci/menu.d/luci-proto-modemmanager.json

echo "automodem: starting modem configuration" > /dev/kmsg

current_automodem() {
	AUTOMODEM_MODEM=$(uci -q get automodem.main.modem)
	AUTOMODEM_APN=$(uci -q get automodem.main.apn)
}


current_hw() {
	CHECKMODEL="/usr/share/automodem/checkmodel"
	. "$CHECKMODEL" "$USB"
}


current_config() {
	# MODEMMANAGER - QMI MBIM
	if [ "$HILINK" -eq 0 ] && [ "$NCM" -eq 0 ] && [ "$XMM" -eq 0 ] && [ "$MBIM" -eq 0 ]; then
		command -v mmcli >/dev/null 2>&1 || exit 1
		while [ -z "$DRIVERS" ]; do
			DRIVERS=$(mmcli -m any -J 2>/dev/null | jsonfilter -e '@.modem.generic.drivers' 2>/dev/null)
			sleep 1
		done
		echo "$DRIVERS" | grep -Eq 'qmi|mbim' || exit 1
		while [ -z "$MODEM_PATH" ]; do
			MODEM_PATH=$(mmcli -m any -J 2>/dev/null | jsonfilter -e '@.modem.generic.device' 2>/dev/null)
			sleep 1
		done
		local i=0
		while [ -z "$OPERATORID" ] && [ "$i" -lt 30 ]; do
			OPERATORID=$(mmcli -i any -J 2>/dev/null | jsonfilter -e '@.sim["properties"]["operator-code"]' 2>/dev/null)
			[ -n "$OPERATORID" ] && break
			i=$((i + 1))
			sleep 1
		done
	# HILINK
	elif [ "$HILINK" -eq 1 ]; then
		CHECKIFACE="/usr/share/automodem/checkiface"
		. "$CHECKIFACE"
		MODEM_PATH=$IFACE
	# NCM or MBIM Generic
	elif [ "$NCM" -eq 1 ] || [ "$MBIM" -eq 1 ]; then
		for i in $(seq 20); do
			MODEM_PATH=$(ls /dev/cdc-wdm* 2>/dev/null) && break
			sleep 1
		done
	# XMM
	elif [ "$XMM" -eq 1 ]; then
		MODEM_PATH=$ATC_PORT
	fi
	CURRENT_ATPORT=$(uci -q get atinout.general.atc_port)
	CURRENT_SMSPORT=$(uci -q get smstools3.@sms[0].device)
	CURRENT_MCONFDEVICE=$(uci -q get mmconfig.@modem[0].device0)
}


set_modem_path() {
	uci set network.modem.device="$MODEM_PATH"
}


set_apn() {
	[ -n "$APN" ] && uci set network.modem.apn="$APN"
}


set_modem() {
	uci set network.modem=interface
	# HILINK
	if [ "$HILINK" -eq 1 ]; then
		uci set network.modem.proto='dhcp'
	# MBIM Generic
	elif [ "$MBIM" -eq 1 ]; then
		uci set network.modem.proto='mbim'
		check_apn
		uci set network.modem.pdptype='ipv4'
	# NCM
	elif [ "$NCM" -eq 1 ]; then
		uci set network.modem.proto='ncm'
		check_apn
		uci set network.modem.pdptype='IP'
	# XMM
	elif [ "$XMM" -eq 1 ]; then
		uci set network.modem.proto='xmm'
		check_apn
		uci set network.modem.pdp='ip'
	# QMI MBIM
	else
		uci set network.modem.proto='modemmanager'
		check_apn
		uci set network.modem.iptype='ipv4'
	fi
	set_modem_path
	apply_conf
}


check_path() {
	CURRENT_DEVICE=$(uci -q get network.modem.device)
	if [ "$CURRENT_DEVICE" != "$MODEM_PATH" ]; then
		set_modem_path
	fi
}


set_modem_firewall_zone() {
	local S=$(uci show firewall | awk -F'[@[]|[]]' '$0 ~ /zone/ && $0 ~ /name/ && $0 ~ /wan/ {print $3}')
	if ! uci get firewall.@zone[$S].network | grep -q modem; then
		uci add_list firewall.@zone[$S].network='modem'
		uci commit firewall
		reload_config
		service firewall restart
	fi
}


check_apn() {
	CHECKAPN="/usr/share/automodem/checkapn"
	. "$CHECKAPN" "$OPERATORID"
	set_apn
}


apply_conf() {
	uci commit
	reload_config
}


set_modemconfig() {
	uci set mmconfig.@modem[0]=modem
	uci set mmconfig.@modem[0].device0="$MODEM_PATH"
	uci set mmconfig.@modem[0].network0='allowed: 3g, 4g; preferred: 4g'
	uci commit mmconfig
}


set_atinout() {
	uci set atinout.general=atinout
	uci set atinout.general.atc_port="$ATC_PORT"
	uci commit atinout
	if [ "$AUTOMODEM_MODEM" != "$MODEMMODEL" ]; then
		printf "%s\n" "$ATCOMMANDS" > /etc/atcommands.user
	fi
}


set_modeminfo() {
	uci set modeminfo.@general[0]=general
	uci set modeminfo.@general[0].automodem='1'
	uci set modeminfo.@modeminfo[0]=modeminfo
	if echo "${DRIVERS:-}" | grep -Eq 'mbim' && ! echo "$MODEMMODEL" | grep -qE '^t[0-9]{2}w[0-9]{3}$'; then
		uci set modeminfo.@modeminfo[0].device="$ATC_PORT"
		uci set modeminfo.@modeminfo[0].mmcli_name='1'
		uci del modeminfo.@modeminfo[0].device_qmi >/dev/null 2>&1
		uci del modeminfo.@modeminfo[0].qmi_mode >/dev/null 2>&1
		uci del modeminfo.@modeminfo[0].qmi_proxy >/dev/null 2>&1
	elif [ "$HILINK" -eq 0 ] && [ "$NCM" -eq 0 ] && [ "$XMM" -eq 0 ] && [ "$MBIM" -eq 0 ] && [ "$MDM" -eq 0 ]; then
		uci del modeminfo.@modeminfo[0].device >/dev/null 2>&1
		uci del modeminfo.@modeminfo[0].mmcli_name >/dev/null 2>&1
		uci set modeminfo.@modeminfo[0].device_qmi='/dev/cdc-wdm0'
		uci set modeminfo.@modeminfo[0].qmi_mode='1'
		uci set modeminfo.@modeminfo[0].qmi_proxy='1'
	else
		uci set modeminfo.@modeminfo[0].device="$ATC_PORT"
		uci del modeminfo.@modeminfo[0].device_qmi >/dev/null 2>&1
		uci del modeminfo.@modeminfo[0].qmi_mode >/dev/null 2>&1
		uci del modeminfo.@modeminfo[0].qmi_proxy >/dev/null 2>&1
		uci del modeminfo.@modeminfo[0].mmcli_name >/dev/null 2>&1
	fi
	uci commit modeminfo
}


set_smstools3() {
	uci set smstools3.@sms[0].device="$SMS_PORT"
	uci set smstools3.@sms[0].storage='persistent'
	uci set smstools3.@sms[0].decode_utf='1'
	uci set smstools3.@sms[0].loglevel='1'
	uci set smstools3.@sms[0].net_check='0'
	uci del smstools3.@sms[0].init >/dev/null 2>&1
	if [ "$SMSINIT" != "NAN" ]; then
		uci set smstools3.@sms[0].init="$SMSINIT"
	fi
	uci commit smstools3
	service luci-sms restart
}


current_automodem
current_hw
echo "automodem: usb ${USB}; model ${MODEMMODEL}" > /dev/kmsg
current_config
set_modem
set_modem_firewall_zone
set_modeminfo
[ "$HILINK" -eq 0 ] && [ "$CURRENT_MCONFDEVICE" != "$MODEM_PATH" ] && set_modemconfig
[ "$CURRENT_ATPORT" != "$ATC_PORT" ] && set_atinout
[ "$CURRENT_SMSPORT" != "$SMS_PORT" ] && set_smstools3
[ "$MBIM" -eq 1 ] && ( while ! ifstatus modem | grep -q '"up": true'; do sleep 1; done; ifup modem ) &
rm -rf /tmp/luci-*
echo "automodem: ${MODEMMODEL} modem setup complete" > /dev/kmsg
