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

# start prio
START=50
# use proc to start service
USE_PROCD=1
# package name
PACKAGE_NAME="acc.ipk"
# binary dir
sbin_dir="/usr/sbin/leigod"
# binary name
binary_prefix="acc-gw.linux"


# download acceleration binary
download_acc_binary() {
    echo "begin to download file... ..."
    # create download 
    local url="http://119.3.40.126/${PACKAGE_NAME}"
    echo "download path: ${url}"
    local path="/tmp/${PACKAGE_NAME}"
    local code=$(curl --connect-timeout 2 -L -s -k -o "${path}" -w "%{http_code}" "${url}")
    for i in $(seq 1 2)  
    do
        if [ "$?" != "0" -o "${code}" != "200" -o ! -f "${path}" ]; then
            echo "download failed: ${code}"
            rm -f ${path}
            sleep 5
            continue
        fi
        echo "download success"
        break
    done

    echo "download file success... ..."
}

# mkdir acc dir
mk_acc_dir() {
    echo "begin to mkdir... ..."
    # should make sure dir exist
    local cmd="mkdir -p ${BINARY_DIR}"
    echo "exec mkdir dir: ${cmd}"
    local code=`$cmd`
    echo "mkdir success... ..."
}

# decompress file
decompress_file() {
    echo "begin to decompress file... ..."
    # compress file path
    local path="/tmp/${PACKAGE_NAME}"
    # decompress command
    local cmd="tar -zxvf ${path} -C ${BINARY_DIR}"
    local code=`${cmd}`
    echo "decompress file success... ..."
}

# install ipk
install_package() {
  echo "begin to overwrite package"
  # local cmd = "opkg install /tmp/${PACKAGE_NAME} --force-overwrite"
  # `$cmd` 
  echo "overwrite finish, begin to start"
}

# main
prepare_env() {
    # mkdir 
    mk_acc_dir
    # download file
    download_acc_binary
    # decompress file
    install_package
}

main() {
    prepare_env
}

# get_device_arch, 
# current support arch: arm64 arm x86_64 mips 
get_device_arch() {
  arch=$(uname -m)
  if [ $? != "0" ]; then
    echo "arch cant be get"
    return -1
  fi
  # fix arch 
  if [ ${arch} == "x86_64" ]; then
    echo "match x86_64 -> amd64"
    arch="amd64"
  elif [ ${arch} == "aarch64" ]; then
    echo "match aarch64 -> arm64"
    arch="arm64"
  elif [ ${arch} == "mips" ]; then
    echo "match mips -> mipsle"
    arch="mipsle"
  elif [ ${arch} == "armv7l" ]; then
    echo "match armv7l -> arm"
    arch="arm"
  fi
  return 0
}

# get_xiaomi_name check if is xiaomi 
get_xiaomi_name() {
  local name=$(uci get misc.hardware.displayName)
  if [[ $? == "0" && ${name} != "" ]]; then
    echo "router is xiaomi series, name: ${name}"
    sbin_dir="/userdisk/appdata/leigod"
    init_dir="/userdisk/appdata/leigod"
    args="--mode tun"
    is_xiaomi=true
    return 0
  fi
  local name=$(uci get misc.hardware.model)
  if [[ $? == "0" && ${name} != "" ]]; then
    echo "router is xiaomi series, name: ${name}"
    sbin_dir="/userdisk/appdata/leigod"
    init_dir="/userdisk/appdata/leigod"
    args="--mode tun"
    is_xiaomi=true
    return 0
  fi
  echo "router is not xiaomi, use general openwrt"
  sbin_dir="/usr/sbin/leigod"
  init_dir="/etc/init.d"
  return 0
}

# run service as daemon
start_service_daemon() {
    # open once instance
    procd_open_instance
    # run binary
    local cmd="${sbin_dir}/${binary_prefix}.${arch} ${args}"
    echo "start service: ${cmd}"
    procd_set_param command ${cmd}
    # auto start when failed
    procd_set_param respawn
    # close instance
    procd_close_instance
    # start check update
    # update_plugin &
}


# proc start service
start_service() {

    config_load "accelerator"
    
    local enabled
    config_get_bool enabled base enabled 0
    
    local tun
    config_get_bool tun base tun 0

    [ "${enabled}" -gt 0 ] || return    
    [ "${tun}" -eq 1 ] && args="--mode tun"

    get_device_arch
    start_service_daemon
}


service_triggers() {
	procd_add_reload_trigger "accelerator"
}
