package me.staartvin.statz.listeners;

import me.staartvin.statz.Statz;
import me.staartvin.statz.datamanager.player.PlayerStat;
import me.staartvin.statz.datamanager.player.specification.DistanceTravelledSpecification;
import me.staartvin.statz.datamanager.player.specification.PlayerStatSpecification;
import me.staartvin.statz.util.StatzUtil;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerMoveEvent;

public class DistanceTravelledListener implements Listener {

    private final Statz plugin;

    public DistanceTravelledListener(final Statz plugin) {
        this.plugin = plugin;
    }

    @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
    public void onMove(final PlayerMoveEvent event) {

        final PlayerStat stat = PlayerStat.DISTANCE_TRAVELLED;

        // Get player
        final Player player = event.getPlayer();

        // Do general check
        if (!plugin.doGeneralCheck(player, stat))
            return;

        String movementType = StatzUtil.getMovementType(player);

        final double distTravelled;

        try {
            distTravelled = event.getFrom().distance(event.getTo());
        } catch (IllegalArgumentException e) {
            // Did not move correctly, so ignore it.
            return;
        }

        if (distTravelled == 0) {
            return;
        }

        PlayerStatSpecification specification = new DistanceTravelledSpecification(player.getUniqueId(),
                distTravelled, player.getWorld().getName(), movementType);

        // Update value to new stat.
        plugin.getDataManager().setPlayerInfo(player.getUniqueId(), stat, specification.constructQuery());

    }
}