001package fr.aumgn.dac2.stage;
002
003import java.util.ArrayList;
004import java.util.List;
005
006import org.bukkit.Bukkit;
007import org.bukkit.entity.Player;
008import org.bukkit.event.HandlerList;
009import org.bukkit.event.Listener;
010
011import fr.aumgn.dac2.DAC;
012import fr.aumgn.dac2.arena.Arena;
013import fr.aumgn.dac2.exceptions.IncompleteArena;
014import fr.aumgn.dac2.exceptions.StageAlreadyRunning;
015
016public class Stages {
017
018    private final DAC dac;
019    private final List<Stage> stages;
020
021    public Stages(DAC dac) {
022        this.dac = dac;
023        this.stages = new ArrayList<Stage>(dac.getArenas().length());
024    }
025
026    public Stage get(Arena arena) {
027        for (Stage stage : stages) {
028            if (stage.getArena() == arena) {
029                return stage;
030            }
031        }
032
033        return null;
034    }
035
036    public Stage get(Player player) {
037        for (Stage stage : stages) {
038            if (stage.contains(player)) {
039                return stage;
040            }
041        }
042
043        return null;
044    }
045
046    public void start(Stage stage) {
047        Arena arena = stage.getArena();
048        if (get(stage.getArena()) != null) {
049            throw new StageAlreadyRunning(dac.getMessages());
050        }
051
052        if (!arena.isComplete()) {
053            throw new IncompleteArena(dac, arena);
054        }
055        stages.add(stage);
056        registerListeners(stage);
057        stage.start();
058    }
059
060    public void stop(Stage stage) {
061        unregisterListeners(stage);
062        stage.stop(false);
063        stages.remove(stage);
064    }
065
066    public void forceStop(Stage stage) {
067        unregisterListeners(stage);
068        stage.stop(true);
069        stages.remove(stage);
070    }
071
072    public void switchTo(Stage stage) {
073        Stage oldStage = get(stage.getArena());
074        if (oldStage == null) {
075            stages.add(stage);
076        } else {
077            unregisterListeners(oldStage);
078            oldStage.stop(false);
079            int index = stages.indexOf(oldStage);
080            stages.set(index, stage);
081        }
082
083        registerListeners(stage);
084        stage.start();
085    }
086
087    private void registerListeners(Stage stage) {
088        for (Listener listener : stage.getListeners()) {
089            Bukkit.getPluginManager()
090                    .registerEvents(listener, dac.getPlugin());
091        }
092    }
093
094    private void unregisterListeners(Stage stage) {
095        for (Listener listener : stage.getListeners()) {
096            HandlerList.unregisterAll(listener);
097        }
098    }
099}