package de.viper.survivalplus.commands;

import de.viper.survivalplus.SurvivalPlus;
import org.bukkit.ChatColor;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Entity;
import org.bukkit.entity.Item;
import org.bukkit.entity.Player;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.util.RayTraceResult;

public class RideCommand implements CommandExecutor {

    private final SurvivalPlus plugin;

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

    @Override
    public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
        if (!(sender instanceof Player)) {
            sender.sendMessage("Dieser Befehl ist nur für Spieler!");
            return true;
        }

        Player player = (Player) sender;
        FileConfiguration lang = plugin.getLangConfig();
        
        if (!player.hasPermission("survivalplus.ride")) {
            player.sendMessage(ChatColor.RED + "Du hast keine Berechtigung dafür!");
            return true;
        }

        // --- FALL 1: ABSTEIGEN ---
        if (args.length == 0) {
            if (player.isInsideVehicle()) {
                player.leaveVehicle();
                player.sendMessage(ChatColor.GREEN + "Du bist abgestiegen!");
                return true;
            }

            // --- FALL 2: AUFSTEIGEN (Via Raycast) ---
            
            double maxDistance = 5.0;

            // FIX: Wir übergeben einen Filter, der den Spieler selbst ignoriert
            RayTraceResult rayTrace = player.getWorld().rayTraceEntities(
                player.getEyeLocation(),
                player.getEyeLocation().getDirection(),
                maxDistance,
                1.0, // Ray Größe (Dicke des Strahls)
                entity -> !entity.getUniqueId().equals(player.getUniqueId()) // WICHTIG: Ignoriere mich selbst
            );

            if (rayTrace == null || rayTrace.getHitEntity() == null) {
                player.sendMessage(ChatColor.RED + "Du schaust auf nichts zum Reiten!");
                player.sendMessage(ChatColor.GRAY + "Schaue einen Spieler oder Mob an.");
                return true;
            }

            Entity target = rayTrace.getHitEntity();

            // Verhindern, dass man aufgesammelte Items reitet
            if (target instanceof Item) {
                player.sendMessage(ChatColor.RED + "Du kannst keine aufgesammelten Items reiten!");
                return true;
            }

            // --- Zielle Logik ---
            if (target instanceof Player) {
                Player targetPlayer = (Player) target;

                if (targetPlayer.equals(player)) {
                    player.sendMessage(ChatColor.RED + "Du kannst dich nicht selbst reiten!");
                    return true;
                }

                if (targetPlayer.hasPermission("survivalplus.ride.exempt")) {
                    player.sendMessage(ChatColor.RED + "Du kannst diesen Spieler nicht reiten!");
                    return true;
                }

                target.addPassenger(player);
                player.sendMessage(ChatColor.GREEN + "Du reitest nun " + ChatColor.YELLOW + targetPlayer.getName() + ChatColor.GREEN + "!");
                targetPlayer.sendMessage(ChatColor.GOLD + player.getName() + ChatColor.GREEN + " reitet dich jetzt!");
            } else {
                target.addPassenger(player);
                player.sendMessage(ChatColor.GREEN + "Du reitest nun ein(e) " + target.getName() + "!");
            }

            return true;
        }

        player.sendMessage(ChatColor.GRAY + "Benutzung: Schaue auf ein Wesen und tippe " + ChatColor.WHITE + "/ride");
        return true;
    }
}