import network
from network import ESPNOW
import time
# from lib.rtc_time import RTCTime

import struct

w = network.WLAN()
self_mac, sta = w.mac()

class Forte_ESPNOW:    
    def __init__(self):
        ESPNOW.init()
        p = ESPNOW.add_peer("58CF7904412C") # TODO: make management of peers dynamic (line 37)
        ESPNOW.on_recv(espnow_recv)

def espnow_respond(mac):
    msg = struct.pack("<6sl", self_mac, time.time() * 1000)
    print(time.time() * 1000)
    ESPNOW.send(mac, msg)
    print("response sent")

def espnow_recv(result):
    print("message recv")
    mac, peer, msg = result

    data = bytes_to_data(msg)
    try:
        print(data["amountData"])
        print(data["timestamp"])
        print(data["data"])

    except Exception as error:
        print(error)

    # if(result not in ESPNOW.get_peers()):
    #     ESPNOW.add_peer(mac)
    espnow_respond(mac)

def bytes_to_data(msg):
    # turn bytes from message into 22-tuple of integers(identifiers), floats(values), integer(amount) and long(timestamp)
    data = struct.unpack("<10i10fil", bytes(msg))
    amountData = data[20]
    timestamp = data[21]
    identifiers = data[0:amountData]
    values = data[10 : (10 + amountData)]
    return {
        "amountData": amountData,
        "timestamp": timestamp,
        "data": dict(zip(identifiers, values)),
    }