#!/bin/sh /etc/rc.common

START=99
STOP=11
USE_PROCD=1

ENTRY=/usr/sbin/linkease-app-entry
PRIMARY=/usr/bin/linkease-full
FORCE_GATEWAY=/var/run/linkease-app-entry/force-gateway
DATA_ROOT_WAIT_SECONDS=${LINKEASEFULL_DATA_ROOT_WAIT_SECONDS:-60}

append_primary_arg() {
	procd_append_param command --primary-arg "$1"
}

primary_enabled() {
	[ -x "$PRIMARY" ] || return 1
	[ ! -e "$FORCE_GATEWAY" ] || return 1
	enabled="$(uci -q get linkeasefull.@linkeasefull[0].enabled 2>/dev/null || echo 1)"
	[ "$enabled" = 1 ]
}

ensure_linkease_config() {
	if [ ! -f /etc/config/linkease ]; then
		touch /etc/config/linkease || return 1
	fi
	if ! uci -q get linkease.@linkease[0] >/dev/null; then
		uci -q add linkease linkease >/dev/null || return 1
		uci -q set linkease.@linkease[0].enabled='0' || return 1
		uci -q set linkease.@linkease[0].port='8897' || return 1
		uci -q set linkease.@linkease[0].allowPublic='0' || return 1
		uci -q commit linkease || return 1
	fi
}

prepare_linkeasefull_runtime() {
	local data_root_parent data_root recycle_root wait_left
	ensure_linkease_config || true
	data_root_parent="$(uci -q get linkease.@linkease[0].local_home 2>/dev/null || true)"
	case "$data_root_parent" in
		""|/tmp|/tmp/*|/var|/var/*|/run|/run/*|/dev|/dev/*|/proc|/proc/*|/sys|/sys/*|/rom|/rom/*|/overlay|/overlay/*) data_root_parent="" ;;
	esac
	if [ -n "$data_root_parent" ]; then
		wait_left="$DATA_ROOT_WAIT_SECONDS"
		case "$wait_left" in ""|*[!0-9]*) wait_left=60 ;; esac
		while [ "$wait_left" -gt 0 ] && [ ! -d "$data_root_parent" ]; do
			sleep 1
			wait_left=$((wait_left - 1))
		done
		[ -d "$data_root_parent" ] || data_root_parent=""
	fi
	if [ -n "$data_root_parent" ]; then
		data_root="$data_root_parent/.linkease_data"
		recycle_root="$data_root_parent/.linkease_recycle"
		mkdir -p "$data_root/users/admin" "$data_root/system" "$data_root/tmp" "$data_root/config" "$data_root/apptunnel" "$data_root/mountremote" "$recycle_root"
	fi
	mkdir -p /tmp/linkeasefull/logs
	rm -f /var/run/linkease.sock
}

start_service() {
	config_load linkease_app_entry
	config_get_bool entry_enabled main enabled 1
	[ "$entry_enabled" = 1 ] || return 1
	config_get listen main listen "127.0.0.1:19290"
	config_get ready_timeout main ready_timeout "75s"
	config_get max_failures main max_primary_failures "3"
	config_get crash_window main crash_window "60s"
	config_get state_file main state_file "/var/run/linkease-app-entry/state.json"

	mkdir -p /var/run/linkease-app-entry
	primary=0
	primary_enabled && primary=1
	[ "$primary" = 1 ] && prepare_linkeasefull_runtime

	procd_open_instance entry
	procd_set_param limits nofile="65535 65535"
	procd_set_param command "$ENTRY" supervisor \
		--listen "$listen" \
		--primary "$PRIMARY" \
		--primary-enabled="$primary" \
		--fallback "$ENTRY" \
		--fallback-arg gateway \
		--state-file "$state_file" \
		--ready-timeout "$ready_timeout" \
		--max-primary-failures "$max_failures" \
		--crash-window "$crash_window"

	append_primary_arg --host
	append_primary_arg 127.0.0.1
	append_primary_arg --port
	append_primary_arg 19290
	append_primary_arg --mode
	append_primary_arg release
	append_primary_arg --basePath
	append_primary_arg /apps/
	append_primary_arg --deviceAddr
	append_primary_arg 0.0.0.0:8897
	append_primary_arg --localApi
	append_primary_arg /var/run/linkease.sock
	append_primary_arg --supplierCode
	append_primary_arg linkease

	procd_set_param env \
		"LINKEASE_AUTH_PROVIDER=openwrt" \
		"KAIPLUS_ENABLED=0"
	procd_set_param respawn 3600 5 0
	procd_set_param stdout 1
	procd_set_param stderr 1
	procd_close_instance
}

service_triggers() {
	procd_add_reload_trigger "linkease_app_entry" "linkeasefull"
}
