#!/bin/bash

BASE_CONFIG=/etc/ed-qml.conf
LOG_PATH=/var/log/ed-qmi/
LOG_FILE=${LOG_PATH}quectel-CM_lte.log
CMD_BIN=quectel-CM

function read_config(){
    local key=$1
    cat ${BASE_CONFIG} | sed -nE "s/^[[:blank:]]*${key}=(.*)$/\1/p"
}

# function do_reset(){
#     if [ $# -eq 1 ]; then
#         local pin=$1
#         pinctrl set ${pin} op dh
#         sleep 1
#         pinctrl set ${pin} op dl
#     elif [ $# -eq 2 ];then
#         local gpiochip=$1
#         local line=$2
#         gpioset ${gpiochip} ${line}=1
#         sleep 1
#         gpioset ${gpiochip} ${line}=0
#     fi
# }

# function do_lte_rst() {
#     if [ -f ${BASE_CONFIG} ];then
#         local config_pin=$(read_config reset_pin)
#         if [ -n "${config_pin}" ];then
#             do_reset ${config_pin}
#             return
#         else
#             local config_pin_name=$(read_config reset_name)
#             if [ -n "${config_pin_name}" ];then
#                 local gpio_line=$(gpiofind ${config_pin_name})
#                 do_reset ${gpio_line}
#                 return
#             fi
#         fi
#         echo -e "\e[31m No pin configuration in ${BASE_CONFIG} \e[0m"
#     else
#         echo -e "\e[31m Not found: ${BASE_CONFIG} \e[0m"
#     fi
# }

function networkmanager_dns(){
    grep -rq '^dns=resolvconf' /etc/NetworkManager/NetworkManager.conf /etc/NetworkManager/conf.d/
    if [ $? -ne 0 ];then
        mkdir -p /etc/NetworkManager/conf.d
        echo "[main]" > /etc/NetworkManager/conf.d/dns-resolvconf.conf
        echo "dns=resolvconf" >> /etc/NetworkManager/conf.d/dns-resolvconf.conf
    fi
}

function do_connect(){
    networkmanager_dns
    ps -ef | grep ${CMD_BIN} | grep -vq grep
    if [ $? -eq 0 ];then
        echo "${CMD_BIN} is running."
        exit 1
    fi
    
    lsusb | grep -q "Quectel Wireless"
    if [ $? -ne 0 ];then
        echo "Not found Quectel Wireless."
        exit 2
    fi

    systemctl stop ModemManager.service

    mkdir -p ${LOG_PATH}
    cd ${LOG_PATH}
    
    local apn=$(read_config apn)
    local retry_count=0
    local max_retries=3
    local connection_success=false
    
    if [ -n "${apn}" ];then
        local apn_user=$(read_config apn_user)
        local apn_password=$(read_config apn_password)
        local apn_auth=$(read_config apn_auth)
        
        if [ "${apn_auth}" != "1" ] && [ "${apn_auth}" != "2" ] && [ "${apn_auth}" != "3" ];then
            echo "apn auth need to be 1~3, try to use default(1)"
            apn_auth="1"
        fi
        
        # APN连接重试3次
        while [ $retry_count -lt $max_retries ]; do
            echo "APN connection attempt $((retry_count + 1))/$max_retries"
            
            if [ -n "${apn_user}" ] && [ -n "${apn_password}" ];then
                nohup ${CMD_BIN} -4 -s ${apn} ${apn_user} ${apn_password} ${apn_auth} &
            else
                nohup ${CMD_BIN} -4 -s ${apn} &
            fi
            
            if [ $? -eq 0 ]; then
                echo "APN connection successful"
                connection_success=true
                break
            fi
            
            retry_count=$((retry_count + 1))
            if [ $retry_count -lt $max_retries ]; then
                echo "APN connection failed, retrying..."
                sleep 5
            fi
        done
        
        # APN连接3次失败，尝试默认连接
        if [ "$connection_success" = false ]; then
            echo "APN connection failed 3 times, trying default connection (no APN)"
        fi
    fi
    
    # 去掉APN的默认连接
    if [ -z "${apn}" ] || [ "$connection_success" = false ]; then
        echo "Using default connection"
        nohup ${CMD_BIN} -4 &
    fi
}


function do_disconnect(){
    ps -ef | grep ${CMD_BIN} | grep -vq grep
    if [ $? -eq 0 ];then
        killall -q quectel-CM
    else
        echo "quectel-CM is not running."
    fi
}


usage() {
    echo "Use: $0 options"
    echo "options:"
    echo "  -r, --reset         Reset LTE"
    echo "  -c, --connect       Connect to LTE"
    echo "  -d, --disconnect    Disconnecting LTE"
    echo "  -h, --help"
    exit 1
}

if [ "$(id -u)" -ne 0 ]; then
    echo "Script must be run as root. Try 'sudo $0'" 
    exit 1
fi

if [ $# -eq 0 ];then
    usage
    exit 1
fi

while [[ $# -gt 0 ]]; do
    case "$1" in
        -r|--reset) echo "Reset function handled by Rust code"; exit 1 ;;
        -d|--disconnect) do_disconnect; exit 0 ;;
        -c|--connect) do_connect; exit 0 ;;
        *)  usage; exit 1 ;;
    esac
done
