#!/usr/bin/env python
import paho.mqtt.client as mqtt
import json
import time
import sys
import argparse
from ruuvitag_sensor.ruuvi import RuuviTagSensor


def closeconnection():
    global client
    client.loop_stop()
    client.disconnect()
    return False


def send_data(found_data, mac):
    global client, update_time

    device_name = "{}-{}".format(tb_device_prefix, mac.replace(":", ""))
    sensor_data = {}
    sensor_data['values'] = {}

    if not device_name in update_time:
        update_time[device_name] = 0

    if update_time[device_name] + interval < time.time():
        try:
            update_time[device_name] = time.time()
            sensor_data['ts'] = int(time.time() * 1000)
            
            sensor_data['values']['temperature'] = found_data['temperature']
            sensor_data['values']['humidity'] = found_data['humidity']
            sensor_data['values']['pressure'] = found_data['pressure']

            #only gets acceleration and battery data if ruuvitag is in B mode
            if 'battery' in found_data:
                sensor_data['values']['acceleration'] = int(found_data['acceleration'])
                sensor_data['values']['battery'] = found_data['battery']
            print("sending", sensor_data)
            client.publish('v1/gateway/telemetry', json.dumps({device_name: [sensor_data]}))
        except:
            print("failed to read/send data from ruuvitag", mac)

if __name__ == "__main__":
    interval = 10
    macs = []
    tb_device_prefix = "ruuvitag"
    #macs = ['AA:BB:CC:DD:EE:FF', 'F1:F2:F3:F4:F5:F6']


    parser = argparse.ArgumentParser()
    parser.add_argument(
        "-at", help="access token for the mqtt gateway in thingsboard", type=str, required=True)
    parser.add_argument("-ip", help="ip to thingsboard", type=str, required=True)
    args = parser.parse_args()
    update_time = {}

    client = mqtt.Client()
    client.username_pw_set(username=args.at)
    client.connect(args.ip, 1883, 60)
    client.loop_start()
    ruuvitags = []
    activetags = []
    try:
        while True:
            previoustags = activetags
            ruuvitagdata = RuuviTagSensor.get_data_for_sensors(macs, 10)
            activetags = []
            for mac in ruuvitagdata:
                if mac not in previoustags:
                    print('connecting', mac)
                    client.publish('v1/gateway/connect', json.dumps({'device': "{}-{}".format(tb_device_prefix, mac.replace(":", ""))}))
                activetags.append(mac)
                #print(ruuvitagdata[mac])
                send_data(ruuvitagdata[mac], mac)

            for previoustag in previoustags:
                if previoustag not in activetags:
                    print('disconnecting', previoustag)
                    client.publish('v1/gateway/disconnect', json.dumps({'device': "{}-{}".format(tb_device_prefix.replace(":", ""))}))
    except KeyboardInterrupt:
        print('exiting...')