package com.mengcraft.protect.manager;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import org.bukkit.block.Block;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.block.BlockRedstoneEvent;
public class RedstoneManager {
private final static RedstoneManager MANAGER = new RedstoneManager();
private final Map<Block, Integer> map = new HashMap<>();
private class Task implements Runnable {
private final List<Block> blocks = new ArrayList<>();
private final int limit;
private final Map<Block, Integer> map;
public Task(Map<Block, Integer> map, int limit) {
this.map = map;
this.limit = limit;
}
@Override
public void run() {
for (Entry<Block, Integer> entry : this.map.entrySet()) {
checkAdd(entry);
}
for (Block block : this.blocks) {
checkBreak(block);
}
this.map.clear();
this.blocks.clear();
}
private void checkAdd(Entry<Block, Integer> entry) {
if (entry.getValue() > this.limit) {
this.blocks.add(entry.getKey());
}
}
private void checkBreak(Block block) {
if (!block.getType().name().contains("SIGN")) {
block.breakNaturally();
}
}
}
private class Events implements Listener {
private final Map<Block, Integer> map;
public Events(Map<Block, Integer> map) {
this.map = map;
}
@EventHandler
public void onRedClock(BlockRedstoneEvent event) {
put(event.getBlock());
}
private void put(Block block) {
if (this.map.containsKey(block)) {
this.map.put(block, this.map.get(block) + 1);
} else {
this.map.put(block, 1);
}
}
}
public Events getEvents() {
return new Events(this.map);
}
public Task getTask(int limit) {
return new Task(this.map, limit);
}
public static RedstoneManager getManager() {
return MANAGER;
}
}