
package me.BukkitPVP.bedwars;

import java.io.File;
import java.io.IOException;
import java.util.*;

import net.minecraft.util.org.apache.commons.io.FileUtils;

import org.bukkit.*;
import org.bukkit.block.Block;
import org.bukkit.block.Sign;
import org.bukkit.entity.Player;
import org.bukkit.plugin.Plugin;
import org.bukkit.scoreboard.*;


public class Game
{

    public Game(String name, Block block, int maxPlayers, Plugin plugin)
    {
        started = false;
        redTeam = new ArrayList();
        blueTeam = new ArrayList();
//        greenTeam = new ArrayList();
//        orangeTeam = new ArrayList();
        voted = new ArrayList();
        this.name = name;
        this.block = block;
        chunk = block.getChunk();
        sign = (Sign)block.getState();
        this.maxPlayers = maxPlayers;
        this.plugin = plugin;
        setBoard();
    }

    private void setBoard()
    {
        board = main.manager.getNewScoreboard();
        redTeamSb = board.registerNewTeam("Red");
        blueTeamSb = board.registerNewTeam("Blue");
//        greenTeamSb = board.registerNewTeam("Green");
//        orangeTeamSb = board.registerNewTeam("Orange");
        main.SetTeam(redTeamSb, main.redTeamColour);
        main.SetTeam(blueTeamSb, main.blueTeamColour);
//        main.SetTeam(greenTeamSb, main.greenTeamColour);
//        main.SetTeam(orangeTeamSb, main.orangeTeamColour);
        Objective objective = board.registerNewObjective("kills", "playerKillCount");
        objective.setDisplaySlot(DisplaySlot.SIDEBAR);
        objective.setDisplayName((new StringBuilder()).append(ChatColor.RED).append("Kills").toString());
    }

    void reloadSign()
    {
        sign = (Sign)block.getState();
    }

    Scoreboard getScoreboard()
    {
        return board;
    }

    String getName()
    {
        return name;
    }

    int maxPlayers()
    {
        return maxPlayers;
    }

    void setMaxPlayers(int p)
    {
        maxPlayers = p;
    }

    int redTeamSize()
    {
        return redTeam.size();
    }

    int blueTeamSize()
    {
        return blueTeam.size();
    }
    
//    int greenTeamSize()
//    {
//        return greenTeam.size();
//    }
    
//    int orangeTeamSize()
//    {
//        return orangeTeam.size();
//    }
    
    int votedSize()
    {
        return voted.size();
    }

    int teamsSize()
    {
        return redTeam.size() + blueTeam.size()
//         + greenTeam.size() + orangeTeam.size()
        		;
    }

    boolean redTeamContains(String playerName)
    {
        return redTeam.contains(playerName);
    }

    boolean blueTeamContains(String playerName)
    {
        return blueTeam.contains(playerName);
    }
//    boolean greenTeamContains(String playerName)
//    {
//        return greenTeam.contains(playerName);
//    }
//    boolean orangeTeamContains(String playerName)
//    {
//        return orangeTeam.contains(playerName);
//    }

    boolean votedContains(String playerName)
    {
        return voted.contains(playerName);
    }

    boolean teamContains(String playerName)
    {
        return redTeam.contains(playerName) || blueTeam.contains(playerName);
    }

    boolean started()
    {
        return started;
    }

    Chunk getChunk()
    {
        return chunk;
    }

    void addRedTeam(String playerName)
    {
        Bukkit.getServer().createWorld(new WorldCreator((new StringBuilder(String.valueOf(main.mapWaitLoc))).append(name).toString()));
        Player player = Bukkit.getPlayer(playerName);
        World w = Bukkit.getServer().getWorld((new StringBuilder(String.valueOf(main.mapWaitLoc))).append(name).toString());
        player.teleport(new Location(w, main.redWaitLocs[0], main.redWaitLocs[1], main.redWaitLocs[2]));
        player.setFallDistance(0.0F);
        redTeam.add(playerName);
        main.msgWorld((new StringBuilder(String.valueOf(main.mapWaitLoc))).append(name).toString(), (new StringBuilder()).append(ChatColor.GREEN).append(playerName).append(" joined the red team").toString());
        redTeamSb.addPlayer(player);
        joinTeam(player);
    }

    void addBlueTeam(String playerName)
    {
        Bukkit.getServer().createWorld(new WorldCreator((new StringBuilder(String.valueOf(main.mapWaitLoc))).append(name).toString()));
        Player player = Bukkit.getPlayer(playerName);
        World w = Bukkit.getServer().getWorld((new StringBuilder(String.valueOf(main.mapWaitLoc))).append(name).toString());
        player.teleport(new Location(w, main.blueWaitLocs[0], main.blueWaitLocs[1], main.blueWaitLocs[2]));
        player.setFallDistance(0.0F);
        blueTeam.add(playerName);
        main.msgWorld((new StringBuilder(String.valueOf(main.mapWaitLoc))).append(name).toString(), (new StringBuilder()).append(ChatColor.GREEN).append(playerName).append(" joined the blue team").toString());
        blueTeamSb.addPlayer(player);
        joinTeam(player);
    }
//    void addGreenTeam(String playerName)
//    {
//        Bukkit.getServer().createWorld(new WorldCreator((new StringBuilder(String.valueOf(main.mapWaitLoc))).append(name).toString()));
//        Player player = Bukkit.getPlayer(playerName);
//        World w = Bukkit.getServer().getWorld((new StringBuilder(String.valueOf(main.mapWaitLoc))).append(name).toString());
//        player.teleport(new Location(w, main.greenWaitLocs[0], main.greenWaitLocs[1], main.greenWaitLocs[2]));
//        player.setFallDistance(0.0F);
//        greenTeam.add(playerName);
//        main.msgWorld((new StringBuilder(String.valueOf(main.mapWaitLoc))).append(name).toString(), (new StringBuilder()).append(ChatColor.GREEN).append(playerName).append(" joined the green team").toString());
//        greenTeamSb.addPlayer(player);
//        joinTeam(player);
//    }
//    void addOrangeTeam(String playerName)
//    {
//        Bukkit.getServer().createWorld(new WorldCreator((new StringBuilder(String.valueOf(main.mapWaitLoc))).append(name).toString()));
//        Player player = Bukkit.getPlayer(playerName);
//        World w = Bukkit.getServer().getWorld((new StringBuilder(String.valueOf(main.mapWaitLoc))).append(name).toString());
//        player.teleport(new Location(w, main.orangeWaitLocs[0], main.orangeWaitLocs[1], main.orangeWaitLocs[2]));
//        player.setFallDistance(0.0F);
//        orangeTeam.add(playerName);
//        main.msgWorld((new StringBuilder(String.valueOf(main.mapWaitLoc))).append(name).toString(), (new StringBuilder()).append(ChatColor.GREEN).append(playerName).append(" joined the orange team").toString());
//        orangeTeamSb.addPlayer(player);
//        joinTeam(player);
//    }

    void joinTeam(Player player)
    {
        reloadSign();
        sign.setLine(main.playersSignLine, (new StringBuilder(String.valueOf(teamsSize()))).append("/").append(maxPlayers()).toString());
        sign.update(true);
        main.goNaked(player);
        Bukkit.getServer().createWorld(new WorldCreator((new StringBuilder(String.valueOf(main.mapWaitLoc))).append(name).toString()));
        World w = Bukkit.getServer().getWorld((new StringBuilder(String.valueOf(main.mapWaitLoc))).append(name).toString());
        w.setAutoSave(false);
        main.reloadColours(board, (new StringBuilder(String.valueOf(main.mapWaitLoc))).append(name).toString());
        main.setDisplayName(player);
    }

    void addVoted(String playerName)
    {
        Player player = Bukkit.getPlayer(playerName);
        main.msgWorld(player, (new StringBuilder(String.valueOf(playerName))).append(" has voted").toString());
        voted.add(playerName);
    }

    void msgRedTeam(String msg)
    {
        Player player;
        for(Iterator iterator = redTeam.iterator(); iterator.hasNext(); player.sendMessage(msg))
        {
            String playerName = (String)iterator.next();
            player = Bukkit.getPlayer(playerName);
        }

    }

    void msgBlueTeam(String msg)
    {
        Player player;
        for(Iterator iterator = blueTeam.iterator(); iterator.hasNext(); player.sendMessage(msg))
        {
            String playerName = (String)iterator.next();
            player = Bukkit.getPlayer(playerName);
        }

    }
//    void msgGreenTeam(String msg)
//    {
//        Player player;
//        for(Iterator iterator = greenTeam.iterator(); iterator.hasNext(); player.sendMessage(msg))
//        {
//            String playerName = (String)iterator.next();
//            player = Bukkit.getPlayer(playerName);
//        }
//
//    }
//    void msgOrangeTeam(String msg)
//    {
//        Player player;
//        for(Iterator iterator = orangeTeam.iterator(); iterator.hasNext(); player.sendMessage(msg))
//        {
//            String playerName = (String)iterator.next();
//            player = Bukkit.getPlayer(playerName);
//        }
//
//    }

    void removeRedTeam(String playerName)
    {
        Player player = Bukkit.getPlayer(playerName);
        redTeam.remove(playerName);
        redTeamSb.removePlayer(player);
        leaveTeam(player);
    }

    void removeBlueTeam(String playerName)
    {
        Player player = Bukkit.getPlayer(playerName);
        blueTeam.remove(playerName);
        blueTeamSb.removePlayer(player);
        leaveTeam(player);
    }
//    void removeGreenTeam(String playerName)
//    {
//        Player player = Bukkit.getPlayer(playerName);
//        greenTeam.remove(playerName);
//        greenTeamSb.removePlayer(player);
//        leaveTeam(player);
//    }
//    void removeOrangeTeam(String playerName)
//    {
//        Player player = Bukkit.getPlayer(playerName);
//        orangeTeam.remove(playerName);
//        orangeTeamSb.removePlayer(player);
//        leaveTeam(player);
//    }

    void leaveTeam(Player player)
    {
        String playerName = player.getName();
        main.resetPlayerColours(player);
        removeVoted(playerName);
    }

    void removeVoted(String playerName)
    {
        voted.remove(playerName);
    }

    Sign getSign()
    {
        return sign;
    }

    public void setSign(Sign s)
    {
        sign = s;
    }

    void cleanUp()
    {
        ArrayList winningPlayers = new ArrayList();
        winningPlayers.addAll(blueTeam);
        winningPlayers.addAll(redTeam);
        //winningPlayers.addAll(greenTeam);
        //winningPlayers.addAll(orangeTeam);
        String winningPlayerNames = "";
        for(int i = 0; i < winningPlayers.size(); i++)
        {
            winningPlayerNames = (new StringBuilder(String.valueOf(winningPlayerNames))).append((String)winningPlayers.get(i)).toString();
            if(i != winningPlayers.size() - 1)
                winningPlayerNames = (new StringBuilder(String.valueOf(winningPlayerNames))).append(", ").toString();
        }

        if(redTeamSize() == 0)
            Bukkit.getServer().broadcastMessage((new StringBuilder()).append(ChatColor.GREEN).append("The game ").append(getName()).append(" is finished the blues (").append(winningPlayerNames).append(") have won!").toString());
        else
            if(blueTeamSize() == 0)
                Bukkit.getServer().broadcastMessage((new StringBuilder()).append(ChatColor.GREEN).append("The game ").append(getName()).append(" is finished the reds (").append(winningPlayerNames).append(") have won!").toString());
        for(Iterator iterator = winningPlayers.iterator(); iterator.hasNext();)
        {
            String playerName = (String)iterator.next();
            removeRedTeam(playerName);
            removeBlueTeam(playerName);
//            removeGreenTeam(playerName);
//            removeOrangeTeam(playerName);
        }

        Player p;
        for(Iterator iterator1 = Bukkit.getServer().getWorld((new StringBuilder(String.valueOf(main.mapLoc))).append(name).toString()).getPlayers().iterator(); iterator1.hasNext(); p.setScoreboard(main.manager.getNewScoreboard()))
        {
            p = (Player)iterator1.next();
            main.resetPlayerState(p);
        }

        reloadSign();
        chunk.load(true);
        sign.setLine(main.statusSignLine, (new StringBuilder()).append(ChatColor.ITALIC).append("Loading...").toString());
        sign.update(true);
        setBoard();
        resetMap();
    }

    void resetMap()
    {
        if(Bukkit.getServer().unloadWorld((new StringBuilder(String.valueOf(main.mapLoc))).append(name).toString(), true) && Bukkit.getServer().unloadWorld((new StringBuilder(String.valueOf(main.mapWaitLoc))).append(name).toString(), true))
        {
            try
            {
                FileUtils.deleteDirectory(new File((new StringBuilder(String.valueOf(main.mapLoc))).append(name).toString()));
                FileUtils.deleteDirectory(new File((new StringBuilder(String.valueOf(main.mapWaitLoc))).append(name).toString()));
            }
            catch(IOException e)
            {
                e.printStackTrace();
            }
            started = false;
            reloadSign();
            chunk.load(true);
            sign.setLine(main.playersSignLine, (new StringBuilder("0/")).append(maxPlayers()).toString());
            sign.setLine(main.statusSignLine, main.waitingSignMsg);
            sign.update(true);
        } else
        {
            Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(plugin, new Runnable() {

                public void run()
                {
                    resetMap();
                }

                final Game this$0;

            
            {
                this$0 = Game.this;
//                super();
            }
            }
, 20L);
        }
    }

    void start()
    {
        main.msgWorld((new StringBuilder(String.valueOf(main.mapWaitLoc))).append(name).toString(), (new StringBuilder()).append(ChatColor.GREEN).append("The rush has started! Good luck!").toString());
        started = true;
        sign.setLine(main.statusSignLine, main.startedSignMsg);
        sign.update(true);
        voted.clear();
        Bukkit.getServer().createWorld(new WorldCreator((new StringBuilder(String.valueOf(main.mapLoc))).append(name).toString()));
        World w = Bukkit.getServer().getWorld((new StringBuilder(String.valueOf(main.mapLoc))).append(name).toString());
        w.setAutoSave(false);
        w.setTime(14000L);
        ArrayList players = new ArrayList();
        players.addAll(blueTeam);
        players.addAll(redTeam);
//        players.addAll(greenTeam);
//        players.addAll(orangeTeam);
        Player player;
        for(Iterator iterator = players.iterator(); iterator.hasNext(); player.setFallDistance(0.0F))
        {
            String playerName = (String)iterator.next();
            player = Bukkit.getPlayer(playerName);
            main.goNaked(player);
            player.teleport(new Location(w, (main.bluePlayLocs[0] + main.redPlayLocs[0]) / 2, (main.bluePlayLocs[1] + main.redPlayLocs[1]) / 2, (main.bluePlayLocs[2] + main.redPlayLocs[2]) / 2));
            if(blueTeam.contains(playerName))
                player.teleport(new Location(w, main.bluePlayLocs[0], main.bluePlayLocs[1], main.bluePlayLocs[2]));
            else
            if(redTeam.contains(playerName))
                player.teleport(new Location(w, main.redPlayLocs[0], main.redPlayLocs[1], main.redPlayLocs[2]));
        }

    }

    String name;
    Block block;
    Sign sign;
    boolean started;
    ArrayList redTeam;
    ArrayList blueTeam;
//    ArrayList greenTeam;
//    ArrayList orangeTeam;
    ArrayList voted;
    int maxPlayers;
    Plugin plugin;
    Chunk chunk;
    Scoreboard board;
    Team redTeamSb;
    Team blueTeamSb;
//    Team greenTeamSb;
//    Team orangeTeamSb;
}
