class ControllerManager(threading.Thread):
    def __init__(self):
        threading.Thread.__init__(self)
        self.daemon = True
        self.queue = queue.PriorityQueue()
        self.nodes_info = [('192.168.1.209', 9998), ('192.168.1.208', 9998),
                           ('192.168.1.207', 9998)]
        self.Nodes = []
        self.running = True
        self.experiment = None
        self.db = DatabaseConnection()
        self.cordy = None
        self.setup_node()

    def setup_node(self):
        for i in self.nodes_info:
            node = Node(i[0], i[1])
            node.start()
            self.Nodes.append(node)

    def set_cordy(self):
        for i in self.Nodes:
            if i.zigbee_cordy:
                self.cordy = i

    def run(self):
        time.sleep(5)
        self.set_cordy()
        print("[+] ControllerManager Started")
        while self.running:
            self.experiment = self.get_Experiment()
            exp_info = self.db.get_Experiment_info(self.experiment.id)
            if (exp_info['status'] == 'done'):
                print("Experiment Already Done")
                continue
            self.db.change_to_running(self.experiment.id)
            self.experiment.duration = int(exp_info['duration'])
            self.experiment.protocol = exp_info['protocol']
            self.experiment.title = exp_info['title']
            print(self.experiment.title)
            print(self.experiment.protocol)
            print(self.experiment.duration)
            self.experiment.nodes = self.db.get_Node_info(self.experiment.id)
            self.experiment.scenario = self.db.get_scenario_info(
                self.experiment.id)
            #print(self.experiment.nodes)
            #print(self.experiment.scenario)
            #print(exp_info)
            #self.setup_experiment()
            self.sensor()
            self.read_start()
            self.db.change_to_done(self.experiment.id)

    def setup_experiment(self):
        for node in self.experiment.nodes:
            for i in self.Nodes:
                if node['name'] == i.name:
                    if node['protocol'] == 'cord' and i.zigbee_cordy:
                        print(i.name + ": is coordinator")
                    elif node['protocol'] == 'cord' and not i.zigbee_cordy:
                        i.change_Zigbee_cord()
                    elif node['protocol'] == 'router' and i.zigbee_cordy:
                        i.change_Zigbee_route()
                    else:
                        print(i.name + ": is router")

    def read_start(self):
        print(self.experiment.scenario)
        for path in self.experiment.scenario:
            node1 = None
            node2 = None
            node1_id = path['en1']
            node2_id = path['en2']
            pathId = path['pid']
            print("Node1 ID : " + str(node1_id))
            print("Node2 ID : " + str(node2_id))
            node1_name = self.db.get_node_name(node1_id)
            node2_name = self.db.get_node_name(node2_id)
            print("node1 name " + str(node1_name))
            print("node2 name " + str(node2_name))
            for node in self.Nodes:
                if node.name == node1_name:
                    node1 = node
                    print(node1)
                if node.name == node2_name:
                    node2 = node
                    print(node2)
            if node2:
                long_addr = node2.zigbee_addr_long
                short_addr = node2.zigbee_addr_short
                if node1:
                    node1.assign_zigbee_address(long_addr, short_addr)
                    node1.pid = pathId
                    node1.eid = self.experiment.id
                    node2.clear_buffer()
                    node1.get_indi = True
                    while node1.get_indi:
                        time.sleep(1)
                    node2.pid = pathId
                    node2.eid = self.experiment.id
                    node2.sender_name = node1_name
                    node2.get_packs = True
                    while node2.get_packs:
                        time.sleep(1)

            else:
                print('node2 not found')

    def sensor(self):
        for node in self.experiment.nodes:
            node_name = node['name']
            print("Node: " + node['name'] + " Temp:" +
                  str(node['temperature']) + " Humdiry " +
                  str(node['humdity']))
            for anode in self.Nodes:
                if anode.name == node_name:
                    bnode = anode
                    print(bnode)
                    bnode.temp_interval = int(node['temperature'])
                    bnode.humdity_interval = int(node['humdity'])
                    bnode.duration = int(self.experiment.duration)

    def add_Experiment(self, id, priority=1):
        self.queue.put(Experiment(id, priority))

    def parse(self):
        pass

    def get_Experiment(self):
        return self.queue.get()

    def close(self):
        self.running = False