<!DOCTYPE html>
<html>
<head>
    <title>Socket.IO Chat</title>
    <script src="https://cdn.socket.io/4.7.5/socket.io.min.js"></script>
    <style>
        body {
            font-family: Arial, sans-serif;
            max-width: 800px;
            margin: 0 auto;
            padding: 20px;
        }
        #chat-container {
            border: 1px solid #ccc;
            padding: 10px;
            height: 400px;
            overflow-y: scroll;
            margin-bottom: 10px;
        }
        #user-list {
            width: 200px;
            float: right;
            border: 1px solid #ccc;
            padding: 10px;
            margin-left: 10px;
        }
        #message-form {
            display: flex;
            gap: 10px;
        }
        #message-input {
            flex-grow: 1;
            padding: 5px;
        }
        #username-container {
            margin-bottom: 10px;
        }
        .message {
            margin: 5px 0;
        }
        .error {
            color: red;
        }
    </style>
</head>
<body>
    <div id="username-container">
        <input type="text" id="username-input" placeholder="Enter your username">
        <button onclick="setUsername()">Set Username</button>
    </div>
    <div id="user-list">
        <h3>Connected Users</h3>
        <ul id="users"></ul>
    </div>
    <div id="chat-container"></div>
    <div id="message-form">
        <input type="text" id="message-input" placeholder="Type a message...">
        <button onclick="sendMessage()">Send</button>
    </div>

    <script>
        const socket = io();
        
        socket.on('connect', () => {
            console.log('Connected to server');
        });

        socket.on('message', (data) => {
            const chatContainer = document.getElementById('chat-container');
            const messageElement = document.createElement('div');
            messageElement.className = 'message';
            messageElement.innerHTML = `<strong>${data.username}</strong> (${new Date(data.timestamp).toLocaleTimeString()}): ${data.message}`;
            chatContainer.appendChild(messageElement);
            chatContainer.scrollTop = chatContainer.scrollHeight;
        });

        socket.on('user_list', (users) => {
            const userList = document.getElementById('users');
            userList.innerHTML = '';
            users.forEach(user => {
                const li = document.createElement('li');
                li.textContent = user;
                userList.appendChild(li);
            });
        });

        socket.on('error', (data) => {
            const chatContainer = document.getElementById('chat-container');
            const errorElement = document.createElement('div');
            errorElement.className = 'error';
            errorElement.textContent = data.message;
            chatContainer.appendChild(errorElement);
        });

        function setUsername() {
            const usernameInput = document.getElementById('username-input');
            const username = usernameInput.value.trim();
            if (username) {
                socket.emit('set_username', { username });
                usernameInput.disabled = true;
                document.querySelector('#username-container button').disabled = true;
            }
        }

        function sendMessage() {
            const messageInput = document.getElementById('message-input');
            const message = messageInput.value.trim();
            if (message) {
                socket.emit('message', { message });
                messageInput.value = '';
            }
        }

        // Allow sending message with Enter key
        document.getElementById('message-input').addEventListener('keypress', (e) => {
            if (e.key === 'Enter') {
                sendMessage();
            }
        });
    </script>
</body>
</html>