_functions_loaded 2> /dev/null || . "${ROOTACT}/lrr/com/_functions.sh"

. "${ROOTACT}/lrr/failovermgr/check_interface_status"

switchWwanInterface()
{
    in=$1
    out=$2

    if { [ "$in" != "wwan0" ] || [ "$out" != "wwan1" ]; } && { [ "$in" != "wwan1" ] || [ "$out" != "wwan0" ]; }; then
        return 1
    fi

    sed -i "s/DEFAULT_CELLULAR_NETIF_NAME=\"$in\"/DEFAULT_CELLULAR_NETIF_NAME=\"$out\"/" "${ROOTACT}/lrr/gwmgr/scripts/tekos/gwmgr_netconfig.sh"

    sed -i "s/\"name\": \"$in\"/\"name\": \"$out\"/" "${ROOTACT}/usr/data/lrr/gwmgr/applied.json"
    sed -i "s/\"name\": \"$in\"/\"name\": \"$out\"/" "${ROOTACT}/usr/data/lrr/gwmgr/commited.json"

    sed -i "s/name=$in/name=$out/" "${ROOTACT}/usr/etc/lrr/lrr.ini"
    sed -i "s/principal=$in/principal=$out/" "${ROOTACT}/usr/etc/lrr/ipfailover2.ini"
    sed -i "s/rescue=$in/rescue=$out/" "${ROOTACT}/usr/etc/lrr/ipfailover2.ini"

    rm -f /home/actility/usr/data/lrr/gwmgr/netif_activ

    $ROOTACT/lrr/gwmgr/gwmgr.x --apply < "${ROOTACT}/usr/data/lrr/gwmgr/applied.json"

    /etc/init.d/lrr restart
}

restartInterface()
{

INTERFACE=$1

case "$INTERFACE" in
    eth[0-9])
        Log "Restart interface $INTERFACE"
        ETHIPADDR=""
        ITF_CONFIG="$ROOTACT/usr/data/lrr/gwmgr/static_config.${INTERFACE}"
        [ -f "$ITF_CONFIG" ] && . ${ITF_CONFIG}

        ip route del default dev ${INTERFACE} > /dev/null 2>&1
        ip route flush table cache dev ${INTERFACE}
        ip address flush dev ${INTERFACE} > /dev/null 2>&1
        ip link set ${INTERFACE} down > /dev/null 2>&1
        sleep 2
        ip link set dev ${INTERFACE} up > /dev/null 2>&1
        if [ -z "$ETHIPADDR" ]; then
            pkill -f "udhcpc.*${INTERFACE}"
            sleep 1
            udhcpc -R -b -p /var/run/udhcpc.${INTERFACE}.pid -i ${INTERFACE} 2>/dev/null
        else
            ETHNETMASK_CIDR=$(mask2cidr "$ETHNETMASK")
            [ -z "$ETHBROADCAST" ] && ETHBROADCAST="+"
            ip addr add "${ETHIPADDR}/${ETHNETMASK_CIDR}" broadcast ${ETHBROADCAST} dev ${INTERFACE} > /dev/null 2>&1
            ip route add default via "${ETHGATEWAY}" dev ${INTERFACE} > /dev/null 2>&1
        fi
        return 0
        ;;
    wwan[0-9])
        Log "Restart interface $INTERFACE"

        if [ "${INTERFACE}" == "wwan0" ] && ! checkInterfaceStatus wwan0 && checkInterfaceStatus wwan1; then
            switchWwanInterface wwan0 wwan1
            return 0
        elif [ "${INTERFACE}" == "wwan1" ] && ! checkInterfaceStatus wwan1 && checkInterfaceStatus wwan0; then
            switchWwanInterface wwan1 wwan0
            return 0
        fi

        kill $(ps waux | grep udhcpc | awk '/[w]wan/{print $2}')

        APN_ADDR=$(grep LTE_APN "$ROOTACT/usr/etc/lrr/cellular.ini" | cut -f2 -d'=')
        APN_USER=$(grep LTE_USER "$ROOTACT/usr/etc/lrr/cellular.ini" | cut -f2 -d'=')
        APN_PASSWORD=$(grep LTE_PASSWORD "$ROOTACT/usr/etc/lrr/cellular.ini" | cut -f2 -d'=')
        APN_PIN=$(grep LTE_PIN "$ROOTACT/usr/etc/lrr/cellular.ini" | cut -f2 -d'=')

        if [ -n "${APN_ADDR}" ]; then
            NOW=$(date +%s)

            PROFILE_COUNT=$(konaLTEmodem.py -c 'AT+CGDCONT?' | grep '^\+CGDCONT' | wc -l)
            CURRENT_APN=$(konaLTEmodem.py -c 'AT+CGDCONT?' | grep "\"${APN_ADDR}\"")


            if [ ${PROFILE_COUNT} -eq 0 ] || [ -z "${CURRENT_APN}" ]; then
                 /etc/init.d/wwan0-startup-rc stop
                 sleep 5

                 /usr/bin/konaLTEmodem.py -c "AT+CGDCONT=1,\"IP\",\"$APN_ADDR\",\"0.0.0.0\",0,0"

                 if [ -n "${APN_USER}" ] && [ -n "${APN_PASSWORD}" ]; then
                     /usr/bin/konaLTEmodem.py -c "AT\$GCPDPP=1,2,\"$APN_PASSWORD\",\"$APN_USER\""
                 fi

                 sleep 5

                 /etc/init.d/wwan0-startup-rc start
            elif [ ${PROFILE_COUNT} -gt 1 ]; then
                /etc/init.d/wwan0-startup-rc stop
                sleep 5

                first_apn_kept=0
                for p in $(konaLTEmodem.py -c 'AT+CGDCONT?' | grep '^\+CGDCONT' | grep "\"${APN_ADDR}\"" | awk -F'[:,]' '/\+CGDCONT/ {print $2}' | xargs); do
                    if [ ${first_apn_kept} -eq 0 ]; then
                        first_apn_kept=1
                    else
                        konaLTEmodem.py -c "AT+CGDCONT=${p}"
                    fi
                done

                /usr/bin/konaLTEmodem.py -c "AT+CGDCONT=1,\"IP\",\"$APN_ADDR\",\"0.0.0.0\",0,0"

                if [ -n "${APN_USER}" ] && [ -n "${APN_PASSWORD}" ]; then
                     /usr/bin/konaLTEmodem.py -c "AT\$GCPDPP=1,2,\"$APN_PASSWORD\",\"$APN_USER\""
                fi

                sleep 5

                /etc/init.d/wwan0-startup-rc start
            else
                [ -n "${APN_PIN}" ] && /usr/bin/konaLTEmodem.py -c "AT+CPIN=$APN_PIN"

                [ -e "/dev/cdc-wdm0" ] && qmicli -d /dev/cdc-wdm0 --wds-start-network="${APN_ADDR}" --client-no-release-cid
                [ -e "/dev/cdc-wdm1" ] && qmicli -d /dev/cdc-wdm1 --wds-start-network="${APN_ADDR}" --client-no-release-cid

                sleep 5

                if ! monit status cm-modem | grep -q Monitored; then
                    /etc/init.d/wwan0-startup-rc start
                fi
            fi

            [ -e "/dev/cdc-wdm0" ] && udhcpc -R -b -p /var/run/udhcpc.wwan0.pid -i wwan0
            [ -e "/dev/cdc-wdm1" ] && udhcpc -R -b -p /var/run/udhcpc.wwan1.pid -i wwan1

        fi

        return 0
        ;;

    wlan[0-9])
        Log "Restart interface $INTERFACE"
        killall wpa_supplicant
        sleep 1
        ip link set "$INTERFACE" down >/dev/null 2>&1
        sleep 1
        ip link set "$INTERFACE" up >/dev/null 2>&1
        sleep 1
        wpa_supplicant -B -i "$INTERFACE" -c /etc/wpa_supplicant.conf
        sleep 5
        udhcpc -i "$INTERFACE"
        return 0
        ;;
    *)
        Log "Cannot restart interface. Not supported by the script"
        return 1
        ;;
esac
}
