import socket
import threading
import time

HOST : str = "127.0.0.1"
PORT : int = 3001
CLIENTS = []

server = socket.socket(socket.AF_INET, socket.SOCK_STREAM);
server.bind((HOST, PORT))
server.listen(3)
print(f"Listening on server on host {HOST} on port {PORT}")

def connectAsClient(host=HOST, port=PORT):
    clientSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    clientSocket.connect((host, port))
    handleClient(clientSocket)

def handleClient(client):
    CLIENTS.append(client)
    print(len(CLIENTS))

def  broadcastMessage(message="Hello World", clientList=CLIENTS):
    numberOfClients = 0
    message = message.encode('utf-8')
    for client in clientList:
        numberOfClients += 1
        client.send(message)
        print(f"message sent from client {numberOfClients} :  {message}")

def  listenToBroadcastMessage(clients=CLIENTS):  # Remove unnecessary arguments
    while True:
        try:
            for client in clients:
                receivedMessage = client.recv(1024)
                receivedMessage = receivedMessage.decode('utf-8')
                print(f"Message received: {receivedMessage}")
        except ConnectionResetError:
            print("ConnectionResetError occurred")


clientThread = threading.Thread(target=connectAsClient).start()
time.sleep(2)
clientThread = threading.Thread(target=connectAsClient).start()
time.sleep(2)
clientThread = threading.Thread(target=connectAsClient).start()
time.sleep(2)
clientThread = threading.Thread(target=connectAsClient).start()
time.sleep(2)

broadcastMessageToClients = threading.Thread(target=broadcastMessage, args=(("Hello World ",CLIENTS))).start()


time.sleep(5)
listenToBroadcaset = threading.Thread(target=listenToBroadcastMessage).start()

while True:
    client, addr = server.accept()
    print(f"{client} is connected")