#!/usr/bin/env python3

import socket
from time import sleep
import sys
import argparse
import threading

PORT = 3791

# Command Line Interface
parser = argparse.ArgumentParser()
parser.add_argument("-ip", dest="IP", required=True,
                    help="IP adress of the partner Peer")
parser.add_argument("-p --port", dest="port", type=int, default=PORT,
                    help="The port the other Peer is listening")

args = parser.parse_args()
IP = args.IP
PORT = args.port
print("trying to connect to peer @ %s : %i"%(IP,PORT))

# Set up socket
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.bind(("",3791))
sock.settimeout(2)
data = b""
addr = ()

# Set up the thread ecosystem
running = True
def user_input():
    global running
    while running:
        try:
            data = input("> ")
            sock.sendto(data.encode(), (IP,PORT))
        except (KeyboardInterrupt, SystemExit):
            running = False

def receiver():
    global running
    while running:
        sock.sendto(b"", (IP,PORT)) # keep alive packet
        try:
            data, addr = sock.recvfrom(512)
            if data != b"":
                print(data.decode()) 
        except socket.timeout:
            continue
        except (KeyboardInterrupt, SystemExit):
            running = False
           

thUserInput = threading.Thread(target=user_input, name="User Input")
thReceiver  = threading.Thread(target=receiver, name="Receiver")

# Connect to the peer
try:
    while data != b"WAT" or addr!=(IP,PORT):
        sock.sendto(b"WAT", (IP,PORT))
        #print("sended WAT")
        try:
            data, addr = sock.recvfrom(50)
        except socket.timeout:
            #print("nothing received")
            continue
        print("%s\t%s"%(repr(addr),data.decode()))
        
    sock.sendto(b"WAT", (IP,PORT))
    #print("sended WAT")
    
except Exception as e:
    print("Failed: %s"%e)
    sock.close()
    sys.exit()

print("successfully connected")

#
sock.settimeout(.5)
thUserInput.start()
thReceiver.start()
try:
    while True: pass
        # one could actually do something useful here
except (KeyboardInterrupt, SystemExit):
    print("\n\n closing connection")
finally:
    running = False
    thUserInput.join()
    thReceiver.join()
    sock.sendto(b"BYE", (IP,PORT))
    sock.close()