import socket
import threading

def send_msg(conn, text):
    data = f"{len(text):03d}{text}"
    conn.sendall(data.encode("ascii"))

def recv_msg(conn):
    header = conn.recv(3)
    if not header:
        return None
    length = int(header.decode("ascii"))
    text = conn.recv(length).decode("ascii")
    return text

def handle_client(conn, addr):
    print(f"Client connected: {addr}")

    # Wait for NAME command
    while True:
        msg = recv_msg(conn)
        if msg is None:
            conn.close()
            return
        if msg.startswith("NAME"):
            name = msg[4:]
            send_msg(conn, f"Hi {name}")
            break

    # Dialog loop
    while True:
        msg = recv_msg(conn)
        if msg is None:
            break
        send_msg(conn, f"You said: {msg}")

    conn.close()
    print(f"Client disconnected: {addr}")

def run_server():
    s = socket.socket()
    s.bind(("127.0.0.1", 5000))
    s.listen(5)
    print("Server listening on port 5000...")

    while True:
        conn, addr = s.accept()
        thread = threading.Thread(target=handle_client, args=(conn, addr), daemon=True)
        thread.start()

if __name__ == "__main__":
    run_server()
