package com.iridium.iridiumskyblock.listeners;

import com.iridium.iridiumskyblock.IridiumSkyblock;
import com.iridium.iridiumskyblock.Island;
import com.iridium.iridiumskyblock.User;
import com.iridium.iridiumskyblock.Utils;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.AsyncPlayerChatEvent;

public class PlayerTalkListener implements Listener {

    @EventHandler(ignoreCancelled = true)
    public void onPlayerTalk(AsyncPlayerChatEvent event) {
        try {
            final Player player = event.getPlayer();
            final User user = User.getUser(player);

            if (user.warp != null) {
                if (user.warp.getPassword().equals(event.getMessage())) {
                    Bukkit.getScheduler().runTask(IridiumSkyblock.getInstance(), () -> player.teleport(user.warp.getLocation()));
                    player.sendMessage(Utils.color(IridiumSkyblock.getMessages().teleporting
                            .replace("%prefix%", IridiumSkyblock.getConfiguration().prefix)));
                } else {
                    player.sendMessage(Utils.color(IridiumSkyblock.getMessages().wrongPassword
                            .replace("%prefix%", IridiumSkyblock.getConfiguration().prefix)));
                    user.warp = null;
                }
                event.setCancelled(true);
            }

            final Island island = user.getIsland();

            String format = event.getFormat();
            if (format.contains(IridiumSkyblock.getConfiguration().chatRankPlaceholder)) {
                if (island == null) {
                    format = format.replace(IridiumSkyblock.getConfiguration().chatRankPlaceholder, "");
                } else {
                    format = format.replace(IridiumSkyblock.getConfiguration().chatRankPlaceholder, Utils.getIslandRank(island) + "");
                }
            }
            if (format.contains(IridiumSkyblock.getConfiguration().chatNAMEPlaceholder)) {
                if (island == null) {
                    format = format.replace(IridiumSkyblock.getConfiguration().chatNAMEPlaceholder, "");
                } else {
                    format = format.replace(IridiumSkyblock.getConfiguration().chatNAMEPlaceholder, island.getName());
                }
            }
            if (format.contains(IridiumSkyblock.getConfiguration().chatValuePlaceholder)) {
                if (island == null) {
                    format = format.replace(IridiumSkyblock.getConfiguration().chatValuePlaceholder, "");
                } else {
                    format = format.replace(IridiumSkyblock.getConfiguration().chatValuePlaceholder, island.getValue() + "");
                }
            }
            if (format.contains(IridiumSkyblock.getConfiguration().chatLevelPlaceholder)) {
                if (island == null) {
                    format = format.replace(IridiumSkyblock.getConfiguration().chatLevelPlaceholder, "");
                } else {
                    format = format.replace(IridiumSkyblock.getConfiguration().chatLevelPlaceholder, String.format("%.2f", island.getValue()));
                }
            }

            if (island != null && user.islandChat) {
                for (String member : island.getMembers()) {
                    final Player islandPlayer = Bukkit.getPlayer(User.getUser(member).name);
                    if (islandPlayer == null) continue;
                    islandPlayer.sendMessage(Utils.color(IridiumSkyblock.getMessages().chatFormat)
                            .replace(IridiumSkyblock.getConfiguration().chatValuePlaceholder, island.getValue() + "")
                            .replace(IridiumSkyblock.getConfiguration().chatNAMEPlaceholder, island.getName())
                            .replace(IridiumSkyblock.getConfiguration().chatLevelPlaceholder, String.format("%.2f", island.getValue()))
                            .replace(IridiumSkyblock.getConfiguration().chatRankPlaceholder, Utils.getIslandRank(island) + "")
                            .replace("%player%", player.getName())
                            .replace("%message%", event.getMessage()));
                }
                event.setCancelled(true);
            }

            event.setFormat(Utils.color(format));
        } catch (Exception e) {
            IridiumSkyblock.getInstance().sendErrorMessage(e);
        }
    }
}