#! /usr/bin/python3

"""Sample server for CSCI 373.001 class
"""

# CSCI 373.001 starter

import re
import socket
import _thread
from compare_and_swap_register import CompareAndSwapRegister

PORT = 33333

PATTERN = re.compile(r'^\s*(\d+)\s+(\d+)\s*\n$')

def handle_client(reg, strm, addr):
    """ Routine to process one connection"""
    print("Connection open:  ", addr)
    instrm = strm.makefile('r')
    outstrm = strm.makefile('w')
    line = instrm.readline()
    while line:
        print("{0} -> {1}".format(addr, line[:-1]))
        mat = PATTERN.match(line)
        if mat is None:
            repl = 'Bad Syntax'
        else:
            oldval = int(mat.group(1))
            newval = int(mat.group(2))
            repstr = reg.compare_and_swap(oldval, newval)
            repl = str(repstr)
        outstrm.write(repl+'\n\r')
        outstrm.flush()
        line = instrm.readline()
    instrm.close()
    outstrm.close()
    strm.close()
    print("Connection closed: ", addr)

def compare_and_swap_server():
    """Compare and Swap networked server"""
    reg = CompareAndSwapRegister()

    server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    try:
        server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        server_socket.bind(('', PORT))
        server_socket.listen(1)

        while True:
            strm, addr = server_socket.accept()
            _thread.start_new_thread(handle_client, (reg, strm, addr))
    except KeyboardInterrupt:
        print('Exiting')
        server_socket.close()


if __name__ == "__main__":
    compare_and_swap_server()
