#!/usr/bin/env python3

import os
import sys
import socket
import json
from socket import socket, AF_INET, SOCK_DGRAM

MY_PORT = 5999
CONTROLLER_PORT = 1500

def getMyIPaddress():
    sx = socket(AF_INET, SOCK_DGRAM)
    sx.connect(("8.8.8.8", 80))
    return sx.getsockname()[0]

def sendMessage(ip, port, data):
    """ send any message to an ip+port tuple
    """
    send_socket = socket(AF_INET,SOCK_DGRAM)
    send_socket.sendto(data.encode('utf8'), (ip, port))

def getModuleList(target_ip, notify_modules_found):
    """ send a MODULE_LIST_REQ message
        wait for MODULE_INFO messages
        replies with list of tuples (modulename,port) or None
    """
    result = []
    reply_to_ip = getMyIPaddress()
    recv_socket = socket(AF_INET,SOCK_DGRAM)
    recv_socket.bind(('', MY_PORT))
    msg = f'{{"MessageType":"MODULE_LIST_REQ", "IP":"{reply_to_ip}", "Port":{MY_PORT}, "Unfiltered":1 }}'
    sendMessage(target_ip, CONTROLLER_PORT, msg)
    while True:
        try:
            recv_socket.settimeout(5)
            msg, addr = recv_socket.recvfrom(32768)
            msgAsString = msg.decode('utf8')
            msgAsJson = json.loads(msgAsString)
            normal_eof = msgAsJson.get("EOF", "0")
            if normal_eof == "1":
                break
            name = msgAsJson.get("MODULE", None)
            port = msgAsJson.get("PORT", None)
            if name and port:
                result.append((name, int(port)))
        except Exception as e:
            print ("getModuleList: Exception:%s" %(e,))
            break
    notify_modules_found(target_ip, result)

def main():
    """ simple test
    """
    def notify_modules_found(target_ip, moduleList):
        print(target_ip)
        print(moduleList)
    
    # Argument check
    if len(sys.argv)<2:
        sys.stderr.write('usage:' + sys.argv[0] + ' htc_ip_address\n')
        sys.exit(2)
    target_ip_address = sys.argv[1]    

    # Do the work
    getModuleList(target_ip_address, notify_modules_found)

if __name__ == "__main__":
    main()
