DHCPC_EVENT="$1"
[ "$DHCPC_EVENT" = "bound" ] || [ "$DHCPC_EVENT" = "renew" ] || exit 0
WAN_ADDR="${ip}"
WAN_MASK="${subnet}"
[ -n "$WAN_MASK" ] || WAN_MASK="255.255.255.0"
LAN_IF="lan"
LAN_RAW="$(uci -q get network.${LAN_IF}.ipaddr)"
LAN_NETMASK="$(uci -q get network.${LAN_IF}.netmask)"

[ -n "$LAN_RAW" ] || exit 0

if echo "$LAN_RAW" | grep -q '/'; then
	NEW_IP="${LAN_RAW%%/*}"
	NEW_MASK=$(ipcalc.sh "$LAN_RAW" | sed -n 's/^NETMASK=//p')
	CUR_LAN_NET="$NEW_IP"
	CUR_LAN_PREFIX="$NEW_MASK"
else
	eval $(ipcalc.sh "${LAN_RAW}/${LAN_NETMASK:-255.255.255.0}")
	CUR_LAN_NET="$NETWORK"
	CUR_LAN_PREFIX="$PREFIX"
fi

eval $(ipcalc.sh "${WAN_ADDR}/${WAN_MASK}")
WAN_NET_ADDR="$NETWORK"
WAN_NET_PREFIX="$PREFIX"

CHECK_LAN_CONFLICT=$(ipcalc.sh "${LAN_RAW}/${WAN_NET_PREFIX}" | sed -n 's/^NETWORK=//p')
CHECK_WAN_CONFLICT=$(ipcalc.sh "${WAN_ADDR}/${CUR_LAN_PREFIX}" | sed -n 's/^NETWORK=//p')

if [ "$WAN_NET_ADDR" = "$CHECK_LAN_CONFLICT" ] || [ "$CUR_LAN_NET" = "$CHECK_WAN_CONFLICT" ]; then
	logger -t "subnet" -p daemon.warn "Conflict detected! WAN: ${WAN_ADDR}/${WAN_NET_PREFIX}, LAN: ${LAN_RAW}/${CUR_LAN_PREFIX}"
	ADDR_STEP=$(( 2**(32 - CUR_LAN_PREFIX) ))
	IFS=. read -r o1 o2 o3 o4 <<EOF
$CUR_LAN_NET
EOF

	NET_NUM=$(( (o1 << 24) + (o2 << 16) + (o3 << 8) + o4 ))
	NEW_NET_NUM=$(( NET_NUM + ADDR_STEP ))

	if [ "$NEW_NET_NUM" -gt 3232301056 ]; then
		NEW_NET_NUM=3232235520
	fi

	NO1=$(( (NEW_NET_NUM >> 24) & 255 ))
	NO2=$(( (NEW_NET_NUM >> 16) & 255 ))
	NO3=$(( (NEW_NET_NUM >> 8) & 255 ))
	NO4=$(( NEW_NET_NUM & 255 ))
	
	NEW_LAN_ADDR="${NO1}.${NO2}.${NO3}.$((NO4 + 1))"
	
	[ -z "$LAN_NETMASK" ] && LAN_NETMASK="$(ipcalc.sh ${LAN_RAW}/${LAN_NETMASK:-255.255.255.0} | sed -n 's/^NETMASK=//p')"
	
	logger -t "subnet" -p daemon.info "Changing LAN from $LAN_RAW to $NEW_LAN_ADDR mask $LAN_NETMASK"

	uci -q set network.${LAN_IF}.ipaddr="${NEW_LAN_ADDR}"
	uci -q set network.${LAN_IF}.netmask="${LAN_NETMASK}"
	uci commit network

	if uci -q get wizard.default > /dev/null; then
		uci -q set wizard.default.lan_ipaddr="${NEW_LAN_ADDR}"
		uci -q set wizard.default.lan_netmask="${LAN_NETMASK}"
		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
	fi

	sleep 2
	service network restart
fi
