package eu.wolvmc.noore;

import java.util.ArrayList;
import java.util.List;

import org.bukkit.Bukkit;
import org.bukkit.Chunk;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.craftbukkit.v1_13_R2.CraftWorld;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.world.ChunkLoadEvent;
import org.bukkit.plugin.java.JavaPlugin;
import org.bukkit.scheduler.BukkitRunnable;
import net.minecraft.server.v1_13_R2.BlockPosition;
import net.minecraft.server.v1_13_R2.IBlockData;

public class NoOre extends JavaPlugin implements Listener {
	
	private final String world = "world";
	
	private static boolean started = false;
	private static boolean checking = false;
	private static ArrayList<Chunk> toCheck = new ArrayList<>();
	private static ArrayList<BlockPosition> queue = new ArrayList<>();
	
	@Override
	public void onEnable() {
		super.onEnable();
		getServer().getPluginManager().registerEvents(this, this);
		Bukkit.getScheduler().runTask(this, new Runnable() {
			@Override
			public void run() {
				started = true;
			}
		});
		new BukkitRunnable() {
			@Override
			public void run() {
				if(started && !checking) {
					checking = true;
					ArrayList<Chunk> l = toCheck;
					toCheck = new ArrayList<Chunk>();
					Bukkit.getLogger().info("Checking " + l.size() + " chunks...");
					for(Chunk c : l) {
						for(int x=0; x<16; ++x) for(int y=0; y<132; ++y) for(int z=0; z<16; ++z) {
							Block b = c.getBlock(x, y, z);
							if(isOre(b.getType())) {
								queue.add(new BlockPosition(b.getX(), b.getY(), b.getZ()));
							}
						}
						try {
							Thread.sleep(10);
						} catch (InterruptedException e) {
							e.printStackTrace();
						}
					}
					checking = false;
					Bukkit.getLogger().info("Checking done!");
				}
			}
		}.runTaskTimerAsynchronously(this, 0l, 20l);
		new BukkitRunnable() {
			@Override
			public void run() {
				if(!checking) {
					int s = queue.size();
					if(s==0) return;
					int m = Math.min(5000, s);
					List<BlockPosition> l = queue.subList(0, m);
					queue = new ArrayList<BlockPosition>(queue.subList(m, s));
					Bukkit.getLogger().info("Replacing " + l.size() + " ores...");
					net.minecraft.server.v1_13_R2.World w = ((CraftWorld) Bukkit.getWorld(world)).getHandle();
					IBlockData ibd = net.minecraft.server.v1_13_R2.Block.getByCombinedId(1);
					for(BlockPosition bp : l) {
						w.setTypeAndData(bp, ibd, 0);
					}
					Bukkit.getLogger().info("Replacing done!");
				}
			}
		}.runTaskTimer(this, 20l, 20l);
	}
	
	@EventHandler
	public void onChunkLoad(ChunkLoadEvent e) {
		if(e.isNewChunk() && e.getWorld().getName().equals(world)) toCheck.add(e.getChunk());
	}
	
	private boolean isOre(Material m) {
		return m==Material.COAL_ORE || m==Material.DIAMOND_ORE || m==Material.EMERALD_ORE || m==Material.GOLD_ORE || m==Material.IRON_ORE || m==Material.LAPIS_ORE || m==Material.REDSTONE_ORE;
	}
	
}
