package de.viper.survivalplus.listeners;

import de.viper.survivalplus.SurvivalPlus;
import org.bukkit.ChatColor;
import org.bukkit.attribute.Attribute;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.entity.*;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.entity.CreatureSpawnEvent;
import org.bukkit.event.entity.EntityDeathEvent;

import java.util.UUID;

public class AdaptiveMobListener implements Listener {

    private final SurvivalPlus plugin;
    
    // Konfiguration für die Anpassung
    private final double SCALING_FACTOR = 0.1; // 10% mehr Stärke pro Level
    private final int KILLS_PER_LEVEL = 5;     // Alle 5 Kills steigt das Level
    private final int MAX_LEVEL = 50;          // Maximales Level (Cap)

    public AdaptiveMobListener(SurvivalPlus plugin) {
        this.plugin = plugin;
    }

    // 1. Verhalten tracken: Zählt Kills des Spielers
    @EventHandler
    public void onMobDeath(EntityDeathEvent event) {
        if (event.getEntity().getKiller() instanceof Player) {
            Player killer = event.getEntity().getKiller();
            UUID uuid = killer.getUniqueId();

            FileConfiguration mobConfig = plugin.getMobAdaptConfig();
            String uuidPath = uuid.toString();

            int currentLevel = mobConfig.getInt(uuidPath + ".level", 0);
            int currentKills = mobConfig.getInt(uuidPath + ".kills", 0);

            currentKills++;
            
            // Level up wenn genug Kills
            if (currentKills >= KILLS_PER_LEVEL && currentLevel < MAX_LEVEL) {
                currentLevel++;
                currentKills = 0;
                killer.sendMessage(ChatColor.GREEN + "[SurvivalPlus] " + ChatColor.GRAY + "Die Monster werden aggressiver! (Threat Level: " + currentLevel + ")");
            }

            // Speichern
            mobConfig.set(uuidPath + ".level", currentLevel);
            mobConfig.set(uuidPath + ".kills", currentKills);
            plugin.saveMobAdaptConfig();
        }
    }

    // 2. Anpassung: Monster werden beim Spawnen angepasst
    @EventHandler
    public void onCreatureSpawn(CreatureSpawnEvent event) {
        // Nur aktivieren, wenn in Config gewünscht
        if (!plugin.getConfig().getBoolean("adaptive-mobs.enabled", true)) return;

        // Wir greifen nur bei natürlichen Spawns ein (oder Spawn-Eiern), aber nicht bei Spawner-Blöcken (Farmen schützen)
        if (event.getSpawnReason() != CreatureSpawnEvent.SpawnReason.NATURAL && 
            event.getSpawnReason() != CreatureSpawnEvent.SpawnReason.SPAWNER_EGG &&
            event.getSpawnReason() != CreatureSpawnEvent.SpawnReason.DISPENSE_EGG) {
            return;
        }

        LivingEntity entity = event.getEntity();

        // Keine Anpassung für friedliche Tiere
        if (entity instanceof Animals || entity instanceof Ambient) return;

        // Nächsten Spieler suchen (Radius: 30 Blöcke)
        Player nearestPlayer = null;
        double minDistance = 30.0;

        for (Player p : entity.getWorld().getPlayers()) {
            if (p.getLocation().distance(entity.getLocation()) <= minDistance) {
                nearestPlayer = p;
                minDistance = p.getLocation().distance(entity.getLocation());
            }
        }

        if (nearestPlayer != null) {
            applyAttributesBasedOnPlayer(entity, nearestPlayer);
        }
    }

    private void applyAttributesBasedOnPlayer(LivingEntity entity, Player player) {
        FileConfiguration mobConfig = plugin.getMobAdaptConfig();
        int level = mobConfig.getInt(player.getUniqueId().toString() + ".level", 0);

        if (level == 0) return;

        // Multiplikator berechnen (z.B. Level 10 -> 1.0 + (10 * 0.1) = 2.0 = doppelte Stärke)
        double multiplier = 1.0 + (level * SCALING_FACTOR);

        // Cap bei 5-facher Stärke, damit es nicht unspielbar wird
        if (multiplier > 5.0) multiplier = 5.0;

        // Lebenspunkte erhöhen
        if (entity.getAttribute(Attribute.GENERIC_MAX_HEALTH) != null) {
            double baseHealth = entity.getAttribute(Attribute.GENERIC_MAX_HEALTH).getBaseValue();
            entity.getAttribute(Attribute.GENERIC_MAX_HEALTH).setBaseValue(baseHealth * multiplier);
            entity.setHealth(entity.getAttribute(Attribute.GENERIC_MAX_HEALTH).getValue());
        }

        // Angriffsschaden erhöhen
        if (entity.getAttribute(Attribute.GENERIC_ATTACK_DAMAGE) != null) {
            double baseDamage = entity.getAttribute(Attribute.GENERIC_ATTACK_DAMAGE).getBaseValue();
            entity.getAttribute(Attribute.GENERIC_ATTACK_DAMAGE).setBaseValue(baseDamage * multiplier);
        }

        // Optional: Visuelles Indiz (Name über dem Kopf), wenn Monster sehr stark sind
        if (level >= 10) {
             entity.setCustomName(ChatColor.RED + "⚠ " + ChatColor.GRAY + "Starkes Monster (Lvl " + level + ")");
             entity.setCustomNameVisible(true);
        }
    }
}