#!/bin/sh
# Run once on every (re-)install/upgrade of luci-app-daede: migrate legacy
# config, drop stale files from the old luci-app-daed package, and seed the
# default dae form sections. The netns cleanup that used to be patched into
# daed's init from here now lives directly in daed's own stop_service().

set -e

# luci-app-daede owns its own LuCI menu and view path. Remove stale files from
# the official luci-app-daed package and earlier daede builds that reused
# /view/daed.
rm -f /usr/share/luci/menu.d/luci-app-daed.json
rm -f /usr/share/rpcd/acl.d/luci-app-daed.json
rm -rf /usr/share/luci-app-daed
rm -rf /www/luci-static/resources/view/daed
rm -f /usr/lib/lua/luci/i18n/daed.zh-cn.lmo
rm -f /tmp/luci-indexcache.* 2>/dev/null || true
rm -rf /tmp/luci-modulecache/* 2>/dev/null || true

if [ -f /etc/config/daed_luci ]; then
	old_backend="$(uci -q get daed_luci.config.active_backend || true)"
	if ! uci -q get daede.config >/dev/null 2>&1; then
		touch /etc/config/daede
		uci -q set daede.config=daede
		case "$old_backend" in
			dae|daed) uci -q set daede.config.active_backend="$old_backend" ;;
		esac
		uci -q commit daede
	elif ! uci -q get daede.config.active_backend >/dev/null 2>&1; then
		case "$old_backend" in
			dae|daed)
				uci -q set daede.config.active_backend="$old_backend"
				uci -q commit daede
				;;
		esac
	fi
	rm -f /etc/config/daed_luci
fi

if ! uci -q get daede.config >/dev/null 2>&1; then
	touch /etc/config/daede
	uci -q set daede.config=daede
	if [ -f /etc/init.d/daed ]; then
		uci -q set daede.config.active_backend='daed'
	else
		uci -q set daede.config.active_backend='dae'
	fi
	uci -q commit daede
fi

# Remove --disable-timestamp from dae init so log lines carry timestamps
DAE_INIT="/etc/init.d/dae"
if [ -f "$DAE_INIT" ]; then
	sed -i 's/--disable-timestamp//' "$DAE_INIT"
	sed -i '/procd_append_param command *$/d' "$DAE_INIT"
fi

# dae expects geoip.dat / geosite.dat under /usr/share/dae/;
# v2ray-geoip installs them to /usr/share/v2ray/. Create symlinks.
if [ -f /usr/share/v2ray/geoip.dat ] && [ ! -f /usr/share/dae/geoip.dat ]; then
	mkdir -p /usr/share/dae
	ln -sf /usr/share/v2ray/geoip.dat /usr/share/dae/geoip.dat
fi
if [ -f /usr/share/v2ray/geosite.dat ] && [ ! -f /usr/share/dae/geosite.dat ]; then
	mkdir -p /usr/share/dae
	ln -sf /usr/share/v2ray/geosite.dat /usr/share/dae/geosite.dat
fi
if [ -f /usr/share/v2ray/geoip.dat ] && [ ! -f /usr/share/daed/geoip.dat ]; then
	mkdir -p /usr/share/daed
	ln -sf /usr/share/v2ray/geoip.dat /usr/share/daed/geoip.dat
fi
if [ -f /usr/share/v2ray/geosite.dat ] && [ ! -f /usr/share/daed/geosite.dat ]; then
	mkdir -p /usr/share/daed
	ln -sf /usr/share/v2ray/geosite.dat /usr/share/daed/geosite.dat
fi

# Seed default dae form sections (group/routing/dns) for the LuCI editor.
# Idempotent: only add what's missing. Lives in the `dae` UCI package,
# consumed by gen-dae-config.sh.
if [ -f /etc/config/dae ]; then
	if ! uci -q show dae | grep -q "=group$"; then
		g="$(uci add dae group)"
		uci -q set "dae.$g.name=proxy"
		uci -q set "dae.$g.policy=min_moving_avg"
	fi
	if ! uci -q get dae.routing >/dev/null 2>&1; then
		uci -q set dae.routing=routing
		uci -q set dae.routing.private_direct=1
		uci -q set dae.routing.cn_direct=1
		uci -q set dae.routing.block_ads=0
		uci -q set dae.routing.fallback=proxy
	fi
	if ! uci -q get dae.dns >/dev/null 2>&1; then
		uci -q set dae.dns=dns
		uci -q set dae.dns.cn_upstream='udp://dns.alidns.com:53'
		uci -q set dae.dns.fallback_upstream='tcp+udp://dns.google:53'
	fi
	# Migrate legacy group filters to the unified source / name_filter fields,
	# then drop the old keys so the form shows real, editable values (the old
	# fields used to re-populate the new ones and looked un-deletable).
	# `uci get` joins a list into one space-separated line; the unquoted $() word-
	# splits it back into items. dae tags/keywords are whitespace-free, so this is
	# the intended split (do NOT set IFS=newline here — it would merge the items).
	i=0
	while uci -q get "dae.@group[$i]" >/dev/null 2>&1; do
		if [ -z "$(uci -q get dae.@group[$i].source)" ]; then
			for v in $(uci -q get dae.@group[$i].filter_sub 2>/dev/null); do
				uci -q add_list dae.@group[$i].source="$v"
			done
		fi
		if [ -z "$(uci -q get dae.@group[$i].name_filter)" ]; then
			for v in $(uci -q get dae.@group[$i].filter_node 2>/dev/null); do
				uci -q add_list dae.@group[$i].name_filter="$v"
			done
		fi
		uci -q delete dae.@group[$i].filter_sub 2>/dev/null
		uci -q delete dae.@group[$i].filter_node 2>/dev/null
		i=$((i+1))
	done
	uci -q commit dae
fi

exit 0

reload_service() {
	restart
}
