/*
Test Tiny402 WiFi Connectivity
Recieve 1 Byte and close connection
*/

import java.io.InputStream;
import java.io.OutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.InetAddress;
import java.util.concurrent.atomic.AtomicInteger;

public class TCPServerWiFi_Rx1Tx4 {
  public static void main(String[] args) {
        int port = 9090; // Server port number

        AtomicInteger atomicCounter = new AtomicInteger(0);
        
		try (ServerSocket serverSocket = new ServerSocket(port, 50, InetAddress.getByName("0.0.0.0"))) {
            System.out.println("TCP Server started on port " + port);
            System.out.println("Waiting for client connection to receive 1 byte and transmit an integer counter of 4 bytes...");
            
            while (true) {
                // Accept client connection
                try (Socket clientSocket = serverSocket.accept()) {
                    clientSocket.setSoTimeout(20000);
					System.out.println("Client connected from: " + clientSocket.getInetAddress());
                    
					// Get input and output streams
                    InputStream inputStream = clientSocket.getInputStream();
                    OutputStream outputStream = clientSocket.getOutputStream();
					
                    // Read a single byte from client
                    int receivedByte = inputStream.read();
                    if (receivedByte == -1) {
                        System.out.println("Client closed connection without sending data");
                        continue;
                    }
					System.out.println("Received byte from client: " + receivedByte + 
                                     " (0x" + String.format("%02X", receivedByte) + ")");
                    
					int count= atomicCounter.incrementAndGet(); 
					
	                    // Send back 4-byte integer (big-endian format)
                    byte[] intBytes={'A','B','C','D'};

                    
                    outputStream.write(intBytes);
                    outputStream.flush();
                    
                    System.out.println("Sent back integer: " + count + 
                                     " (bytes: " + String.format("%02X %02X %02X %02X", 
                                     intBytes[0], intBytes[1], intBytes[2], intBytes[3]) + ")");
					
                    
                } catch (IOException e) {
                    System.err.println("Error handling client: " + e.getMessage());
                }
            }
            
        } catch (IOException e) {
            System.err.println("Failed to start server: " + e.getMessage());
        }
    }
}