package de.flo56958.minetinker.modifiers.types;

import de.flo56958.minetinker.MineTinker;
import de.flo56958.minetinker.data.ToolType;
import de.flo56958.minetinker.events.MTEntityDamageByEntityEvent;
import de.flo56958.minetinker.events.MTEntityDamageEvent;
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.configuration.file.FileConfiguration;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.inventory.ItemStack;

import java.io.File;
import java.util.Arrays;
import java.util.List;

public class Melting extends Modifier implements Listener {

	private static Melting instance;
	private double bonusMultiplier;
	private boolean cancelBurning;

	private Melting() {
		super(MineTinker.getPlugin());
		customModelData = 10_022;
	}

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

		return instance;
	}

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

	@Override
	public List<ToolType> getAllowedTools() {
		return Arrays.asList(ToolType.AXE, ToolType.BOW, ToolType.CROSSBOW, ToolType.SWORD, ToolType.CHESTPLATE, ToolType.LEGGINGS);
	}

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

		config.addDefault("Allowed", true);
		config.addDefault("Color", "%GOLD%");
		config.addDefault("MaxLevel", 3);
		config.addDefault("SlotCost", 1);
		config.addDefault("BonusMultiplier", 0.1); //Percent of Bonus-damage per Level or Damage-reduction on Armor
		config.addDefault("CancelBurningOnArmor", true);

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

		config.addDefault("Recipe.Enabled", false);

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

		init(Material.MAGMA_BLOCK);

		this.bonusMultiplier = config.getDouble("BonusMultiplier", 0.1);
		this.cancelBurning = config.getBoolean("CancelBurningOnArmor", true);

		this.description = this.description.replaceAll("%amount", String.valueOf(this.bonusMultiplier * 100));
	}

	@EventHandler(ignoreCancelled = true)
	public void effect(MTEntityDamageByEntityEvent event) {
		Player player = event.getPlayer();
		ItemStack tool = event.getTool();

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

		if (!modManager.hasMod(tool, this)) {
			return;
		}

		if (event.getPlayer().equals(event.getEvent().getEntity())) {
            /*
            The melting effect if the Player gets damaged. getTool = Armor piece
             */
			int level = modManager.getModLevel(tool, this);

			if (player.getFireTicks() <= 0) {
				return;
			}

			if (player.getFireTicks() > 0 && cancelBurning) {
				player.setFireTicks(0);
			}

			double oldDamage = event.getEvent().getDamage();
			double newDamage = oldDamage * (1 - this.bonusMultiplier * level);

			event.getEvent().setDamage(newDamage);
			ChatWriter.logModifier(player, event, this, tool, String.format("Damage(%.2f -> %.2f [x%.4f])", oldDamage, newDamage, newDamage/oldDamage));
		} else {
            /*
            The melting effect, if the Player is the Damager
             */
			if (event.getEvent().getEntity() instanceof LivingEntity) {
				LivingEntity entity = (LivingEntity) event.getEvent().getEntity();

				if (entity.isDead()) {
					return;
				}

				int level = modManager.getModLevel(tool, this);

				if (entity.getFireTicks() == 0) {
					return;
				}

				double oldDamage = event.getEvent().getDamage();
				double newDamage = oldDamage * (1 + this.bonusMultiplier * level);

				event.getEvent().setDamage(newDamage);
				ChatWriter.logModifier(player, event, this, tool, String.format("Damage(%.2f -> %.2f [x%.4f])", oldDamage, newDamage, newDamage/oldDamage));
			}
		}
	}

	@EventHandler(ignoreCancelled = true)
	public void effect(MTEntityDamageEvent event) {
		Player player = event.getPlayer();
		ItemStack tool = event.getTool();

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

		if (!modManager.hasMod(tool, this)) {
			return;
		}

		int ticks = player.getFireTicks();
		if (ticks > 0 && cancelBurning) {
			player.setFireTicks(0);
			ChatWriter.logModifier(player, event, this, tool, "FireTicks(" + ticks + " -> 0)");
		}
	}
}