# (c) 2010-2016 Cezary Jackiewicz <cezary@eko.one.pl>
# (c) 2020-2024 modified by Konstantine Shevlyakov  <shevlakov@132lan.ru>
# (c) 2021 modified by Vladislav Kadulin  <spanky@yandex.ru>


RES="/usr/share/modeminfo"
#GSCRIPT="$RES/scripts/${FAMILY}.txt"

function get_device_info() {
	DEVPORT=$(uci -q get modeminfo.@modeminfo[${s}].device)
	case "$DEVPORT" in
		*tty*) ;;
		*) get_port ;;
	esac
	modem_family
	GSCRIPT="$RES/scripts/${FAMILY}.at"
	# O=$(atcf $GSCRIPT $DEVPORT | awk 'NF > 0')
	. atcf $GSCRIPT $DEVPORT
}

function get_port() {
	devices="$(ls /dev/ttyUSB* /dev/ttyACM* /dev/ttyHS* 2>/dev/null | sort -r)"
		for d in $devices; do
			DEVPORT=$d gcom -s $RES/scripts/probeport.gcom > /dev/null 2>&1
			if [ $? = 0 ]; then
				uci set modeminfo.@modeminfo[${s}].device="$d"
				uci commit modeminfo
				break
			fi
		done
	DEVPORT=$(uci -q get modeminfo.@modeminfo[${s}].device)
	# O=$(atcf $GSCRIPT $DEVPORT | awk 'NF > 0')
	. atcf $GSCRIPT $DEVPORT
}

function get_vidpid_modemcurl() {
	IFACE=""
	for i in $(ls /sys/class/net/ | grep -E '^(eth|usb)[0-9]+$'); do
		driver_path=$(readlink -f "/sys/class/net/$i/device/driver" 2>/dev/null)
		if echo "$driver_path" | grep -qE 'cdc_ether|rndis_host'; then
			IFACE="$i"
			break
		fi
	done

	if [ -n "$IFACE" ]; then
		DEVPATH=$(readlink -f /sys/class/net/$IFACE/device 2>/dev/null)
		while [ "$DEVPATH" != "/" ]; do
			if [ -f "$DEVPATH/idVendor" ] && [ -f "$DEVPATH/idProduct" ]; then
				VID=$(cat "$DEVPATH/idVendor")
				PID=$(cat "$DEVPATH/idProduct")
				break
			fi
			DEVPATH=$(dirname "$DEVPATH")
		done
	fi
}

function modem_family() {
	comport=$(uci -q get modeminfo.@modeminfo[${s}].device | awk -F [\/] '{print $NF}')
	case $comport in
		*ttyUSB*|*ttyHS*)
			VID_PATH="/sys/class/tty/$comport/device/../../idVendor"
			PID_PATH="/sys/class/tty/$comport/device/../../idProduct"
			if [ -f "$VID_PATH" ] && [ -f "$PID_PATH" ]; then
				VID=$(cat "$VID_PATH")
				PID=$(cat "$PID_PATH")
			else
				get_vidpid_modemcurl
			fi
		;;
		*ttyACM*)
			VID_PATH=$(readlink -f /sys/class/tty/$comport/device/../idVendor 2>/dev/null)
			PID_PATH=$(readlink -f /sys/class/tty/$comport/device/../idProduct 2>/dev/null)
			if [ -f "$VID_PATH" ] && [ -f "$PID_PATH" ]; then
				VID=$(cat "$VID_PATH")
				PID=$(cat "$PID_PATH")
			fi
		;;
		*) return 0 ;;
	esac
	VIDPID=${VID}${PID}
	FAMILY=$(awk -F [\;] '/'$VIDPID'/{print toupper($2)}' $RES/modem.list)
	if [ ! $FAMILY ]; then
		FAMILY=GENERIC
	fi
}

# get CSQ
function get_csq(){
	CSQ=$(echo "$O" | awk -F[,\ ] '/^\+CSQ/ {print $2}')
	[ "x$CSQ" = "x" ] && CSQ=-1
	if [ $CSQ -ge 0 -a $CSQ -le 31 ]; then
		CSQ_PER=$(($CSQ * 100/31))
		CSQ_COL="red"
		[ $CSQ -ge 10 ] && CSQ_COL="red"
		[ $CSQ -ge 15 ] && CSQ_COL="orange"
		[ $CSQ -ge 20 ] && CSQ_COL="green"
		CSQ_RSSI=$((2 * CSQ - 113))
	else 
		CSQ_PER="0"
		CSQ_COL="black"
	fi
}

# Get COPS
function get_cops() {
	COPS=$(echo "$O" | awk -F[\"] '/^\+COPS:\s?.,0/ {print $2}' | awk '{for(i=NF;i>=1;i--){w=tolower($i);if(!s[w]++)r=r?$i" "r:$i} print r}')
}

# Get Number
function get_number() {
	NUMBER=$(echo "$O" | grep 'CNUM' | sed -n 's/.*"[[:space:]]*\([+78][0-9]\{9,\}\)".*/\1/p' | sed -E 's/^(\+7|7|8)([0-9]{3})([0-9]{3})([0-9]{2})([0-9]{2})$/+7 (\2) \3-\4-\5/')
}

# Get Registration data
function get_reg_data(){
	for CREG in "+CREG" "+CGREG" "+CEREG"; do
		REGST=$(echo "$O" | awk -F[,] '/\'$CREG'/ {print $2}')
		if [ "$REGST" ]; then
			break
		fi
	done
}

function generic_data(){
	TECH=$(echo "$O" | awk -F[,] '/^\+COPS/ {print $4}')
	case "$TECH" in
		2*) MODE="UMTS";;
		0*|3*) MODE="EDGE";;
		4*) MODE="HSDPA";;
		5*) MODE="HSUPA";;
		6*) MODE="HSPA";;
		7*|10*|13*) MODE="LTE";;
		# 10*|13*) MODE="LTE+NR";;
		11*|12*) MODE="5GNR";;
		 *) MODE="--";;
	esac
}

# name device via mmcli utility
mmcli_name(){
	MMCLI=$(uci -q get modeminfo.@modeminfo[${s}].mmcli_name)
	if [ "$MMCLI" = "1" ]; then
		if [ -x /usr/bin/mmcli ]; then
			MODEM=$(mmcli -L | awk '{print $1}' | awk -F [/] '{print $NF}')
			for mm in $MODEM; do
				MMCLIMEI=$(mmcli -m $mm -J | jsonfilter -e '@["modem"].*["imei"]')
				IMEI=$(echo $IMEI | tr -d ' ')
				if [ "$IMEI" = "$MMCLIMEI" ]; then
					MANUF=$(mmcli -m $mm -J | jsonfilter -e '@["modem"].*["manufacturer"]' | awk '{gsub("\r", ""); print $0}')
					MODEL=$(mmcli -m $mm -J | jsonfilter -e '@["modem"].*["model"]' | awk '{gsub("\r", ""); print $0}')
					FW=$(jsonfilter -s "$(mmcli -m $mm -J)" -e "$['modem']['generic']['revision']" | tr '\n' ' ' | sed 's/  / /g')
					if [ -n "$(echo "$MODEL" | grep "${MANUF}")" ]; then
						DEVICE="$MODEL"
					else
						DEVICE="$MANUF $MODEL"
					fi
				fi
			done
			NUMBER=$(jsonfilter -s "$(mmcli -m $mm -J)" -e "$['modem']['generic']['own-numbers']" | tr -d '["] ' | sed -E 's/^(\+7|7|8)([0-9]{3})([0-9]{3})([0-9]{2})([0-9]{2})$/+7 (\2) \3-\4-\5/')
		fi
	fi
}


function get_data_in(){
	modem_family
	get_reg_data
	get_cops
	get_number
	get_csq
	if [ -f "$RES/scripts/${FAMILY}" ]; then
		. $RES/scripts/$FAMILY
		modem_data
	else
		generic_data
	fi
	mmcli_name
}
