#!/bin/sh

NV_ITEM="50091"
NV_LEN="60"
MODE="1"

echo "=== Шаг 1: Перевод модема в debug mode ==="

switch_to_debug() {
	IFACE=""
	for i in $(ls /sys/class/net/ 2>/dev/null | 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 [ -z "$IFACE" ]; then
		echo "Ошибка: Сетевой интерфейс модема (cdc_ether/rndis_host) не найден."
		return 1
	fi

	MODEM_IP=$(ip route show dev "$IFACE" 2>/dev/null | awk '/default/ {print $3}')

	if [ -z "$MODEM_IP" ]; then
		echo "Ошибка: Не удалось определить IP адрес модема на интерфейсе $IFACE."
		return 1
	fi

	echo "Найден интерфейс: $IFACE, IP модема: $MODEM_IP"

	API_RESPONSE=$(curl -s --max-time 5 "http://$MODEM_IP/api/webserver/SesTokInfo")

	if [ -z "$API_RESPONSE" ]; then
		echo "Ошибка: Нет ответа от API модема http://$MODEM_IP."
		return 1
	fi

	SID=$(echo "$API_RESPONSE" | sed -n 's|.*<SesInfo>\(.*\)</SesInfo>.*|\1|p')
	TOK=$(echo "$API_RESPONSE" | sed -n 's|.*<TokInfo>\(.*\)</TokInfo>.*|\1|p')

	if [ -z "$SID" ] || [ -z "$TOK" ]; then
		echo "Ошибка: Не удалось получить Session ID или Token."
		return 1
	fi

	echo "Отправка запроса на переключение режима (mode=$MODE)..."
	RESULT=$(curl -s --max-time 10 "http://$MODEM_IP/api/device/mode" \
		-H "Cookie: $SID" \
		-H "__RequestVerificationToken: $TOK" \
		-H "Content-Type: application/x-www-form-urlencoded" \
		-d "<?xml version=\"1.0\" encoding=\"UTF-8\"?><request><mode>$MODE</mode></request>")

	case "$RESULT" in
		*'<response>OK</response>'*)
			echo "Модем успешно переведен в debug mode."
			return 0
			;;
		*'<error>'*)
			CODE=$(echo "$RESULT" | sed -n 's|.*<code>\(.*\)</code>.*|\1|p')
			echo "Ошибка API при переводе в debug: код $CODE"
			if [ "$CODE" = "100003" ]; then
				echo "Подсказка: Ошибка 100003 (отказано в доступе) бывает, если установлен пароль на web-интерфейс, модем еще не загрузился, или он УЖЕ находится в debug-режиме."
			fi
			return 1
			;;
		*)
			echo "Неизвестный ответ от модема: $RESULT"
			return 1
			;;
	esac
}

switch_to_debug
SWITCH_SUCCESS=$?
USE_ADB=0
ADB_DEV=""

if [ $SWITCH_SUCCESS -ne 0 ]; then
	echo "ВНИМАНИЕ: Не удалось перевести модем в debug mode."
	echo "Продолжаем скрипт автоматически. Шаг modem-reinit будет пропущен."
fi

if [ $SWITCH_SUCCESS -eq 0 ]; then
	echo ""
	echo "=== Шаг 2: Инициализация портов (modem-reinit) ==="
	if command -v modem-reinit >/dev/null 2>&1; then
		modem-reinit
	else
		echo "ВНИМАНИЕ: Команда modem-reinit не найдена. Возможно порты уже готовы."
	fi
	echo "Ожидаем появления портов ttyUSB (10 сек)..."
	sleep 10
fi

send_at() {
	port="$1"
	cmd="$2"
	if [ "$port" = "ADB" ]; then
		adb -s "$ADB_DEV" shell atc "$cmd" 2>/dev/null
	else
		sms_tool -d "$port" at "$cmd" 2>/dev/null
	fi
}

echo ""
echo "=== Шаг 3: Поиск AT-порта ==="
AT_PORT=""

if [ -n "$1" ] && [ -c "$1" ]; then
	AT_PORT="$1"
	echo "Используем указанный порт: $AT_PORT"
else
	for p in /dev/ttyUSB*; do
		if [ -c "$p" ]; then
			echo "Проверяем порт $p..."
			RESP=$(send_at "$p" "ATI")
			if echo "$RESP" | grep -q -i "Manufacturer"; then
				AT_PORT="$p"
				echo "Найден AT-порт: $AT_PORT"
				break
			fi
		fi
	done
fi

if [ -z "$AT_PORT" ] && command -v adb >/dev/null 2>&1 && [ -n "$MODEM_IP" ]; then
	echo "Обычные AT-порты не найдены. Пробуем подключиться через ADB ($MODEM_IP)..."
	adb connect "$MODEM_IP" >/dev/null 2>&1
	sleep 2
	ADB_DEV=$(adb devices | grep "$MODEM_IP" | grep -w "device" | awk '{print $1}' | head -n 1)
	if [ -n "$ADB_DEV" ]; then
		echo "Успешно подключились к модему через ADB: $ADB_DEV"
		USE_ADB=1
		AT_PORT="ADB"
	else
		echo "Не удалось подключиться через ADB."
	fi
fi

if [ -z "$AT_PORT" ]; then
	echo "ОШИБКА: Не удалось найти порт, отвечающий на AT команды."
	echo "Возможно модем не перешел в debug mode или порты заняты другим процессом."
	exit 1
fi

echo ""
echo "=== Шаг 4: Чтение текущей конфигурации ==="

echo "Отправляем команду: AT^NVRDEX=${NV_ITEM},0,${NV_LEN}"

MAX_RETRIES=10
RETRY_COUNT=0
RAW_DATA=""

while [ $RETRY_COUNT -lt $MAX_RETRIES ]; do
	RESPONSE=$(send_at "$AT_PORT" "AT^NVRDEX=${NV_ITEM},0,${NV_LEN}")
	RAW_DATA=$(echo "$RESPONSE" | grep -E "\^NVRD(EX)?:" | cut -d',' -f4-)
	
	if [ -n "$RAW_DATA" ]; then
		break
	fi
	
	RETRY_COUNT=$((RETRY_COUNT + 1))
	if [ $RETRY_COUNT -lt $MAX_RETRIES ]; then
		echo "Получен пустой ответ, попытка $RETRY_COUNT из $MAX_RETRIES. Повторяем через 2 секунды..."
		sleep 2
	fi
done

if [ -z "$RAW_DATA" ]; then
	echo "Не удалось прочитать данные после $MAX_RETRIES попыток."
	if [ "$AT_PORT" = "ADB" ]; then
		echo "Возможно команда adb shell atc отработала с ошибкой или интерфейс не отвечает."
	else
		echo "Возможно утилита sms_tool отработала с ошибкой или порт занят."
	fi
	echo "Полный ответ модема при последней попытке:"
	echo "$RESPONSE"
	exit 1
fi

echo "Текущее значение (RAW):"
echo "$RAW_DATA"

echo ""
echo "=== Шаг 5: Проверка и изменение конфигурации ==="

COMP_B1=$(echo "$RAW_DATA" | awk '{print $22}')
COMP_B2=$(echo "$RAW_DATA" | awk '{print $23}')
COMP_B3=$(echo "$RAW_DATA" | awk '{print $24}')
COMP_B4=$(echo "$RAW_DATA" | awk '{print $25}')

CURRENT_COMP="$COMP_B1 $COMP_B2 $COMP_B3 $COMP_B4"

if [ -z "$COMP_B4" ]; then
	echo "-> ВНИМАНИЕ: Не удалось прочитать 25 байт из ответа модема. Ответ слишком короткий."
	echo "Данные: $RAW_DATA"
	exit 1
fi

echo "-> Текущее значение композиции (байты 22-25): $CURRENT_COMP"

if [ "$COMP_B3" = "01" ] && [ "$COMP_B4" = "12" ]; then
	TARGET_COMP="$COMP_B1 $COMP_B2 00 00"
	printf "Порты уже ОТКРЫТЫ ($CURRENT_COMP). Хотите ЗАКРЫТЬ их, откатив на $TARGET_COMP? (y/n) "
	read -r ANSWER
	if [ "$ANSWER" != "y" ] && [ "$ANSWER" != "Y" ]; then
		echo "Отмена операции пользователем."
		exit 0
	fi
	NEW_DATA=$(echo "$RAW_DATA" | awk '{$24="00"; $25="00"; print}')
else
	TARGET_COMP="$COMP_B1 $COMP_B2 01 12"
	printf "Хотите изменить текущее значение ($CURRENT_COMP) на $TARGET_COMP для ОТКРЫТИЯ портов? (y/n) "
	read -r ANSWER
	if [ "$ANSWER" != "y" ] && [ "$ANSWER" != "Y" ]; then
		echo "Отмена операции пользователем."
		exit 0
	fi
	NEW_DATA=$(echo "$RAW_DATA" | awk '{$24="01"; $25="12"; print}')
fi

echo "Записываем новые данные (AT^NVWREX)..."
WRITE_RESP=$(send_at "$AT_PORT" "AT^NVWREX=${NV_ITEM},0,${NV_LEN},${NEW_DATA}")

if ! echo "$WRITE_RESP" | grep -q "ERROR"; then
	echo "УСПЕХ! Данные успешно записаны."
	echo "Перезагружаем модем (команда AT^RESET)..."
	send_at "$AT_PORT" "AT^RESET" >/dev/null 2>&1
	echo "Модем ушел в перезагрузку! Новые настройки скоро вступят в силу."
else
	echo "ОШИБКА записи. Ответ модема:"
	echo "$WRITE_RESP"
fi

echo ""
echo "=== Скрипт завершен ==="

