package tv.mineinthebox.essentials.commands;
import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.World;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.metadata.FixedMetadataValue;
import tv.mineinthebox.essentials.xEssentials;
import tv.mineinthebox.essentials.enums.PermissionKey;
import tv.mineinthebox.essentials.instances.Portal;
import tv.mineinthebox.essentials.interfaces.CommandTemplate;
public class CmdPortals extends CommandTemplate {
private final xEssentials pl;
public CmdPortals(xEssentials pl, Command cmd, CommandSender sender) {
super(pl, cmd, sender);
this.pl = pl;
}
private List<String> getPortals(String p) {
List<String> list = new ArrayList<String>();
for(Portal portal : pl.getConfiguration().getPortalConfig().getPortals().values()) {
if(portal.getPortalName().startsWith(p)) {
list.add(portal.getPortalName());
}
}
return list;
}
public List<String> onTabComplete(CommandSender sender, Command cmd, String[] args) {
if(cmd.getName().equalsIgnoreCase("portals")) {
if(sender.hasPermission(PermissionKey.CMD_PORTALS.getPermission())) {
if(args.length == 2) {
if(args[0].equalsIgnoreCase("delete")) {
return getPortals(args[1]);
} else if(args[0].equalsIgnoreCase("link")) {
return getPortals(args[1]);
}
} else if(args.length == 3) {
if(args[0].equalsIgnoreCase("link")) {
return getPortals(args[2]);
}
}
}
}
return null;
}
public boolean execute(CommandSender sender, Command cmd, String[] args) {
if(cmd.getName().equalsIgnoreCase("portals")) {
if(sender.hasPermission(PermissionKey.CMD_PORTALS.getPermission())) {
if(args.length == 0) {
showHelp();
} else if(args.length == 1) {
if(args[0].equalsIgnoreCase("help")) {
showHelp();
} else if(args[0].equalsIgnoreCase("list")) {
File dir = new File(pl.getDataFolder() + File.separator + "portals");
if(dir.isDirectory()) {
StringBuilder build = new StringBuilder();
HashMap<String, Portal> portals = new HashMap<String, Portal>(pl.getConfiguration().getPortalConfig().getPortals());
for(int i = 0; i < portals.values().size(); i++) {
Portal portal = portals.values().toArray(new Portal[portals.size()])[i];
if(i == portals.values().size()) {
build.append(ChatColor.GREEN + "(" + ChatColor.GRAY + portal.getPortalName() + ", isLinked="+ (portal.isLinked() ? ChatColor.GREEN + "true(" + ChatColor.GRAY + portal.getLinkedPortal().getPortalName() + ChatColor.GREEN + ")" : ChatColor.RED + "false") + ChatColor.GREEN + ")");
} else {
build.append(ChatColor.GREEN + "(" + ChatColor.GRAY + portal.getPortalName() + ", isLinked="+ (portal.isLinked() ? ChatColor.GREEN + "true(" + ChatColor.GRAY + portal.getLinkedPortal().getPortalName() + ChatColor.GREEN + ")" : ChatColor.RED + "false") + ChatColor.GREEN + ")" + ChatColor.GRAY + ", ");
}
}
sender.sendMessage(ChatColor.GOLD + ".oO___[portal list]____Oo.");
sender.sendMessage(build.toString());
} else {
sendMessage("no portals where found!");
}
}
} else if(args.length == 2) {
if(args[0].equalsIgnoreCase("create")) {
File f = new File(pl.getDataFolder() + File.separator + "portals" + File.separator + args[1] + ".yml");
if(!f.exists()) {
Player p = (Player) sender;
p.setMetadata("portal", new FixedMetadataValue(pl, args[1]));
sendMessage("now right click a block to set your first pos!");
} else {
sendMessage("this portal name does already exist!");
}
} else if(args[0].equalsIgnoreCase("remove")) {
try {
Portal portal = pl.getConfiguration().getPortalConfig().getPortal(args[1]);
portal.remove();
sendMessage("you have successfully removed portal " + args[1]);
} catch(Exception e) {
sendMessage("this portal does not exist!");
}
} else if(args[0].equalsIgnoreCase("teleport")) {
World w = Bukkit.getWorld(args[1]);
if(w instanceof World) {
if(sender instanceof Player) {
Player p = (Player) sender;
p.teleport(w.getSpawnLocation());
sendMessage("teleported to spawn location of the world " + w.getName());
} else {
getWarning(WarningType.PLAYER_ONLY);
}
} else {
sendMessage("world is not loaded.");
}
}
} else if(args.length == 3) {
if(args[0].equalsIgnoreCase("link")) {
try {
Portal portal1 = pl.getConfiguration().getPortalConfig().getPortal(args[1]);
Portal portal2 = pl.getConfiguration().getPortalConfig().getPortal(args[2]);
portal1.linkPortal(portal2.getPortalName(), true);
sendMessage("you have successfully linked portal " + portal1.getPortalName() + " to " + portal2.getPortalName());
} catch(Exception e) {
sendMessage("one of the portals has a invalid name!");
}
}
}
} else {
getWarning(WarningType.NO_PERMISSION);
}
}
return false;
}
@Override
public void showHelp() {
sender.sendMessage(ChatColor.GOLD + ".oO___[portals help]___Oo.");
sender.sendMessage(ChatColor.RED + "Admin: " + ChatColor.GRAY + "/portals help " + ChatColor.WHITE + ": shows help");
sender.sendMessage(ChatColor.RED + "Admin: " + ChatColor.GRAY + "/portals list " + ChatColor.WHITE + ": shows a list of all portal names");
sender.sendMessage(ChatColor.RED + "Admin: " + ChatColor.GRAY + "/portals teleport <world> " + ChatColor.WHITE + ": teleports to the spawn point of a other world.");
sender.sendMessage(ChatColor.RED + "Admin: " + ChatColor.GRAY + "/portals create <portal-name> " + ChatColor.WHITE + ": creates a selection and adress a name/id to it");
sender.sendMessage(ChatColor.RED + "Admin: " + ChatColor.GRAY + "/portals delete <portal-name> " + ChatColor.WHITE + ": delete a portal");
sender.sendMessage(ChatColor.RED + "Admin: " + ChatColor.GRAY + "/portals link <portal1> <portal2> " + ChatColor.WHITE + ": links portals to each other.");
}
}