package net.mc_pandacraft.java.plugin.pandacraftutils.commands;

import java.util.Date;

import net.mc_pandacraft.java.plugin.pandacraftutils.modules.staff.StaffQueueManager;
import net.mc_pandacraft.java.plugin.pandacraftutils.modules.staff.StaffQueueManager.WaitingPlayer;
import net.mc_pandacraft.java.plugin.pandacraftutils.players.OnlinePlayerManager;
import net.mc_pandacraft.java.util.TimeUtil;

import org.apache.commons.lang.StringUtils;
import org.bukkit.ChatColor;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;

public class CommandStaff extends AbstractCommandExecutor {

	public CommandStaff() {
		super("staff");
	}

	@Override
	public boolean onCommand(CommandSender sender, Command cmd, String alias,
			String[] args) {
		
		StaffQueueManager staffManager = plugin.staffQueueManager;
		
		
		if (sender instanceof Player && !OnlinePlayerManager.get((Player)sender).isInStaff())
		{	// un joueur qui n'est pas du staff

			// le joueur est-il déjà en file d'attente ?
			if (staffManager.getWaitingPlayer((Player)sender) != null) {
				if (args.length > 0 && args[0].equalsIgnoreCase("annuler")) {
					staffManager.removePlayer((Player)sender);
					sender.sendMessage(ChatColor.GREEN+"Vous avez été retiré de la file d'attente");
					return true;
				}
				else if (args.length > 0 && args[0].equalsIgnoreCase("position")) {

					sender.sendMessage(ChatColor.GREEN+"Vous êtes à la position "+staffManager.getPlayerPosition((Player)sender)+" de la file d'attente");
					return true;
				}
				sender.sendMessage(ChatColor.GREEN+"Vous êtes déjà dans la file d'attente");
				sender.sendMessage(ChatColor.GREEN+"Commande : "+ChatColor.GRAY+"/staff position"+ChatColor.RED+" pour connaitre votre position"+
									" ou "+ChatColor.GRAY+"/staff annuler"+ChatColor.RED+" pour sortir de la file d'attente");
				return true;
			}
			// le joueur n'a-t-il pas mis un message en argument de la commande
			if (args.length == 0) {
				sender.sendMessage(ChatColor.GREEN+"Vous n'êtes pas dans la file d'attente");
				sender.sendMessage(ChatColor.GREEN+"Cette file d'attente sers à demander un service à une personne du staff connecté");
				sender.sendMessage(ChatColor.RED+"Commande : "+ChatColor.GRAY+"/staff "+ChatColor.ITALIC+"Message"+
						ChatColor.RED+" pour rentrer dans la file d'attente");
				sender.sendMessage(ChatColor.RED+"Si votre message n'est pas assez explicite ou détaillée, votre demande pourra être ignoré");
				return true;
			}
			
			staffManager.addWaitingPlayer((Player)sender, StringUtils.join(args, " "));
			sender.sendMessage(ChatColor.GREEN+"Veuillez maintenant patienter quelques instant, le temps que le staff traite le début de la file d'attente ;)");
			sender.sendMessage(ChatColor.GREEN+"Vous êtes à la position "+staffManager.getPlayerPosition((Player)sender)+" de la file d'attente");
			return true;
		}
		else if (sender instanceof Player)
		{	// un joueur du staff
			if (args.length == 0) {
				staffManager.showWaintingList(sender);
				sender.sendMessage(ChatColor.GOLD+"Pour connaitre les commandes, faites "+ChatColor.GRAY+"/staff ?");
				return true;
			}
			else
			{
				return onCommand_admin_commands(sender, args);
			}
			
		}
		else
		{	// ce n'est pas un joueur (console)
			
			
			if (args.length == 0) {
				staffManager.showWaintingList(sender);
				return true;
			}
			else
			{
				return onCommand_admin_commands(sender, args);
			}
			
			
		}
		
	}
	
	
	
	
	
	
	private boolean onCommand_admin_commands(CommandSender sender, String[] args) {
		
		StaffQueueManager staffManager = plugin.staffQueueManager;
		
		if (args[0].equalsIgnoreCase("?"))
		{	// affichage de l'aide
			sender.sendMessage(ChatColor.GOLD+"--- Commandes administratives pour gérer la file d'attente ---");
			if (sender instanceof Player) {
				sender.sendMessage(ChatColor.GRAY+"/staff select <Joueur>"+ChatColor.RESET+" : prendre en charge un joueur de la file");
				sender.sendMessage(ChatColor.GRAY+"/staff finish"+ChatColor.RESET+" : quand vous avez fini de prendre en charge le joueur en cours");
				sender.sendMessage(ChatColor.GRAY+"/staff cancel"+ChatColor.RESET+" : quand vous ne pouvez pas prendre en charge le joueur en cours");
			}
			sender.sendMessage(ChatColor.GRAY+"/staff remove <Joueur>"+ChatColor.RESET+" : retire un joueur de la file sans le prendre en charge");
			sender.sendMessage(ChatColor.GRAY+"/staff add <Joueur> <Message>"+ChatColor.RESET+" : ajoute un joueur dans la file");
			return true;
		}
		else if (args[0].equalsIgnoreCase("select") && args.length > 1 && sender instanceof Player)
		{
			WaitingPlayer wp;
			// on vérifie si le membre du staff n'est pas déjà associé à un joueur
			if ((wp = staffManager.getSelectedWaitingPlayer((Player)sender)) != null) {
				sender.sendMessage(ChatColor.RED+"Vous vous occupez déjà d'un joueur. Faites "+ChatColor.GRAY+"/staff finish"+ChatColor.RED+" si vous en avez fini avec "+wp.getPlayerDisplayName());
				return true;
			}
			
			// on vérifie que le joueur indiqué se trouve dans la file d'attente
			wp = staffManager.getWaitingPlayer(args[1]);
			if (wp == null) {
				sender.sendMessage(ChatColor.RED+"Le joueur n'est pas dans la liste");
				return true;
			}
			
			// on vérifie si un membre du staff ne s'occupe pas déjà du joueur
			if (wp.getStaffPlayerName() != null) {
				sender.sendMessage(ChatColor.RED+wp.getStaffPlayerName()+" s'occupe déjà de ce joueur");
				return true;
			}
			
			
			wp.setStaffPlayer((Player)sender);
			
			Player p = plugin.getServer().getPlayerExact(wp.getPlayerName());
			if (p != null && p.isOnline()) {
				// le joueur est en ligne
				sender.sendMessage(ChatColor.GREEN+"-----------------------------------------------");
				sender.sendMessage(p.getName()+ChatColor.RESET+" : "+wp.getMessage()+" - "+ChatColor.ITALIC+"Il y a "+TimeUtil.durationToString((new Date()).getTime() - wp.getDate().getTime()));
				sender.sendMessage(ChatColor.GREEN+"Vous avez été téléporté vers ce joueur");
				((Player)sender).teleport(p.getLocation());
				sender.sendMessage(ChatColor.GREEN+"-----------------------------------------------");

				p.sendMessage(ChatColor.GREEN+"-----------------------------------------------");
				p.sendMessage(((Player)sender).getDisplayName()+ChatColor.RESET+ChatColor.GREEN+" s'occupe maintenant de vous :)");
				p.sendMessage(ChatColor.GREEN+"-----------------------------------------------");
				
			}
			else {
				// le joueur n'est pas en ligne
				sender.sendMessage(ChatColor.GREEN+"-----------------------------------------------");
				sender.sendMessage(wp.getPlayerName()+ChatColor.RESET+" : "+wp.getMessage());
				sender.sendMessage(ChatColor.GREEN+"Vous avez été téléporté vers l'endroit concerné par la demande du joueur");
				((Player)sender).teleport(wp.getLocation());
				sender.sendMessage(ChatColor.GREEN+"-----------------------------------------------");
				return true;
			}
			
			

			
			return true;
			
		}
		else if (args[0].equalsIgnoreCase("finish") && sender instanceof Player)
		{
			WaitingPlayer wp = staffManager.getSelectedWaitingPlayer((Player)sender);
			if (wp == null) {
				sender.sendMessage(ChatColor.RED+"Vous ne vous occupez actuellement de personne. Faites "+ChatColor.GRAY+"/staff"+ChatColor.RED+" pour voir si vous pouvez aider un joueur");
				return true;
			}
			
			staffManager.removePlayer(wp.getPlayerName());
			
			sender.sendMessage(ChatColor.GREEN+wp.getPlayerName()+ChatColor.RESET+ChatColor.GREEN+" a été retiré de la file d'attente");
			
			return true;
			
		}
		else if (args[0].equalsIgnoreCase("cancel") && sender instanceof Player)
		{
			WaitingPlayer wp = staffManager.getSelectedWaitingPlayer((Player)sender);
			if (wp == null) {
				sender.sendMessage(ChatColor.RED+"Vous ne vous occupez actuellement de personne. Faites "+ChatColor.GRAY+"/staff"+ChatColor.RED+" pour voir si vous pouvez aider un joueur");
				return true;
			}
			
			wp.setStaffPlayer(null);
			
			Player p = plugin.getServer().getPlayerExact(wp.getPlayerName());
			if (p != null && p.isOnline()) {
				p.sendMessage(ChatColor.RED+((Player)sender).getDisplayName()+ChatColor.RED+" ne s'occupe plus de vous, mais vous restez en file d'attente");
			}
			
			
			sender.sendMessage(ChatColor.GREEN+wp.getPlayerName()+ChatColor.RESET+ChatColor.GREEN+" a été remis en attente");
			
			return true;
			
		}
		else if (args[0].equalsIgnoreCase("remove") && args.length > 1)
		{
			WaitingPlayer wp = staffManager.getWaitingPlayer(args[1]);
			if (wp == null) {
				sender.sendMessage(ChatColor.RED+"Le joueur n'est pas dans la file");
				return true;
			}
			
			staffManager.removePlayer(args[1]);
			Player p = plugin.getServer().getPlayerExact(wp.getPlayerName());
			if (p != null && p.isOnline()) {
				p.sendMessage(ChatColor.RED+"Vous avez été retiré de la file d'attente");
			}
			
			sender.sendMessage(ChatColor.GREEN+wp.getPlayerName()+ChatColor.RESET+ChatColor.GREEN+" a été retiré de la file d'attente");
			
			return true;
			
		}
		else if (args[0].equalsIgnoreCase("add") && args.length > 1)
		{

			Player p = plugin.getServer().getPlayer(args[1]);
			
			if (p == null || !p.isOnline()) {
				sender.sendMessage(ChatColor.RED+"Le joueur n'existe pas ou n'est pas en ligne");
				return true;
			}
			
			WaitingPlayer wp = staffManager.getWaitingPlayer(p.getName());
			if (wp != null) {
				sender.sendMessage(ChatColor.RED+"Le joueur est déjà dans la liste");
				return true;
			}
			
			
			// on trafique le message pour 2 raisons :
			// - on retire les paramètres qui ne font pas partie du message ("add" et le nom du joueur ajouté)
			// - on les replaces par l'info sur le membre du staff qui l'a ajouté à la liste
			args[0] = ChatColor.ITALIC+"(Ajouté par";
			args[1] = sender.getName() +")"+ ChatColor.RESET;
			String message = StringUtils.join(args, " ");
			
			
			staffManager.addWaitingPlayer(p, message);
			
			sender.sendMessage(ChatColor.GREEN+"Vous venez d'ajouter "+p.getDisplayName()+ChatColor.RESET+ChatColor.GREEN+" dans la file d'attente");
			
			p.sendMessage(ChatColor.GREEN+sender.getName()+" vous a ajouté dans la file d'attente pour traiter votre demande plus tard");
			return true;
		}
		sender.sendMessage(ChatColor.RED+"La commande a mal été tapé");
		return false;
	}
	
	
	
	
	
	
	
	
	
	
	
	
	
	


}
