package net.brennholz.challenges;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;

import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.World;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.configuration.InvalidConfigurationException;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.plugin.java.JavaPlugin;

import com.google.common.io.MoreFiles;
import com.google.common.io.RecursiveDeleteOption;

import net.brennholz.challenges.Timer_Command;

public class Challenges extends JavaPlugin {

	private static Challenges plugin;

	private File BackpackConfigFile;
	private FileConfiguration BackpackConfig;

	Timer_Command Timer;
	Backpack backpack;

	public static Inventory SettingsGUI = Bukkit.createInventory(null, 45, "§6Settings");

	public static String GUIName = "§6Settings";

	public static Challenges getplugin() {
		return plugin;
	}

	@SuppressWarnings("static-access")
	@Override
	public void onEnable() {
		this.plugin = this;
		this.Timer = new Timer_Command();
		this.backpack = new Backpack();
		getCommand("settings").setExecutor(this);
		getCommand("hp").setExecutor(new HP_Command());
		getCommand("coords").setExecutor(new Coords_Command());
		getCommand("revive").setExecutor(new Revive_Command());
		getCommand("timer").setExecutor(new Timer_Command());
		getCommand("challenges").setExecutor(new Challenges_Command());
		getCommand("backpack").setExecutor(new Backpack());
		getCommand("reset").setExecutor(new Reset_Command());
		Bukkit.getPluginManager().registerEvents(new EventListener(), this);
		saveDefaultConfig();
		reloadConfig();
		if (getConfig().getBoolean("World_Reset")) {
			this.getLogger().info("/Reset Command was executed!");
			this.getLogger().info("Preparing world reset!");
			String worldname = getConfig().getString("World_Name");
			String nethername = worldname + "_nether";
			String endname = worldname + "_the_end";
			File worldfolder = new File(Bukkit.getWorldContainer().getPath() + "/" + worldname);
			File netherfolder = new File(Bukkit.getWorldContainer().getPath() + "/" + nethername);
			File endfolder = new File(Bukkit.getWorldContainer().getPath() + "/" + endname);

			try {
				MoreFiles.deleteRecursively(worldfolder.toPath(), RecursiveDeleteOption.ALLOW_INSECURE);
				MoreFiles.deleteRecursively(netherfolder.toPath(), RecursiveDeleteOption.ALLOW_INSECURE);
				MoreFiles.deleteRecursively(endfolder.toPath(), RecursiveDeleteOption.ALLOW_INSECURE);
				this.getLogger().info("World reset successful!");
			} catch (IOException e) {
				this.getLogger().info("World reset failed!");
				e.printStackTrace();
			}
			getConfig().set("World_Reset", false);
			saveConfig();
		}
		createBackpackConfig();
		backpack.loadInventoryFromConfig();
		Timer.Run_Timer();
		this.getLogger().info("Plugin loaded!");
	}

	@Override
	public void onDisable() {
		backpack.saveInventoryToConfig();
		try {
			BackpackConfig.save(BackpackConfigFile);
		} catch (IOException e) {
			e.printStackTrace();
		}
		this.getLogger().info("Plugin unloaded");
	}

	public FileConfiguration getBackpackConfig() {
		return this.BackpackConfig;
	}

	private void createBackpackConfig() {
		BackpackConfigFile = new File(getDataFolder(), "backpack.yml");
		if (!BackpackConfigFile.exists()) {
			BackpackConfigFile.getParentFile().mkdirs();
			saveResource("backpack.yml", false);
		}
		BackpackConfig = new YamlConfiguration();
		try {
			BackpackConfig.load(BackpackConfigFile);
		} catch (IOException | InvalidConfigurationException e) {
			e.printStackTrace();
		}
	}

	@Override
	public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
		if (sender instanceof Player) {
			Player p = (Player) sender;
			if (args.length == 0) {
				if (p.hasPermission("challenges.settings.view")) {
					createGUI(p);
				} else
					p.sendMessage("§cDu hast hierf§r keine Berechtigung");
			} else if (args.length == 1) {
				if (args[0].equalsIgnoreCase("get")) {
					if (p.hasPermission("challenges.settings.get")) {
						p.sendMessage("§c~~~~~ §6Aktuelle Einstellungen §c~~~~~");
						p.sendMessage("§6Erlaube Crafting = §c" + getConfig().getBoolean("craftingtable"));
						p.sendMessage("§6Erlaube Handeln = §c" + getConfig().getBoolean("allowtrading"));
						p.sendMessage("§6Tod bei Fallschaden = §c" + getConfig().getBoolean("deathonfall"));
						p.sendMessage("§6Schaden bei Schleichen = §c" + getConfig().getBoolean("damageonsneak"));
						p.sendMessage("§6Menge Schaden bei Schleichen = §c" + getConfig().getInt("sneakdmg"));
						p.sendMessage("§6Geteilter Schaden = §c" + getConfig().getBoolean("sharedmg"));
						p.sendMessage("§6Ein Leben f§r alle = §c" + getConfig().getBoolean("onelife"));
						p.sendMessage("§6Schaden in Chat = §c" + getConfig().getBoolean("dmginchat"));
						p.sendMessage("§6Respawn = §c" + getConfig().getBoolean("respawn"));
					} else
						p.sendMessage("§cDu hast hierf§r keine Berechtigung");
				} else
					p.sendMessage(
							"§cBenutze /settings Get/Crafting/Trading/DeathFall/DMGOnSneak/ShareDMG/Respawn/OneLife/ChatDMG [True/False]");
			} else if (args.length >= 2) {
				if (p.hasPermission("challenges.settings.modify")) {
					Boolean Bwert = Boolean.parseBoolean(args[1]);
					if (args[0].equalsIgnoreCase("crafting")) {
						getConfig().set("craftingtable", Bwert);
						saveConfig();
						p.sendMessage("§6Erlaube Crafting = §c" + getConfig().getBoolean("craftingtable"));
					} else if (args[0].equalsIgnoreCase("deathfall")) {
						getConfig().set("deathonfall", Bwert);
						saveConfig();
						p.sendMessage("§6Tod bei Fallschaden = §c" + getConfig().getBoolean("deathonfall"));
					} else if (args[0].equalsIgnoreCase("trading")) {
						getConfig().set("allowtrading", Bwert);
						saveConfig();
						p.sendMessage("§6Erlaube Handeln = §c" + getConfig().getBoolean("allowtrading"));
					} else if (args[0].equalsIgnoreCase("dmgonsneak")) {
						getConfig().set("damageonsneak", Bwert);
						saveConfig();
						p.sendMessage("§6Schaden bei Schleichen = §c" + getConfig().getBoolean("damageonsneak"));
					} else if (args[0].equalsIgnoreCase("sneakdmg")) {
						Double Dwert = Double.parseDouble(args[1]);
						getConfig().set("sneakdmg", Dwert);
						saveConfig();
						p.sendMessage("§6Menge Schaden bei Schleichen = §c" + getConfig().getString("sneakdmg"));
					} else if (args[0].equalsIgnoreCase("sharedmg")) {
						getConfig().set("sharehp", Bwert);
						saveConfig();
						p.sendMessage("§6Teile Schaden = §c" + getConfig().getBoolean("sharedmg"));
					} else if (args[0].equalsIgnoreCase("respawn")) {
						getConfig().set("respawn", Bwert);
						saveConfig();
						p.sendMessage("§6Respawn = §c" + getConfig().getBoolean("respawn"));
					} else if (args[0].equalsIgnoreCase("onelife")) {
						getConfig().set("onelife", Bwert);
						saveConfig();
						p.sendMessage("§6Ein Leben für alle = §c" + getConfig().getBoolean("onelife"));
					} else if (args[0].equalsIgnoreCase("chatdmg")) {
						getConfig().set("dmginchat", Bwert);
						saveConfig();
						p.sendMessage("§6Schaden in Chat = §c" + getConfig().getBoolean("dmginchat"));
					} else
						p.sendMessage("§cFalsche Parameter!");
				} else
					p.sendMessage("§cDu hast hierf§r keine Berechtigung");
			} else
				p.sendMessage(
						"§cBenutze /settings Get/Crafting/Trading/DeathFall/DMGOnSneak/ShareDMG/Respawn/OneLife/ChatDMG [True/False]");
		} else
			sender.sendMessage("§cKein Konsolenbefehl!");
		return true;

	}

	public void createGUI(Player p) {
		SettingsGUI.setItem(9, addGUIItem(Material.CRAFTING_TABLE, "§6Erlaube Crafting"));
		SettingsGUI.setItem(10, addGUIItem(Material.EMERALD, "§6Erlaube Handeln"));
		SettingsGUI.setItem(11, addGUIItem(Material.BONE, "§6Tod bei Fallschaden", "§cSpieler stirbt bei Fallschaden"));
		SettingsGUI.setItem(12, addGUIItem(Material.MAGMA_BLOCK, "§6Schaden bei Schleichen",
				"§cSpieler erhält §6" + getConfig().getInt("sneakdmg") + " §cSchaden bei Schleichen"));
		SettingsGUI.setItem(14, addGUIItem(Material.GLISTERING_MELON_SLICE, "§6Geteilter Schaden",
				"§cAlle Spieler erhalten den gleichen Schaden"));
		SettingsGUI.setItem(15, addGUIItem(Material.TOTEM_OF_UNDYING, "§6Respawn"));
		SettingsGUI.setItem(16, addGUIItem(Material.POPPY, "§6Ein Leben für alle", "§cStirbt ein Spieler ist die",
				"§cChallenge fehlgeschlagen"));
		SettingsGUI.setItem(17, addGUIItem(Material.BOOK, "§6Schaden in Chat", "§cZeigt Spielerschaden im Chat an"));
		SettingsGUI.setItem(36,
				addGUIItem(Material.CHEST, "§6KeepInventory", "§cStirbst du, beh§lst du dein Inventar"));
		SettingsGUI.setItem(44,
				addGUIItem(Material.GOLDEN_APPLE, "§6Natürliche Regeneration", "§cSchalte natürliche Regeneration um"));

		SettingsGUI.setItem(18, addGUIItem(getDye("craftingtable"), getBool("craftingtable")));
		SettingsGUI.setItem(19, addGUIItem(getDye("allowtrading"), getBool("allowtrading")));
		SettingsGUI.setItem(20, addGUIItem(getDye("deathonfall"), getBool("deathonfall")));
		SettingsGUI.setItem(21, addGUIItem(getDye("damageonsneak"), getBool("damageonsneak")));
		SettingsGUI.setItem(23, addGUIItem(getDye("sharedmg"), getBool("sharedmg")));
		SettingsGUI.setItem(24, addGUIItem(getDye("respawn"), getBool("respawn")));
		SettingsGUI.setItem(25, addGUIItem(getDye("onelife"), getBool("onelife")));
		SettingsGUI.setItem(26, addGUIItem(getDye("dmginchat"), getBool("dmginchat")));
		SettingsGUI.setItem(37, addGUIItem(getgrDye("keepInventory"), getgrBool("keepInventory")));
		SettingsGUI.setItem(43, addGUIItem(getgrDye("naturalRegeneration"), getgrBool("naturalRegeneration")));
		for (int i = 0; i < 45; i++) {
			if (SettingsGUI.getItem(i) == null) {
				SettingsGUI.setItem(i, addGUIItem(Material.ORANGE_STAINED_GLASS_PANE, ""));
			}
		}
		p.openInventory(SettingsGUI);
	}

	private Material getDye(String cnfpath) {
		ItemStack mat = new ItemStack(Material.GRAY_DYE);
		if (getConfig().getBoolean(cnfpath) == true) {
			mat.setType(Material.LIME_DYE);
		} else
			mat.setType(Material.RED_DYE);
		return mat.getType();
	}

	private String getBool(String cnfpath) {
		if (getConfig().getBoolean(cnfpath) == true) {
			return "§aTrue";
		} else
			return "§cFalse";
	}

	private Material getgrDye(String gr) {
		ItemStack mat = new ItemStack(Material.GRAY_DYE);
		World wld = Bukkit.getWorlds().get(0);
		if (wld.getGameRuleValue(gr).equals("true")) {
			mat.setType(Material.LIME_DYE);
		} else if (wld.getGameRuleValue(gr).equals("false")) {
			mat.setType(Material.RED_DYE);
		}
		return mat.getType();
	}

	private String getgrBool(String gr) {
		World wld = Bukkit.getWorlds().get(0);
		if (wld.getGameRuleValue(gr).equals("true")) {
			return "§aTrue";
		} else if (wld.getGameRuleValue(gr).equals("false")) {
			return "§cFalse";
		}
		return "§7Unknown";
	}

	private ItemStack addGUIItem(Material mat, String name, String... lore) {
		ItemStack item = new ItemStack(mat, 1);
		ItemMeta meta = item.getItemMeta();
		meta.setDisplayName(name);
		ArrayList<String> metalore = new ArrayList<String>();
		if (lore != null) {
			for (String lorecomments : lore) {
				metalore.add(lorecomments);
			}
		}
		meta.setLore(metalore);
		item.setItemMeta(meta);

		return item;
	}
}