package de.flo56958.minetinker.modifiers.types;

import de.flo56958.minetinker.MineTinker;
import de.flo56958.minetinker.data.ToolType;
import de.flo56958.minetinker.modifiers.Modifier;
import de.flo56958.minetinker.utils.ChatWriter;
import de.flo56958.minetinker.utils.ConfigurationManager;
import org.bukkit.Material;
import org.bukkit.attribute.Attribute;
import org.bukkit.attribute.AttributeInstance;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.entity.EntityDamageEvent;
import org.bukkit.inventory.ItemStack;
import org.bukkit.potion.PotionEffect;
import org.bukkit.potion.PotionEffectType;

import java.io.File;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class Berserk extends Modifier implements Listener {

	private static Berserk instance;
	private int boostTime;
	private int trigger;

	private Berserk() {
		super(MineTinker.getPlugin());
		customModelData = 10_006;
	}

	public static Berserk instance() {
		synchronized (Berserk.class) {
			if (instance == null) {
				instance = new Berserk();
			}
		}

		return instance;
	}

	@Override
	public String getKey() {
		return "Berserk";
	}

	@Override
	public List<ToolType> getAllowedTools() {
		return Collections.singletonList(ToolType.CHESTPLATE);
	}

	@Override
	public void reload() {
		FileConfiguration config = getConfig();
		config.options().copyDefaults(true);

		config.addDefault("Allowed", true);
		config.addDefault("Color", "%DARK_RED%");
		config.addDefault("MaxLevel", 3);
		config.addDefault("SlotCost", 1);
		config.addDefault("BoostTimeInTicks", 200);
		config.addDefault("TriggerPercent", 20);

		config.addDefault("EnchantCost", 10);
		config.addDefault("Enchantable", false);

		config.addDefault("Recipe.Enabled", true);
		config.addDefault("Recipe.Top", "FRF");
		config.addDefault("Recipe.Middle", "RFR");
		config.addDefault("Recipe.Bottom", "FRF");

		Map<String, String> recipeMaterials = new HashMap<>();
		recipeMaterials.put("F", Material.ROTTEN_FLESH.name());
		recipeMaterials.put("R", Material.REDSTONE.name());

		config.addDefault("Recipe.Materials", recipeMaterials);

		ConfigurationManager.saveConfig(config);
		ConfigurationManager.loadConfig("Modifiers" + File.separator, getFileName());

		this.boostTime = config.getInt("BoostTimeInTicks");
		this.trigger = config.getInt("TriggerPercent");

		init(Material.REDSTONE);

		this.description = this.description
				.replace("%duration", String.valueOf(this.boostTime / 20))
				.replace("%percent", String.valueOf(trigger));
	}

	@EventHandler(priority = EventPriority.HIGHEST)
	public void onHit(EntityDamageEvent event) {
		if (!(event.getEntity() instanceof Player)) {
			return;
		}

		Player player = (Player) event.getEntity();

		if (!player.hasPermission("minetinker.modifiers.berserk.use")) {
			return;
		}

		ItemStack chest = player.getInventory().getChestplate();

		if (!modManager.isArmorViable(chest)) {
			return;
		}

		int modifierLevel = modManager.getModLevel(chest, this);

		if (modifierLevel <= 0) {
			return;
		}

		double lifeAfterDamage = player.getHealth() - event.getFinalDamage();
		AttributeInstance healthAttr = player.getAttribute(Attribute.GENERIC_MAX_HEALTH);

		double maxHealth = 20;

		if (healthAttr != null) {
			maxHealth = healthAttr.getValue();
		}

		if (player.getHealth() / maxHealth > trigger / 100.0 && lifeAfterDamage / maxHealth <= trigger / 100.0) {
			player.addPotionEffect(new PotionEffect(PotionEffectType.INCREASE_DAMAGE, boostTime, modifierLevel - 1));
			ChatWriter.logModifier(player, event, this, chest,
					"Time(" + boostTime + ")", "Amplifier(" + (modifierLevel - 1) + ")");
		}
	}
}