import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.stream.Collectors;

import org.bukkit.Bukkit;
import org.bukkit.Statistic;
import org.bukkit.entity.Player;
import org.bukkit.plugin.java.JavaPlugin;

public class MCbot extends JavaPlugin {

    @Override
    public void onEnable() {
        getLogger().info("MCbot enabled");
        // Start your socket server here
        startSocketServer();
    }

    @Override
    public void onDisable() {
        getLogger().info("MCbot disabled");
        // Stop your socket server here if needed
    }

    private void startSocketServer() {
        // Implement your socket server logic here
        // Example: Create a new thread for socket server
        new Thread(() -> {
            try {
                try (// Create a socket server on port 8888
                ServerSocket serverSocket = new ServerSocket(8888)) {
                    getLogger().info("Socket server started on port 8888");

                    while (true) {
                        // Accept incoming client connections
                        Socket clientSocket = serverSocket.accept();
                        getLogger().info("Client connected: " + clientSocket.getInetAddress());

                        // Handle client communication (e.g., read commands and send responses)
                        handleClient(clientSocket);
                    }
                }
            } catch (IOException e) {
                getLogger().severe("Error starting socket server: " + e.getMessage());
            }
        }).start();
    }

    private void handleClient(Socket clientSocket) {
        // Implement logic to handle client communication here
        // Example: Read commands from client and send responses
        try {
            BufferedReader reader = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
            PrintWriter writer = new PrintWriter(clientSocket.getOutputStream(), true);

            // Read command from client
            String command = reader.readLine();
            getLogger().info("Received command from client: " + command);

            // Process command and send response
            String response = processCommand(command);
            writer.println(response);

            // Close client connection
            clientSocket.close();
        } catch (IOException e) {
            getLogger().severe("Error handling client: " + e.getMessage());
        }
    }

    private String processCommand(String command) {
        // Implement logic to process commands here
        // Example: If command is "!players", return player list from Minecraft server
        if (command.equals("!players")) {
            // Use Spigot API to get player list
            String playerList = String.join(", ", getServer().getOnlinePlayers().stream()
                    .map(player -> player.getName())
                    .collect(Collectors.toList()));
            return "Players online: " + playerList;
        }
        if (command.startsWith("!exp ")) {
        // Extract player name from command
        String playerName = command.substring(5); // Assuming "!exp " is 5 characters long
        
            // Get player object by name
            Player player = Bukkit.getPlayer(playerName);
            if (player != null) {
                // Get player's experience level
                int expLevel = player.getLevel();
                return playerName + "'s experience level: " + expLevel;
            } else {
                return "Player not found: " + playerName;
            }
        }
        if (command.startsWith("!deaths ")) {
            //Extract player name from command
            String playerName = command.substring(8); // Assuming "!deaths " is at least 8 chars long
            
            // Get Player object by name
            Player player = Bukkit.getPlayer(playerName);
            if(player != null) {
                // Get Player's Death Count
                int deaths = player.getStatistic(Statistic.DEATHS);
                return playerName + "has died" + deaths + "times";
            }else {
                return "Player not found: " + playerName;
            }
        }
           
        // Add more command processing logic as needed
        return "Unknown command: " + command;
    }
}
