
package me.BukkitPVP.bedwars;

import java.io.File;
import java.sql.SQLException;
import java.util.*;
import org.bukkit.*;
import org.bukkit.block.Block;
import org.bukkit.block.Sign;
import org.bukkit.entity.Player;
import org.bukkit.event.Listener;
import org.bukkit.event.block.*;
import org.bukkit.event.entity.*;
import org.bukkit.event.player.*;
import org.bukkit.inventory.PlayerInventory;
import org.bukkit.plugin.Plugin;
import org.bukkit.plugin.java.JavaPlugin;
import org.bukkit.scheduler.BukkitScheduler;
import org.bukkit.scoreboard.ScoreboardManager;


public class PlayerListener
    implements Listener
{

    public PlayerListener(JavaPlugin plugin)
    {
        this.plugin = plugin;
    }
    //TODO Andere Teams
    void joinGame(Player player, String gameKey)
    {
        Game i = main.getGame(gameKey);
        String name = player.getName();
        main.bedSpawnLocations.put(name, player.getBedSpawnLocation());
        main.armors.put(name, player.getInventory().getArmorContents());
        main.items.put(name, player.getInventory().getContents());
        main.levels.put(name, Integer.valueOf(player.getLevel()));
        player.sendMessage((new StringBuilder()).append(ChatColor.YELLOW).append("Saved your items, level and bed location").toString());
        if(i.redTeamSize() < i.maxPlayers() / 2 && i.blueTeamSize() < i.maxPlayers() / 2)
        {
            if(Math.random() < 0.5D)
                i.addRedTeam(name);
            else
                i.addBlueTeam(name);
        } else
        if(i.redTeamSize() < i.maxPlayers() / 2)
            i.addRedTeam(name);
        else
            i.addBlueTeam(name);
        if(i.redTeamSize() == i.maxPlayers() / 2 && i.blueTeamSize() >= i.maxPlayers() / 2)
            i.start();
    }

    static void playerElim(String name, Game game)
    {
        Player player = Bukkit.getPlayer(name);
        String gameKey = game.getName();
        game.removeRedTeam(name);
        game.removeBlueTeam(name);
//        game.removeGreenTeam(name);
//        game.removeOrangeTeam(name);
        game.getChunk().load(true);
        game.reloadSign();
        Sign sign = game.getSign();
        sign.setLine(main.playersSignLine, (new StringBuilder(String.valueOf(game.teamsSize()))).append("/").append(game.maxPlayers()).toString());
        sign.update(true);
        player.setScoreboard(main.manager.getNewScoreboard());
        main.resetPlayerState(player);
        player.setBedSpawnLocation((Location)main.bedSpawnLocations.get(name), true);
        player.getInventory().setContents((org.bukkit.inventory.ItemStack[])main.items.get(name));
        player.getInventory().setArmorContents((org.bukkit.inventory.ItemStack[])main.armors.get(name));
        player.setLevel(((Integer)main.levels.get(name)).intValue());
        player.updateInventory();
        player.sendMessage((new StringBuilder()).append(ChatColor.YELLOW).append("Restored your items, level and bed location").toString());
        main.bedSpawnLocations.remove(name);
        main.items.remove(name);
        main.armors.remove(name);
        main.levels.remove(name);
        if(!game.started)
        {
            main.msgWorld((new StringBuilder(String.valueOf(main.mapLoc))).append(game.getName()).toString(), (new StringBuilder()).append(ChatColor.GREEN).append(name).append(" has left the rush").toString());
        } else
        {
            main.msgWorld((new StringBuilder(String.valueOf(main.mapLoc))).append(gameKey).toString(), (new StringBuilder()).append(ChatColor.RED).append(name).append(" has lost!").toString());
            
            if(game.redTeamSize() == 0 || game.blueTeamSize() == 0
//            		 || game.greenTeamSize() == 0|| game.orangeTeamSize() == 0
            		)
                game.cleanUp();
        }
    }

//    public void OnPlayerRespawn(PlayerRespawnEvent event)
//    {
//        Player player = event.getPlayer();
//        final String name = player.getName();
//        if(main.playerInGame(name))
//        {
//            final Game game = main.getPlayerGame(name);
//            if(player.getBedSpawnLocation() == null || !game.started)
//                Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(plugin, new Runnable() {
//
//                    public void run()
//                    {
//                        PlayerListener.playerElim(name, game);
//                    }
//
//                    final PlayerListener this$0;
//                    private final String val$name;
//                    private final Game val$game;
//
//            
//            {
//                this$0 = PlayerListener.this;
//                name = s;
//                game = game1;
//                super();
//            }
//                }
//, 1L);
//        }
//    }

    public void onCreatureSpawn(CreatureSpawnEvent event)
    {
        if(event.getLocation().getWorld().getName().contains(main.mapPrefix))
            event.setCancelled(true);
    }

    public void onPlayerCommand(PlayerCommandPreprocessEvent event)
    {
        Player player = event.getPlayer();
        String message = event.getMessage();
        String name = player.getName();
        if(!player.hasPermission("main.cmdInGame") && main.playerInGame(name))
        {
            if(message.charAt(0) != '/');
            String command = message.substring(1).split(" ")[0];
            if(!command.equalsIgnoreCase("bw") && !command.equalsIgnoreCase("me") && !command.equalsIgnoreCase("msg") && !command.equalsIgnoreCase("tell"))
            {
                player.sendMessage((new StringBuilder()).append(ChatColor.RED).append("You can not use this command in bedwars! You can leave the Bedwars with /bw leave").toString());
                event.setCancelled(true);
            }
        }
    }

//    public void OnPlayerDeath(PlayerDeathEvent event)
//    {
//        Player player = event.getEntity();
//        Player killer = player.getKiller();
//        final String name = player.getName();
//        if((player instanceof Player) && main.playerInGame(name))
//        {
//            final Game game = main.getPlayerGame(name);
//            
//            if(player.getBedSpawnLocation() == null || !game.started)
//                Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(plugin, new Runnable() {
//
//                    public void run()
//                    {
//                        PlayerListener.playerElim(name, game);
//                    }
//
//                    final PlayerListener this$0;
//                    private final String val$name;
//                    private final Game val$game;
//
//            
//            {
//                this$0 = PlayerListener.this;
//                name = s;
//                game = game1;
//                super();
//            }
//                }
//, 1L);
//            
//        }
//    }

    public void onLeave(PlayerQuitEvent event)
    {
        Player player = event.getPlayer();
        String name = player.getName();
        if(main.playerInGame(name))
        {
            Game game = main.getPlayerGame(name);
            playerElim(name, game);
        } else
        if(player.getWorld().getName().contains(main.mapPrefix))
        {
            Location l = ((World)Bukkit.getServer().getWorlds().get(0)).getSpawnLocation();
            player.teleport(l);
        }
    }

    public void entityDamage(EntityDamageByEntityEvent event)
    {
        if(event.getDamager() instanceof Player)
        {
            Player damager = (Player)event.getDamager();
            String damagerName = damager.getName();
            if(main.playerInGame(damagerName))
            {
                Game game = main.getPlayerGame(damagerName);
                if(!game.started())
                    event.setCancelled(true);
            }
        }
    }

//    public void onPlayerBedEnter(PlayerBedEnterEvent event)
//    {
//        Player player = event.getPlayer();
//        String name = player.getName();
//        if(main.playerInGame(name))
//        {
//            Game game = main.getPlayerGame(name);
//            if(player.getBedSpawnLocation() != null && game.started)
//            {
//                player.sendMessage((new StringBuilder()).append(ChatColor.RED).append("You have already slept!").toString());
//                event.setCancelled(true);
//            }
//        }
//    }

    public void onBlockBreak(BlockBreakEvent event)
    {
        Player player = event.getPlayer();
        String name = player.getName();
        Block block = event.getBlock();
        if(!player.isOp() && main.playerInGame(name))
        {
            Game game = main.getPlayerGame(name);
            if(game.started)
            {
                if(block.getType() == Material.GLASS)
                    event.setCancelled(true);
            } else
            {
                event.setCancelled(true);
            }
        }
    }

    public void onInteract(PlayerInteractEvent event)
    {
        Player player = event.getPlayer();
        if(event.getAction() == Action.RIGHT_CLICK_BLOCK)
        {
            Block block = event.getClickedBlock();
            if(block.getType() == Material.WALL_SIGN || block.getType() == Material.SIGN_POST)
            {
                Sign sign = (Sign)block.getState();
                String gameKey = sign.getLine(main.keySignLine);
                String partsPlayerLine[] = sign.getLine(main.playersSignLine).split("/");
                int maxPlayersNum = 0;
                if(partsPlayerLine.length == 2 && !partsPlayerLine[1].equals(""))
                    maxPlayersNum = Integer.parseInt(partsPlayerLine[1]);
                if(maxPlayersNum < 2)
                    maxPlayersNum = main.defaultGameSize;
                if(sign.getLine(main.titleSignLine).equalsIgnoreCase(main.signTitle) && player.isOp() && !gameKey.equals(""))
                {
                    sign.setLine(main.titleSignLine, (new StringBuilder()).append(main.signTitleColour).append(main.signTitle).toString());
                    sign.setLine(main.playersSignLine, (new StringBuilder("0/")).append(maxPlayersNum).toString());
                    sign.setLine(main.statusSignLine, main.waitingSignMsg);
                    if(!main.gameExists(gameKey))
                    {
                        main.games.add(new Game(gameKey, block, maxPlayersNum, plugin));
                    } else
                    {
                        Game game = main.getGame(gameKey);
                        game.setMaxPlayers(maxPlayersNum);
                        game.setSign(sign);
                    }
                    sign.update(true);
                } else
                if(sign.getLine(main.titleSignLine).equalsIgnoreCase((new StringBuilder()).append(main.signTitleColour).append(main.signTitle).toString()))
                {
                    if(!(new File((new StringBuilder(String.valueOf(main.mapWaitLoc))).append(gameKey).toString())).exists())
                        main.copyWorld((new StringBuilder(String.valueOf(main.mapWaitPrefix))).append(gameKey).toString(), main.waitWorldBackup);
                    if(!(new File((new StringBuilder(String.valueOf(main.mapLoc))).append(gameKey).toString())).exists())
                        main.copyWorld(gameKey, main.bwWorldBackup);
                    if(!main.gameExists(gameKey))
                    {
                        sign.setLine(main.playersSignLine, (new StringBuilder("0/")).append(maxPlayersNum).toString());
                        sign.setLine(main.statusSignLine, main.waitingSignMsg);
                        sign.update(true);
                        main.games.add(new Game(gameKey, block, maxPlayersNum, plugin));
                    }
                    Game game = main.getGame(gameKey);
                    if(!game.started)
                    {
                        if(game.teamsSize() != game.maxPlayers())
                            joinGame(player, gameKey);
                        else
                            player.sendMessage((new StringBuilder()).append(ChatColor.RED).append("This game is full!").toString());
                    } else
                    {
                        player.sendMessage((new StringBuilder()).append(ChatColor.RED).append("In game!").toString());
                    }
                }
            }
        }
    }

    Plugin plugin;
    String s;
    Game game1;
}
