#!/bin/bash

#local settings
local_host=127.0.0.1
local_port=1883
local_topic="application/+/device/+/event/up"


#remote server settings
forwarder_enable=$(uci -q get forwarder.mqtt.enbale)
remote_host=$(uci -q  get forwarder.mqtt.address)
remote_port=$(uci -q get forwarder.mqtt.port)
remote_username=$(uci -q get forwarder.mqtt.user)
remote_password=$(uci -q get forwarder.mqtt.passwd)
remote_topic=$(uci -q get forwarder.mqtt.topic)
remote_clientid=$(uci -q get forwarder.mqtt.clientid)
remote_cafile=$(uci -q get forwarder.mqtt.ca_enable)  # Ca
remote_certfile=$(uci -q get forwarder.mqtt.cert_enable)  # crt
remote_keyfile=$(uci -q get forwarder.mqtt.key_enable)  # key
PERSISTENT_FILE="/usr/local/failed_messages.txt"


if [[ ! -z $remote_username ]]; then
    parameters="-u $remote_username"
fi

if [[ ! -z $remote_clientid ]]; then
    parameters="-i $remote_clientid"
fi

if [[ ! -z $remote_password ]]; then
    parameters="$parameters -P $remote_password"
fi

if [[ $remote_cafile != null ]]; then
    parameters="$parameters --cafile /usr/local/dragino/chirpstack/ca/$remote_cafile"
fi

if [[ $remote_certfile != null ]]; then
    parameters="$parameters --cert /usr/local/dragino/chirpstack/cert/$remote_certfile"
fi

if [[ $remote_keyfile != null ]]; then
    parameters="$parameters --key /usr/local/dragino/chirpstack/key/$remote_keyfile"
fi

resent_data()
{
if [[ -s $PERSISTENT_FILE ]]; then
    while IFS= read -r failed_message; do
        mosquitto_pub -h "$remote_host" -p "$remote_port"  $parameters -t "$remote_topic" -m "$failed_message" # --insecure --property "publish" "message-expiry-interval" 259200
        if [[ $(echo $?) -ne 0 ]]; then
            return
        fi
        escaped_message=$(printf '%s\n' "$failed_message" | sed 's/[\/&]/\\&/g')
        sed -i "/$escaped_message/d" "$PERSISTENT_FILE"
    done < "$PERSISTENT_FILE"
    #truncate -s 0 "$PERSISTENT_FILE"
fi
}
publish_data()
{
    local message_publish=$1
    #Forward all up to remote server.
    #mosquitto_pub -h "$remote_host" -p "$remote_port" --cafile "$remote_cafile" --certfile "$remote_certfile" --keyfile "$remote_keyfile" -u "$remote_username" -P "$remote_password" -t "$remote_topic" -m "$message" --insecure --property "publish" "message-expiry-interval" 259200
    mosquitto_pub -h "$remote_host" -p "$remote_port" $parameters -t "$remote_topic" -m "$message_publish"   --insecure --property "publish" "message-expiry-interval" 259200  -r
    if [[ $(echo $?) -ne 0 ]]; then
        echo -n "$message_publish" >> "$PERSISTENT_FILE"
    else
        resent_data
    fi

}

#Subscribe to all local up messages
mosquitto_sub -h "$local_host" -p "$local_port" -t "$local_topic" | while read message; do
message_address=$(echo "$message" | jq -r '.deviceInfo.devEui')
message_object=$(echo "$message" | jq -c '.object')
message_date=$(echo "$message" | jq -r '.time')
message_fcnt=$(echo "$message" | jq -r '.fCnt')
message_fport=$(echo "$message" | jq -r '.fPort')
message=$(cat <<EOF
{ "DevEUI": "$message_address", "data": $message_object, "time": "$message_date", "fcnt": "$message_fcnt", "fport": "$message_fport" }
EOF
    )

publish_data "$message"

done
