#!/bin/sh

IFS=$'\r\n\t'
PORT=/dev/ttyS1

exec 99<> $PORT

ANS=''

send(){
	echo -ne "$*\r\n" >&99
}

recv(){
	read -t "$1" ANS <&99
	return $?
}

recv_all(){
	ANS=''
	while read -t $1 LINE <&99; do
		echo "$LINE" | egrep -iq 'OK' && break
		ANS="$ANS$LINE"
		echo "$LINE" | egrep -iq 'ERROR' && break
	done
}

flush(){
	while recv 1; do
		:;
	done
}

show(){
        export FRAMEBUFFER=/dev/fb0
        yes | fbv -cker "/usr/share/kaspi/$1.png"
}

cmd(){
	send "$1"
	recv_all "$2"
}

echo -n 'Setting speed ...'
show connection_start
while :; do
	stty -F $PORT 115200 raw -echo
	send 'ATE0;+IPR=921600'
	flush
	stty -F $PORT 921600 raw -echo
	send 'ATE0;+IPR=921600;+IPR?'
	while recv 1 ; do
		echo "$ANS" | grep -q '921600' && break 2
	done
	echo -n '.'
done
echo ' done'
flush
cmd 'ATQ0 V1 E0 S0=0 &C1 &D2 +FCLASS=0' 1
flush
cmd 'AT+CPIN?' 10
echo "$ANS"
cmd 'AT+CIMI' 10
echo "IMSI detected: $ANS"

mcc=$(echo "$ANS" | egrep -o '^[0-9]{3}')
ANS=$(echo "$ANS" | sed 's;^...;;')
mnc=$(echo "$ANS" | egrep -o '^[0-9]{2}')
echo "MCC: $mcc MNC: $mnc"
apn="$(jq  -r --arg mcc "$mcc" --arg mnc "$mnc" '.[$mcc][$mnc]["a"]' /usr/share/kaspi/apns.json)"
user="$(jq -r --arg mcc "$mcc" --arg mnc "$mnc" '.[$mcc][$mnc]["u"]' /usr/share/kaspi/apns.json)"
pass="$(jq -r --arg mcc "$mcc" --arg mnc "$mnc" '.[$mcc][$mnc]["p"]' /usr/share/kaspi/apns.json)"
echo "APN found: $apn"
echo "USER found: $user"
echo "PASS found: $pass"

if [ -z "$apn" ]; then
    show connection_fail
    sleep 3
    reboot
    exit 1
fi

echo "AT+CGDCONT=1,\"IP\",\"$apn\"" > /etc/ppp/chatscripts/apn
cat > /etc/ppp/peers/mobile <<-EOF
ttyS1
921600
lock
nocrtscts
modem
passive
novj
defaultroute
noipdefault
usepeerdns
noauth
hide-password
persist
holdoff 10
maxfail 0
debug
noauth
nopcomp
novjccomp
nobsdcomp
nodeflate
noaccomp
ipcp-accept-local
ipcp-accept-remote
lcp-echo-failure 0
lcp-echo-interval 0
local

user "$user"
password "$pass"
connect "/usr/sbin/chat -v -t15 -f /etc/ppp/chatscripts/mobile.chat"
EOF
exec 99>&-

if pppd call mobile debug updetach ; then
    show connection_ok
else
    show connection_fail
    sleep 3
    reboot
    exit 1
fi

model=$(cat /etc/model)
version=$(cat /etc/version)

show update_start
if wget -q 'http://static.armax.ru/screens/manifest.json' -O /tmp/manifest ; then
	echo 'Manifest found, checking for updates'
	file="$(jq -r --arg model "$model" --arg version "$version" '.[$model]|map(select(.version > $version))|sort_by(.version)[0].file' /tmp/manifest)"
	md5="$(jq -r --arg model "$model" --arg version "$version" '.[$model]|map(select(.version > $version))|sort_by(.version)[0].md5' /tmp/manifest)"

	if [ "$file" != "null" ]; then
		echo "Found update file $file"
        show update_new
		wget -q "http://static.armax.ru/screens/$file" -O /tmp/update.tar.bz2
		if echo "$md5  /tmp/update.tar.bz2" | md5sum -c ; then
            show update_process
			bzcat /tmp/update.tar.bz2 | tar x -C / && rm -f /tmp/update.tar.bz2 && reboot
		fi
    else
        show update_fresh
	fi
else
    show connection_fail
    sleep 3
    reboot
    exit 1
fi

exec /usr/bin/kaspi
