#! /usr/bin/python3
""" Concurrent connections JSON echo
"""
import socket
import sys
import json
import os

def echo_json(json_socket):
    """Echo some JSON
    """
    in_stream = json_socket.makefile("r")
    out_stream = json_socket.makefile("w")
    # such a hack.... Keep going until it fails
    try:
        while True:
            json_line = in_stream.readline().strip()
            print("Input line --> {0}".format(json_line))
            receive_object = json.loads(json_line)
            print("Object --> {0}".format(receive_object))
            reply_line = json.dumps(receive_object)
            out_stream.write("{0}\r\n".format(reply_line))
            out_stream.flush()
    except Exception:
        # You'll get here on end-of-connection
        pass
    in_stream.close()
    out_stream.close()
    # This will close the client socket
    json_socket.close()
    return 0

def echo_json_server(json_port):
    echo_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    try:
        echo_socket.bind(("", json_port))
    except socket.error as message:
        print("Unable to open port {} : {}".format(json_port, message))
        return 1
    echo_socket.listen(5)
    while True:
        connected_socket, address_socket = echo_socket.accept()
        print("Connected to {0}\n".format(address_socket))
        process_id = os.fork()
        if process_id == 0:
            # child process
            echo_socket.close()
            echo_json(connected_socket)
            # ZZZZZZZZZZ
            sys.exit(0)
        else:
            # parent process
            print("Started child process {0}".format(process_id))
            connected_socket.close()
    # This will close the server socket
    echo_socket.close()
    return 0

if __name__ == "__main__":
    if len(sys.argv) <= 1:
        remote_port = 3210
    else:
        try:
            remote_port = int(sys.argv[1])
        except ValueError:
            print("Invalid port number: {0}".format(sys.argv[1]))
            sys.exit(2)
    print("opening {0}".format(remote_port))
    server_rc = echo_json_server(remote_port)
    sys.exit(server_rc)
