#!/bin/sh

. /lib/functions.sh

cfg="default"
wizard_mesh=$(uci -q get wizard.default.mesh_enabled)

BOARD_NAME=$(ubus call system board | jsonfilter -e '@.board_name')
case "$BOARD_NAME" in
	routerich,be7200)
		PHY="phy0."
		;;
	*)
		PHY="phy"
		;;
esac

checklink_wan() {
	if [ "$(ifstatus wan | jsonfilter -e '@.up')" = "true" ]; then
		return 0
	else
		return 1
	fi
}

check_internet() {
	command -v curl >/dev/null 2>&1 || {
		logger -t mesh-button -p daemon.err "Unable to check internet..."
		exit 0
	}
	local status
	status=$(curl -o /dev/null -4 -s -w "%{http_code}" https://ya.ru/favicon.ico)
	if [ "$status" = "200" ] || [ "$status" = "204" ]; then
		return 0
	else
		return 1
	fi
}

check_auto_channel() {
	for radio in $(uci show wireless | awk -F'[.=]' '/=wifi-device/ {print $2}'); do
		local band channel

		band="$(uci -q get wireless."$radio".band)"
		channel="$(uci -q get wireless."$radio".channel)"

		if [ "$band" = "2g" ]; then
			[ "$channel" = "auto" ] && channel=6
			uci -q set wireless.${radio}.channel="$channel"
		elif [ "$band" = "5g" ]; then
			[ "$channel" = "auto" ] && channel=36
			uci -q set wireless.${radio}.channel="$channel"
		fi
	done
	uci commit wireless
}

setup_rrtmc0() {
	local action="$1"
	local role="$2"
	local section=""
	local band=""
	local name=""
	local RADIO=""

	for section in $(uci show wireless | awk -F'[.=]' '/=wifi-device/ {print $2}'); do
		band="$(uci -q get wireless.$section.band)"
		if [ "$band" = "2g" ]; then
			RADIO="$section"
			break
		fi
	done

	if [ -z "$RADIO" ]; then
		logger -t mesh-button -p daemon.err "Radio interface not found!"
		exit 0
	fi

	if [ "$action" = "add" ]; then
		uci add network device >/dev/null 2>&1
		uci -q set network.@device[-1].type='bridge'
		uci -q set network.@device[-1].name='rrtmc0'
		uci -q set network.@device[-1].bridge_empty='1'

		if [ "$role" = "controller" ]; then
			uci -q set network.rrtmc0=interface
			uci -q set network.rrtmc0.proto='static'
			uci -q set network.rrtmc0.device='rrtmc0'
			uci -q set network.rrtmc0.ipaddr='192.168.234.1'
			uci -q set network.rrtmc0.netmask='255.255.255.0'
			uci -q set dhcp.rrtmc0=dhcp
			uci -q set dhcp.rrtmc0.interface='rrtmc0'
			uci -q set dhcp.rrtmc0.start='100'
			uci -q set dhcp.rrtmc0.limit='150'
			uci -q set dhcp.rrtmc0.leasetime='12h'
		else
			uci -q set network.rrtmc0=interface
			uci -q set network.rrtmc0.proto='dhcp'
			uci -q set wireless.${RADIO}.channel='auto'
		fi

		uci add firewall zone >/dev/null 2>&1
		uci -q set firewall.@zone[-1].name='rrtmc0'
		uci -q set firewall.@zone[-1].input='ACCEPT'
		uci -q set firewall.@zone[-1].output='ACCEPT'
		uci -q set firewall.@zone[-1].forward='REJECT'
		uci -q set firewall.@zone[-1].masq='1'
		uci add_list firewall.@zone[-1].network='rrtmc0'

		uci -q set wireless.rrtmc0=wifi-iface
		uci -q set wireless.rrtmc0.device="$RADIO"
		uci -q set wireless.rrtmc0.mode='mesh'
		uci -q set wireless.rrtmc0.network='rrtmc0'
		uci -q set wireless.rrtmc0.mesh_id='rrtmc0'
		uci -q set wireless.rrtmc0.encryption='sae'
		uci -q set wireless.rrtmc0.key='12345678'
		uci -q set wireless.rrtmc0.mesh_rssi_threshold='0'
		uci -q set wireless.rrtmc0.mesh_fwding='1'
		uci -q set wireless.rrtmc0.bss_transition='1'
		uci -q set wireless.rrtmc0.proxy_arp='1'

		uci commit network
		uci commit dhcp
		uci commit firewall
		uci commit wireless
		reload_config
		sleep 10

	elif [ "$action" = "del" ]; then
		for section in $(uci show network | awk -F'[.=]' '/=device/ {print $2}'); do
			name="$(uci -q get network.$section.name)"
			if [ "$name" = "rrtmc0" ]; then
				uci -q del network.$section
				break
			fi
		done
		uci -q del network.rrtmc0
		uci -q del dhcp.rrtmc0

		for section in $(uci show firewall | awk -F'[.=]' '/=zone/ {print $2}'); do
			name="$(uci -q get firewall.$section.name)"
			if [ "$name" = "rrtmc0" ]; then
				uci -q del firewall.$section
				break
			fi
		done
		uci -q del wireless.rrtmc0

		uci commit network
		uci commit dhcp
		uci commit firewall
		uci commit wireless
		reload_config
		sleep 5
	else
		return 1
	fi
}

manage_mesh_json() {
	local json_file="/www/mesh.json"
	local ack_flag="/tmp/mesh_ack_received"
	local ack_script="/www/cgi-bin/mesh_ack.sh"

	local unify_ssid wifi_ssid wifi_ssid2 wifi_ssid5
	local wifi_key wifi_key2 wifi_key5
	local mesh_band mesh_id mesh_key mesh_controladdr
	local wifi_enc_key wifi_enc_key2 wifi_enc_key5
	local country_radio2g country_radio5g
	local channel_radio2g channel_radio5g

	config_load wizard
	config_get unify_ssid "$cfg" unify_ssid
	config_get wifi_ssid "$cfg" wifi_ssid
	config_get wifi_key "$cfg" wifi_key
	config_get wifi_ssid2 "$cfg" wifi_ssid2
	config_get wifi_key2 "$cfg" wifi_key2
	config_get wifi_ssid5 "$cfg" wifi_ssid5
	config_get wifi_key5 "$cfg" wifi_key5
	config_get mesh_band "$cfg" mesh_band
	config_get mesh_id "$cfg" mesh_id
	config_get mesh_key "$cfg" mesh_key
	config_get mesh_controladdr "$cfg" mesh_controladdr
	config_get wifi_enc_key "$cfg" wifi_enc_key
	config_get wifi_enc_key2 "$cfg" wifi_enc_key2
	config_get wifi_enc_key5 "$cfg" wifi_enc_key5
	config_get country_radio2g "$cfg" country_radio2g
	config_get country_radio5g "$cfg" country_radio5g
	config_get channel_radio2g "$cfg" channel_radio2g
	config_get channel_radio5g "$cfg" channel_radio5g

	cat <<EOF > "$json_file"
{
  "unify_ssid": "$unify_ssid",
  "wifi_ssid": "$wifi_ssid",
  "wifi_key": "$wifi_key",
  "wifi_ssid2": "$wifi_ssid2",
  "wifi_key2": "$wifi_key2",
  "wifi_ssid5": "$wifi_ssid5",
  "wifi_key5": "$wifi_key5",
  "mesh_band": "$mesh_band",
  "mesh_id": "$mesh_id",
  "mesh_key": "$mesh_key",
  "mesh_controladdr": "$mesh_controladdr",
  "wifi_enc_key": "$wifi_enc_key",
  "wifi_enc_key2": "$wifi_enc_key2",
  "wifi_enc_key5": "$wifi_enc_key5",
  "country_radio2g": "$country_radio2g",
  "country_radio5g": "$country_radio5g",
  "channel_radio2g": "$channel_radio2g",
  "channel_radio5g": "$channel_radio5g"
}
EOF

	cat <<'EOF' > "$ack_script"
#!/bin/sh
touch /tmp/mesh_ack_received
echo "OK"
EOF
	chmod +x "$ack_script"
	rm -f "$ack_flag"

	logger -t mesh-button -p daemon.info "Waiting for download confirmation (max 120 seconds)..."
	local i=0
	while [ ! -f "$ack_flag" ]; do
		sleep 1
		i=$((i + 1))
		if [ "$i" -ge 120 ]; then
			logger -t mesh-button -p daemon.err "Timeout waiting for ack from satellite router"
			break
		fi
	done

	if [ -f "$ack_flag" ]; then
		logger -t mesh-button -p daemon.info "Confirmation received, continue..."
	fi

	rm -f "$json_file" "$ack_flag" "$ack_script"
}

download_mesh_json() {
	local url="http://192.168.234.1/mesh.json"
	local output="/tmp/mesh.json"
	local ack_url="http://192.168.234.1/cgi-bin/mesh_ack.sh"
	local timeout=120
	local i=0

	logger -t mesh-button -p daemon.info "Attempting to download mesh settings (max $timeout seconds)..."

	while [ "$i" -lt "$timeout" ]; do
		if curl -fs "$url" -o "$output"; then
			logger -t mesh-button -p daemon.info "Successfully downloaded mesh settings"
			logger -t mesh-button -p daemon.info "Sending ACK"
			curl -s "$ack_url" > /dev/null 2>&1
			return 0
		fi
		sleep 1
		i=$((i + 1))
	done

	logger -t mesh-button -p daemon.err "Failed to download mesh settings after $timeout seconds"
	return 1
}

syncwizard() {
	local CURRENT_SSID CURRENT_SSID2 CURRENT_SSID5

	config_load wizard
	config_get CURRENT_SSID "$cfg" wifi_ssid
	config_get CURRENT_SSID2 "$cfg" wifi_ssid2
	config_get CURRENT_SSID5 "$cfg" wifi_ssid5

	[ "$(uci -q get wireless.@wifi-iface[0].ssid)" = "$(uci -q get wireless.@wifi-iface[1].ssid)" ] && UNIFY_SSID=1 || UNIFY_SSID=0
	if [ "$UNIFY_SSID" = "1" ]; then
		SSID=$(uci -q get wireless.@wifi-iface[0].ssid)
		KEY=$(uci -q get wireless.@wifi-iface[0].key)
		ENCKEY=$(uci -q get wireless.@wifi-iface[0].encryption)
	else
		SSID2=$(uci -q get wireless.@wifi-iface[0].ssid)
		KEY2=$(uci -q get wireless.@wifi-iface[0].key)
		ENCKEY2=$(uci -q get wireless.@wifi-iface[0].encryption)
		SSID5=$(uci -q get wireless.@wifi-iface[1].ssid)
		KEY5=$(uci -q get wireless.@wifi-iface[1].key)
		ENCKEY5=$(uci -q get wireless.@wifi-iface[1].encryption)
	fi

	if [ "$UNIFY_SSID" = "1" ]; then
		if [ "$CURRENT_SSID" != "$SSID" ]; then
			uci -q set wizard.default.wifi_ssid="$SSID"
			uci -q set wizard.default.wifi_key="$KEY"
			uci -q set wizard.default.wifi_enc_key="$ENCKEY"
			uci -q set wizard.default.unify_ssid="1"
			uci -q del wizard.default.wifi_ssid2
			uci -q del wizard.default.wifi_key2
			uci -q del wizard.default.wifi_enc_key2
			uci -q del wizard.default.wifi_ssid5
			uci -q del wizard.default.wifi_key5
			uci -q del wizard.default.wifi_enc_key5
		else
			uci -q del wizard.default.wifi_enc_key2
			uci -q del wizard.default.wifi_enc_key5
			uci -q set wizard.default.wifi_enc_key="$ENCKEY"
		fi
	else
		if [ "$CURRENT_SSID2" != "$SSID2" ] || [ "$CURRENT_SSID5" != "$SSID5" ]; then
			uci -q set wizard.default.unify_ssid="0"
			uci -q del wizard.default.wifi_ssid
			uci -q del wizard.default.wifi_key
			uci -q del wizard.default.wifi_enc_key
			test -n "$SSID2" && uci -q set wizard.default.wifi_ssid2="$SSID2"
			test -n "$KEY2" && uci -q set wizard.default.wifi_key2="$KEY2"
			test -n "$ENCKEY2" && uci -q set wizard.default.wifi_enc_key2="$ENCKEY2"
			test -n "$SSID5" && uci -q set wizard.default.wifi_ssid5="$SSID5"
			test -n "$KEY5" && uci -q set wizard.default.wifi_key5="$KEY5"
			test -n "$ENCKEY5" && uci -q set wizard.default.wifi_enc_key5="$ENCKEY5"
		else
			uci -q del wizard.default.wifi_enc_key
			test -n "$ENCKEY2" && uci -q set wizard.default.wifi_enc_key2="$ENCKEY2"
			test -n "$ENCKEY5" && uci -q set wizard.default.wifi_enc_key5="$ENCKEY5"
		fi
	fi

	for radio in $(uci show wireless | awk -F'[.=]' '/=wifi-device/ {print $2}'); do
		band=$(uci -q get wireless."$radio".band)
		country=$(uci -q get wireless."$radio".country)
		channel=$(uci -q get wireless."$radio".channel)
		if [ "$band" = "2g" ]; then
			uci -q set wizard.default.country_radio2g="${country:-""}"
			uci -q set wizard.default.channel_radio2g="${channel}"
		elif [ "$band" = "5g" ]; then
			uci -q set wizard.default.country_radio5g="${country:-""}"
			uci -q set wizard.default.channel_radio5g="${channel}"
		fi
	done

	uci commit wizard
	now=$(date +%s)
	old=$((now - 120))
	touch_time=$(date -u -d "@$old" +"%Y%m%d%H%M.%S")
	touch -t "$touch_time" /etc/config/wizard
}

update_wizard() {
	local mesh_mode="$1"

	if [ "$mesh_mode" = "controller" ]; then

		local unify_ssid wifi_ssid wifi_ssid2 wifi_ssid5
		local wifi_key wifi_key2 wifi_key5

		config_load wizard
		config_get unify_ssid "$cfg" unify_ssid
		config_get wifi_ssid "$cfg" wifi_ssid
		config_get wifi_key "$cfg" wifi_key
		config_get wifi_ssid2 "$cfg" wifi_ssid2
		config_get wifi_key2 "$cfg" wifi_key2
		config_get wifi_ssid5 "$cfg" wifi_ssid5
		config_get wifi_key5 "$cfg" wifi_key5

		if { [ "$unify_ssid" = "1" ] && [ -z "$wifi_key" ]; } || \
		{ [ "$unify_ssid" != "1" ] && [ -z "$wifi_key2" ]; }; then
			logger -t mesh-button -p daemon.err "Required Wi-Fi key is not defined!"
			exit 0
		fi

		local base_ssid
		local key
		if [ "$unify_ssid" = "0" ]; then
			base_ssid="$wifi_ssid2"
			key="$wifi_key2"
		else
			base_ssid="$wifi_ssid"
			key="$wifi_key"
		fi

		mesh_id="${base_ssid}-Mesh"
		logger -t mesh-button -p daemon.info "Generated mesh_id: $mesh_id"
		mesh_controladdr=$(cat /sys/class/net/br-lan/address 2>/dev/null)
		uci -q set wizard.default.wizard_complete='1'
		uci -q set wizard.default.mesh_enabled='1'
		uci -q set wizard.default.mesh_mode='controller'
		uci -q set wizard.default.mesh_controladdr="$mesh_controladdr"
		uci -q set wizard.default.mesh_band='5'
		uci -q set wizard.default.mesh_id="$mesh_id"
		uci -q set wizard.default.mesh_key="$key"
		uci commit wizard
		now=$(date +%s)
		old=$((now - 120))
		touch_time=$(date -u -d "@$old" +"%Y%m%d%H%M.%S")
		touch -t "$touch_time" /etc/config/wizard
		return 0
	elif [ "$mesh_mode" != "point" ]; then
		logger -t mesh-button -p daemon.err "Unknown mesh mode: $mesh_mode"
		exit 0
	fi

	local json_file="/tmp/mesh.json"
	if [ ! -f "$json_file" ]; then
		logger -t mesh-button -p daemon.err "Mesh settings not found!"
		exit 0
	fi

	local val

	update_var() {
		local var_name=$1
		val=$(jq -r --arg v "$var_name" '.[$v] // empty' "$json_file")
		if [ -z "$val" ]; then
			uci -q del wizard.default."$var_name"
		else
			uci -q set wizard.default."$var_name"="$val"
		fi
	}

	update_var unify_ssid
	update_var wifi_ssid
	update_var wifi_key
	update_var wifi_enc_key
	update_var wifi_ssid2
	update_var wifi_key2
	update_var wifi_enc_key2
	update_var wifi_ssid5
	update_var wifi_key5
	update_var wifi_enc_key5
	update_var country_radio2g
	update_var country_radio5g
	update_var channel_radio2g
	update_var channel_radio5g
	update_var mesh_band
	update_var mesh_id
	update_var mesh_key
	update_var mesh_controladdr

	uci -q set wizard.default.wizard_complete='1'
	uci -q set wizard.default.mesh_enabled='1'
	uci -q set wizard.default.mesh_mode='point'

	uci commit wizard
	now=$(date +%s)
	old=$((now - 120))
	touch_time=$(date -u -d "@$old" +"%Y%m%d%H%M.%S")
	touch -t "$touch_time" /etc/config/wizard
	rm -f "$json_file"
	logger -t mesh-button -p daemon.info "mesh settings processed"
	return 0
}

wifi_setup() {
	local mesh_enabled wifi_ssid wifi_ssid2 wifi_ssid5
	local unify_ssid wifi_key wifi_key2 wifi_key5
	local wifi_enc_key wifi_enc_key2 wifi_enc_key5

	config_load wizard
	config_get unify_ssid "$cfg" unify_ssid
	config_get mesh_enabled "$cfg" mesh_enabled
	config_get wifi_ssid "$cfg" wifi_ssid
	config_get wifi_ssid2 "$cfg" wifi_ssid2
	config_get wifi_ssid5 "$cfg" wifi_ssid5
	config_get wifi_key "$cfg" wifi_key
	config_get wifi_enc_key "$cfg" wifi_enc_key
	config_get wifi_key2 "$cfg" wifi_key2
	config_get wifi_enc_key2 "$cfg" wifi_enc_key2
	config_get wifi_key5 "$cfg" wifi_key5
	config_get wifi_enc_key5 "$cfg" wifi_enc_key5
	config_get country_radio2g "$cfg" country_radio2g
	config_get country_radio5g "$cfg" country_radio5g
	config_get channel_radio2g "$cfg" channel_radio2g
	config_get channel_radio5g "$cfg" channel_radio5g

	if [ -n "$wifi_ssid" ] || [ -n "$wifi_ssid2" ] || [ -n "$wifi_ssid5" ]; then
		for idx in `seq 0 64`; do
			uci -q get wireless.@wifi-iface[$idx] || break
			[ "$(uci -q get wireless.@wifi-iface[$idx].mode)" = "ap" ] && {
				local radio="$(uci -q get wireless.@wifi-iface[$idx].device)"
				local band="$(uci -q get wireless.${radio}.band | sed s/g//)"
				uci -q del wireless.${radio}.disabled
				uci -q set wireless.${radio}.cell_density='0'
				if [ "$band" = "2" ]; then
					uci -q set wireless.${radio}.channel="$channel_radio2g"
					if [ -n "$country_radio2g" ]; then
						uci -q set wireless.${radio}.country="$country_radio2g"
					else
						uci -q del wireless.${radio}.country
					fi
				elif [ "$band" = "5" ]; then
					uci -q set wireless.${radio}.channel="$channel_radio5g"
					if [ -n "$country_radio5g" ]; then
						uci -q set wireless.${radio}.country="$country_radio5g"
					else
						uci -q del wireless.${radio}.country
					fi
				fi

				if [ "$unify_ssid" = "1" ]; then
					uci -q set wireless.@wifi-iface[$idx].ssid="${wifi_ssid}"
					uci -q set wireless.@wifi-iface[$idx].key="${wifi_key}"
					uci -q set wireless.@wifi-iface[$idx].encryption="${wifi_enc_key}"
					uci -q set wireless.@wifi-iface[$idx].wps_pushbutton='1'
					uci -q set wireless.@wifi-iface[$idx].ieee80211r='1'
					uci -q set wireless.@wifi-iface[$idx].ieee80211k='1'
					uci -q set wireless.@wifi-iface[$idx].ft_over_ds='0'
					uci -q set wireless.@wifi-iface[$idx].ft_psk_generate_local='1'
					uci -q set wireless.@wifi-iface[$idx].pmk_r1_push='1'
					uci -q set wireless.@wifi-iface[$idx].bss_transition='1'
					uci -q set wireless.@wifi-iface[$idx].proxy_arp='1'
				else
					bandssid="wifi_ssid${band}"
					eval "ssid_value=\"\${$bandssid}\""
					uci -q set wireless.@wifi-iface[$idx].ssid="${ssid_value}"
					bandkey="wifi_key${band}"
					eval "key_value=\"\${$bandkey}\""
					uci -q set wireless.@wifi-iface[$idx].key="${key_value}"
					bandenc="wifi_enc_key${band}"
					eval "enc_value=\"\${$bandenc}\""
					uci -q set wireless.@wifi-iface[$idx].encryption="${enc_value}"
					uci -q set wireless.@wifi-iface[$idx].wps_pushbutton='1'
					uci -q del wireless.@wifi-iface[$idx].ieee80211r
					uci -q del wireless.@wifi-iface[$idx].ieee80211k
					uci -q del wireless.@wifi-iface[$idx].ft_over_ds
					uci -q del wireless.@wifi-iface[$idx].ft_psk_generate_local
					uci -q del wireless.@wifi-iface[$idx].pmk_r1_push
					uci -q del wireless.@wifi-iface[$idx].bss_transition
					if [ "$mesh_enabled" = "1" ]; then
						uci -q set wireless.@wifi-iface[$idx].proxy_arp='1'
					else
						uci -q del wireless.@wifi-iface[$idx].proxy_arp
					fi
				fi
			}
		done
	fi
}

mesh_setup() {
	local mesh_enabled mesh_mode mesh_band mesh_id mesh_key hw_mac hw_wan
	local mesh_radio lan_device current_hostname hw_mac_clean

	config_load wizard
	config_get mesh_enabled "$cfg" mesh_enabled
	config_get mesh_mode "$cfg" mesh_mode
	config_get mesh_band "$cfg" mesh_band
	config_get mesh_id "$cfg" mesh_id
	config_get mesh_key "$cfg" mesh_key
	config_get hw_mac "$cfg" hw_mac
	config_get hw_wan "$cfg" hw_wan
	config_get channel_radio2g "$cfg" channel_radio2g
	config_get channel_radio5g "$cfg" channel_radio5g

	if [ "$mesh_enabled" = "1" ]; then
		if [ "$mesh_mode" = "point" ]; then
			current_hostname=$(uci -q get system.@system[0].hostname)
			hw_mac_clean=${hw_mac//:/}
			if [ "$current_hostname" = "RouteRich" ]; then
				uci -q set system.@system[0].hostname="RR$hw_mac_clean"
				uci commit system
				/etc/init.d/system restart
			fi

			uci -q set dhcp.lan.ignore='1'
			uci -q set network.lan.proto='dhcp'
			uci -q del network.lan.ipaddr
			uci -q del network.lan.netmask
			uci -q del network.lan.ip6assign
			uci -q del network.wan
			uci -q del network.wan6

			uci -q set internet-detector.internet.mod_led_control_enabled='1'
			uci commit internet-detector
			service internet-detector restart

			lan_device=$(uci show network | grep device | grep name | grep br-lan | awk -F'.' '{print $2}')
			if ! uci -q get network.$lan_device.ports | grep -q -w "${hw_wan}"; then
				uci add_list network.$lan_device.ports="${hw_wan}"
				uci -q set network.$lan_device.macaddr="${hw_mac}"
			fi

			for idx in `seq 0 64`; do
				uci -q get wireless.@wifi-iface[$idx] || break
				[ "$(uci -q get wireless.@wifi-iface[$idx].mode)" = "ap" ] && {
					local radio="$(uci -q get wireless.@wifi-iface[$idx].device)"
					local band="$(uci -q get wireless.${radio}.band)"
					eval "chval=\$channel_radio$band"
					uci -q set wireless.${radio}.channel="$chval"
				}
			done
		else
			lan_device=$(uci show network | grep device | grep name | grep br-lan | awk -F'.' '{print $2}')
			uci -q del_list network.$lan_device.ports="${hw_wan}"
			uci -q del network.$lan_device.macaddr

			current_hostname=$(uci -q get system.@system[0].hostname)
			hw_mac_clean=${hw_mac//:/}
			if [ "$current_hostname" = "RR$hw_mac_clean" ]; then
				uci -q set system.@system[0].hostname="RouteRich"
				uci commit system
				/etc/init.d/system restart
				uci -q set internet-detector.internet.mod_led_control_enabled='0'
				uci commit internet-detector
				service internet-detector restart
			fi
		fi

		case "$mesh_band" in
			2|5)
				local lan_device=$(uci show network | grep device | grep name | grep br-lan | awk -F'.' '{print $2}')
				uci -q del network.$lan_device.stp
				uci -q del wireless.meshnet2
				uci -q del wireless.meshnet5
				mesh_radio=$(uci show wireless | grep ${mesh_band}g | awk -F'.' '{print $2}')
				uci -q set wireless.meshnet=wifi-iface
				uci -q set wireless.meshnet.device="${mesh_radio}"
				uci -q set wireless.meshnet.mode='mesh'
				uci -q set wireless.meshnet.network='lan'
				uci -q set wireless.meshnet.mesh_id="${mesh_id}"
				uci -q set wireless.meshnet.encryption='sae'
				uci -q set wireless.meshnet.key="${mesh_key}"
				uci -q set wireless.meshnet.mesh_rssi_threshold='0'
				uci -q set wireless.meshnet.mesh_fwding='1'
				uci -q set wireless.meshnet.bss_transition='1'
				uci -q set wireless.meshnet.proxy_arp='1'
				uci -q reorder system.led_mesh${mesh_band}='99'
				uci commit system && /etc/init.d/led restart
				;;
			auto)
				local lan_device=$(uci show network | grep device | grep name | grep br-lan | awk -F'.' '{print $2}')
				uci -q set network.$lan_device.stp='1'
				uci -q del wireless.meshnet
				for idx in $(seq 0 64); do
					uci -q get wireless.@wifi-iface[$idx].device || break
					local radio=$(uci -q get wireless.@wifi-iface[$idx].device)
					local band="$(uci -q get wireless.${radio}.band | sed s/g//)"
					uci -q set wireless.meshnet${band}=wifi-iface
					uci -q set wireless.meshnet${band}.device="${radio}"
					uci -q set wireless.meshnet${band}.mode='mesh'
					uci -q set wireless.meshnet${band}.network='lan'
					uci -q set wireless.meshnet${band}.mesh_id="${mesh_id}"
					uci -q set wireless.meshnet${band}.encryption='sae'
					uci -q set wireless.meshnet${band}.key="${mesh_key}"
					uci -q set wireless.meshnet${band}.mesh_rssi_threshold='0'
					uci -q set wireless.meshnet${band}.mesh_fwding='1'
					uci -q set wireless.meshnet${band}.bss_transition='1'
					uci -q set wireless.meshnet${band}.proxy_arp='1'
					uci -q reorder system.led_mesh${band}='99'
				done
				uci commit system && /etc/init.d/led restart
				;;
		esac
	fi

	uci commit dhcp
	uci commit network
	uci commit wireless
	(
		sleep 15
		/etc/init.d/network reload
		/etc/init.d/dnsmasq reload
	) &
}

mqtt_restart() {
	(
		sleep 15
		/etc/init.d/mqtt restart
	) &
}

if hostapd_cli -i ${PHY}0-ap0 wps_get_status | grep -qi 'status: active'; then
	hostapd_cli -i ${PHY}0-ap0 wps_cancel
fi

if [ "$wizard_mesh" = "1" ]; then
	check_auto_channel
	syncwizard
	setup_rrtmc0 add controller
	manage_mesh_json
	setup_rrtmc0 del
	exit 0
fi

if check_internet; then
	check_auto_channel
	syncwizard
	update_wizard controller
	mesh_setup
	setup_rrtmc0 add controller
	manage_mesh_json
	setup_rrtmc0 del
	mqtt_restart
	exit 0
else
	setup_rrtmc0 add point
	download_mesh_json
	setup_rrtmc0 del
	update_wizard point
	wifi_setup
	mesh_setup
	mqtt_restart
	exit 0
fi
