import paho.mqtt.client as mqtt
import time

class Voter:
    '''
    This class acts to replicate sensor information with the network to come to a consensus
    of an activity occurrance. This is based upon research by Song et al. available at:
    https://ieeexplore.ieee.org/document/5484586

    The main advantage of this approach, as apposed to techniques such as by using zookeeper
    or consul, is it can be completely decentralised and so works without a central server,
    or needing to elect a central server. Additionally, it does not require all nodes
    to run a Zookeeper/Consul server instance, which were not designed for these constrained
    combat environments, which will fail if half the nodes fail, and also use a lot of resources
    for handling services not required by this task. 

    The original approach in the paper requires some previous training before sensing, so 
    that there is a probability of a given action based upon the previous set of actions.
    '''
    def __init__(self, on_vote):
        '''
        on_vote: Callback to get the required vote to broadcast.
        '''
        self.on_vote = on_vote
        self.client = mqtt.Client()

    def submit_vote(self):
        # Publish to swarm where all other voters will receive a vote.


        # Wait a certain amount of time for responses, then fuse the information.
        self.fuse_algorithm()

        # Need the error and number of timestamps since voting started to finalise the consensus.

    def fuse_algorithm(self):
        pass

    def on_message(self, client, userdata, message):
        pass
    
    