#!/system/bin/sh

MODDIR=${0%/*}
CONFIG_FILE="${MODDIR}/config/config.toml"
COMMAND_ARGS="${MODDIR}/config/command_args"
LOG_FILE="${MODDIR}/log.log"
MODULE_PROP="${MODDIR}/module.prop"
EASYTIER="${MODDIR}/easytier-core"

# 处理获取到的设备型号中可能出现的空格
BRAND=$(getprop ro.product.brand | tr ' ' '-')
MODEL=$(getprop ro.product.model | tr ' ' '-')
DEVICE_HOSTNAME="${BRAND}-${MODEL}"
REDIR_STATUS=""

# 更新 module.prop 文件中的 description
update_module_description() {
    local status_message=$1
    # 检查 module.prop 文件存在且 description 发生变化了再写入
    if [ -f "${MODULE_PROP}" ]; then
        local current_desc=$(grep "^description=" "${MODULE_PROP}")
        local new_desc="description=[状态] ${status_message}"
        if [ "${current_desc}" != "${new_desc}" ]; then
            sed -i "s#^description=.*#${new_desc}#" "${MODULE_PROP}"
        fi
    fi
}

# 检查并初始化 TUN 设备
if [ ! -e /dev/net/tun ]; then
    if [ ! -d /dev/net ]; then
        mkdir -p /dev/net
    fi
    
    ln -s /dev/tun /dev/net/tun
fi

while true; do
    # 获取子网转发激活状态
    if [ -f "${MODDIR}/enable_IP_rule" ]; then
        REDIR_STATUS="转发已激活"
    else
        REDIR_STATUS="转发已禁用"
    fi

    # 检查模块是否被禁用
    if [ -f "${MODDIR}/disable" ]; then
        update_module_description "主程序已关闭 | ${REDIR_STATUS}"
        if pgrep -f "${EASYTIER}" >/dev/null; then
            echo "开关控制 $(date "+%Y-%m-%d %H:%M:%S") 进程已存在，正在关闭"
            pkill -f "${EASYTIER}"
        fi
        sleep 10s
        continue
    fi
    
    # 检查进程是否已经在运行
    if pgrep -f "${EASYTIER}" >/dev/null; then
        sleep 10s
        continue
    fi
    
    # 检查配置文件是否存在
    if [ ! -f "${CONFIG_FILE}" ] && [ ! -f "${COMMAND_ARGS}" ]; then
        update_module_description "缺少配置文件或启动参数文件"
        sleep 10s
        continue
    fi
    
    # 如果 config 目录下存在 command_args 文件，则读取其中的内容作为启动参数
    if [ -f "${COMMAND_ARGS}" ]; then
        # 启动参数模式
        CMD_CONTENT=$(tr '\r\n' ' ' < "${COMMAND_ARGS}")
        
        if echo "${CMD_CONTENT}" | grep -q "\-\-hostname"; then
            FINAL_ARGS="${CMD_CONTENT}"
        else
            FINAL_ARGS="${CMD_CONTENT} --hostname ${DEVICE_HOSTNAME}"
        fi
        
        TZ=Asia/Shanghai "${EASYTIER}" ${FINAL_ARGS} > "${LOG_FILE}" 2>&1 &
        STR_MODE="启动参数模式"
        
        # 否则读取 config.toml 的内容作为启动参数
    else
        # 配置文件模式
        if grep -q "^[[:space:]]*hostname[[:space:]]*=" "${CONFIG_FILE}"; then
            TZ=Asia/Shanghai "${EASYTIER}" -c "${CONFIG_FILE}" > "${LOG_FILE}" 2>&1 &
        else
            TZ=Asia/Shanghai "${EASYTIER}" -c "${CONFIG_FILE}" --hostname "${DEVICE_HOSTNAME}" > "${LOG_FILE}" 2>&1 &
        fi
        
        STR_MODE="配置文件模式"
    fi
    
    # 等待进程启动
    sleep 5s
    
    # 启动后的扫尾工作
    if pgrep -f "${EASYTIER}" >/dev/null; then
        
        if ! ip rule show | grep -q "lookup main"; then
            ip rule add from all lookup main
        fi
        
        update_module_description "主程序正在运行（${STR_MODE}）| ${REDIR_STATUS}"
    else
        update_module_description "主程序启动失败，请检查配置文件或启动参数"
    fi
    
    sleep 10s
done