package nl.andrewlalis.aos_server;

import nl.andrewlalis.aos_core.model.Player;
import nl.andrewlalis.aos_core.net.chat.ChatMessage;
import nl.andrewlalis.aos_core.net.chat.ChatType;
import nl.andrewlalis.aos_core.net.chat.PlayerChatMessage;
import nl.andrewlalis.aos_server.command.GunsCommand;
import nl.andrewlalis.aos_server.command.ResetCommand;
import nl.andrewlalis.aos_server.command.chat.ChatCommand;
import nl.andrewlalis.aos_server.command.chat.GunCommand;
import nl.andrewlalis.aos_server.command.chat.KillDeathRatioCommand;
import nl.andrewlalis.aos_server.command.chat.TeamChatCommand;

import java.util.Arrays;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * This chat manager is responsible for dealing with incoming player chats and
 * potentially executing commands, or simply relaying the chats on to the rest
 * of the players.
 */
public class ChatManager {
	private final Server server;
	private final Map<String, ChatCommand> chatCommands;

	public ChatManager(Server server) {
		this.server = server;
		this.chatCommands = new ConcurrentHashMap<>();
		this.chatCommands.put("gun", new GunCommand());
		this.chatCommands.put("reset", new ResetCommand(server));
		this.chatCommands.put("guns", new GunsCommand(server));
		this.chatCommands.put("kd", new KillDeathRatioCommand());
		this.chatCommands.put("t", new TeamChatCommand());
	}

	public void handlePlayerChat(ClientHandler handler, Player player, ChatMessage msg) {
		if (player == null) return;
		if (msg.getText().startsWith("/")) {
			String[] words = msg.getText().substring(1).split("\\s+");
			if (words.length == 0) return;
			String command = words[0];
			ChatCommand cmd = this.chatCommands.get(command);
			if (cmd != null) {
				cmd.execute(handler, player, Arrays.copyOfRange(words, 1, words.length));
			}
		} else {
			this.server.broadcastMessage(new PlayerChatMessage(player.getId(), player.getName() + ": "+ msg.getText(), ChatType.PUBLIC_PLAYER_CHAT));
		}
	}
}
