#!/bin/bash
. /lib/functions.sh

uci -q delete ucitrack.@openclash[-1]
uci -q add ucitrack openclash
uci -q set ucitrack.@openclash[-1].init=openclash
uci -q commit ucitrack
uci -q delete firewall.openclash
uci -q set firewall.openclash=include
uci -q set firewall.openclash.type=script
uci -q set firewall.openclash.path=/var/etc/openclash.include
[ -n "$(command -v fw4)" ] || uci -q set firewall.openclash.reload=1
uci -q commit firewall

mkdir -p /etc/openclash/config
mkdir -p /etc/openclash/proxy_provider
mkdir -p /etc/openclash/backup
mkdir -p /etc/openclash/core
mkdir -p /etc/openclash/history
mkdir -p /usr/share/openclash/backup

cp -f "/etc/config/openclash" "/usr/share/openclash/backup/openclash" >/dev/null 2>&1
cp -f "/etc/openclash/custom/openclash_custom_rules.list" "/usr/share/openclash/backup/openclash_custom_rules.list" >/dev/null 2>&1
cp -f "/etc/openclash/custom/openclash_custom_rules_2.list" "/usr/share/openclash/backup/openclash_custom_rules_2.list" >/dev/null 2>&1
cp -f "/etc/openclash/custom/openclash_custom_hosts.list" "/usr/share/openclash/backup/openclash_custom_hosts.list" >/dev/null 2>&1
cp -f "/etc/openclash/custom/openclash_custom_fake_filter.list" "/usr/share/openclash/backup/openclash_custom_fake_filter.list" >/dev/null 2>&1
cp -f "/etc/openclash/custom/openclash_custom_domain_dns.list" "/usr/share/openclash/backup/openclash_custom_domain_dns.list" >/dev/null 2>&1
cp -f "/etc/openclash/custom/openclash_custom_domain_dns_policy.list" "/usr/share/openclash/backup/openclash_custom_domain_dns_policy.list" >/dev/null 2>&1
cp -f "/etc/openclash/custom/openclash_custom_fallback_filter.yaml" "/usr/share/openclash/backup/openclash_custom_fallback_filter.yaml" >/dev/null 2>&1
cp -f "/etc/openclash/custom/openclash_custom_netflix_domains.list" "/usr/share/openclash/backup/openclash_custom_netflix_domains.list" >/dev/null 2>&1
cp -f "/etc/openclash/custom/openclash_force_sniffing_domain.yaml" "/usr/share/openclash/backup/openclash_force_sniffing_domain.yaml" >/dev/null 2>&1
cp -f "/etc/openclash/custom/openclash_sniffing_domain_filter.yaml" "/usr/share/openclash/backup/openclash_sniffing_domain_filter.yaml" >/dev/null 2>&1
cp -f "/etc/openclash/custom/openclash_sniffing_port_filter.yaml" "/usr/share/openclash/backup/openclash_sniffing_port_filter.yaml" >/dev/null 2>&1
cp -f "/etc/openclash/custom/openclash_custom_localnetwork_ipv4.list" "/usr/share/openclash/backup/openclash_custom_localnetwork_ipv4.list" >/dev/null 2>&1
cp -f "/etc/openclash/custom/openclash_custom_localnetwork_ipv6.list" "/usr/share/openclash/backup/openclash_custom_localnetwork_ipv6.list" >/dev/null 2>&1
cp -f "/etc/openclash/custom/openclash_custom_chnroute_pass.list" "/usr/share/openclash/backup/openclash_custom_chnroute_pass.list" >/dev/null 2>&1
cp -f "/etc/openclash/custom/openclash_custom_chnroute6_pass.list" "/usr/share/openclash/backup/openclash_custom_chnroute6_pass.list" >/dev/null 2>&1

mkdir -p /lib/upgrade/keep.d
cat > "/lib/upgrade/keep.d/luci-app-openclash" <<-EOF
/etc/openclash/
EOF

source "/etc/openwrt_release"
case "${DISTRIB_ARCH}" in
	aarch64_*)
		CORE_ARCH="linux-arm64"
		;;
	arm_*_neon-vfp*)
		CORE_ARCH="linux-armv7"
		;;
	arm_*_neon|arm_*_vfp*)
		CORE_ARCH="linux-armv6"
		;;
	arm*)
		CORE_ARCH="linux-armv5"
		;;
	i386_*)
		CORE_ARCH="linux-386"
		;;
	mips64_*)
		CORE_ARCH="linux-mips64"
		;;
	mips_*)
		CORE_ARCH="linux-mips-softfloat"
		;;
	mipsel_*)
		CORE_ARCH="linux-mipsle-softfloat"
		;;
	x86_64)
		CORE_ARCH="linux-amd64"
		;;
	*)
		CORE_ARCH="0"
		;;
esac
uci -q set openclash.config.core_version="${CORE_ARCH}"

if [ -n "$(uci -q get dhcp.@dnsmasq[0].resolvfile)" ]; then
   uci -q set openclash.config.default_resolvfile=$(uci -q get dhcp.@dnsmasq[0].resolvfile)
fi

if [ -f "/tmp/openclash.bak" ]; then
	mv -f "/tmp/openclash.bak" "/etc/config/openclash" >/dev/null 2>&1
	cp -rf "/tmp/openclash/." "/etc/openclash/" >/dev/null 2>&1
	cp -rf "/tmp/openclash_config/." "/etc/openclash/config/" >/dev/null 2>&1
	cp -rf "/tmp/openclash_core/." "/etc/openclash/core/" >/dev/null 2>&1
	cp -rf "/tmp/openclash_history/." "/etc/openclash/history/" >/dev/null 2>&1
	cp -rf "/tmp/openclash_proxy_provider/." "/etc/openclash/proxy_provider/" >/dev/null 2>&1
	cp -rf "/tmp/openclash_rule_provider/." "/etc/openclash/rule_provider/" >/dev/null 2>&1
	cp -rf "/tmp/openclash_game_rules/." "/etc/openclash/game_rules/" >/dev/null 2>&1
	mv -f "/tmp/openclash_custom_rules.list.bak" "/etc/openclash/custom/openclash_custom_rules.list" >/dev/null 2>&1
	mv -f "/tmp/openclash_custom_rules_2.list.bak" "/etc/openclash/custom/openclash_custom_rules_2.list" >/dev/null 2>&1
	mv -f "/tmp/openclash_custom_hosts.list.bak" "/etc/openclash/custom/openclash_custom_hosts.list" >/dev/null 2>&1
	mv -f "/tmp/openclash_custom_fake_filter.list.bak" "/etc/openclash/custom/openclash_custom_fake_filter.list" >/dev/null 2>&1
	mv -f "/tmp/openclash_custom_domain_dns.list.bak" "/etc/openclash/custom/openclash_custom_domain_dns.list" >/dev/null 2>&1
	if [ -d "/tmp/openclash_dashboard/" ]; then
		rm -rf "/usr/share/openclash/ui/dashboard/" >/dev/null 2>&1
		cp -rf "/tmp/openclash_dashboard/." "/usr/share/openclash/ui/dashboard/" >/dev/null 2>&1
		rm -rf "/tmp/openclash_dashboard/" >/dev/null 2>&1
	fi
	if [ -d "/tmp/openclash_yacd/" ]; then
		rm -rf "/usr/share/openclash/ui/yacd/" >/dev/null 2>&1
		cp -rf "/tmp/openclash_yacd/." "/usr/share/openclash/ui/yacd/" >/dev/null 2>&1
		rm -rf "/tmp/openclash_yacd/" >/dev/null 2>&1
	fi
	rm -rf "/etc/openclash/openclash" >/dev/null 2>&1
	rm -rf "/etc/openclash/fake_filter.list" >/dev/null 2>&1
	rm -rf "/etc/openclash/openclash_servers_fake_filter.conf" >/dev/null 2>&1
	rm -rf "/tmp/openclash" >/dev/null 2>&1
	rm -rf "/tmp/openclash.bak" >/dev/null 2>&1
fi

if [ -f "/usr/lib/lua/luci/model/network.lua" ]; then
   sed -i '/OpenClash Append/,/OpenClash Append End/d' "/usr/lib/lua/luci/model/network.lua" >/dev/null 2>&1
   cat >> "/usr/lib/lua/luci/model/network.lua" << EOF
-------------- OpenClash Append --------------

function get_all_wan_networks(self)
	local k, v
	local wan_nets = { }
	local route_statuses = self:get_all_status_by_route("0.0.0.0", 0)

	for k, v in pairs(route_statuses) do
		wan_nets[#wan_nets+1] = network(k, v.proto)
	end

	return wan_nets
end

function get_all_wan6_networks(self)
	local k, v
	local wan6_nets = { }
	local route_statuses = self:get_all_status_by_route("::", 0)

	for k, v in pairs(route_statuses) do
		wan6_nets[#wan6_nets+1] = network(k, v.proto)
	end

	return wan6_nets
end

function get_all_status_by_route(self, addr, mask)
	local route_statuses = { }
	local _, object
	for _, object in ipairs(utl.ubus()) do
		local net = object:match("^network%.interface%.(.+)")
		if net then
			local s = utl.ubus(object, "status", {})
			if s and s.route then
				local rt
				for _, rt in ipairs(s.route) do
					if not rt.table and rt.target == addr and rt.mask == mask then
						route_statuses[net] = s
					end
				end
			end
		end
	end

	return route_statuses
end

-------------- OpenClash Append End --------------
EOF
fi

#Set authentication
if [ -n "$(uci -q get openclash.@authentication[0].enabled)" ]; then
   auth_cfg=false
else
   auth_cfg=true
fi

if $auth_cfg; then
	uci_name_tmp=$(uci add openclash authentication)
	uci_set="uci -q set openclash.$uci_name_tmp."
	${uci_set}enabled="1"
	${uci_set}username="Clash"
	${uci_set}password="$(tr -cd 'a-zA-Z0-9' </dev/urandom 2>/dev/null| head -c8 || date +%N| md5sum |head -c8)"
fi

uci -q set openclash.config.enable=0
uci -q commit openclash

rm -f /tmp/luci-indexcache
exit 0
