package fr.luc.gamingcore.listener;

import fr.luc.gamingcore.Main;
import fr.luc.gamingcore.manager.GuildManager;
import fr.luc.gamingcore.model.Guild;
import fr.luc.gamingcore.model.GuildMember;
import fr.luc.gamingcore.model.GuildRank;
import fr.luc.gamingcore.util.MessageManager;
import fr.luc.gamingcore.util.TextUtil;
import io.papermc.paper.event.player.AsyncChatEvent;
import net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;

/**
 * Écouteur gérant le chat privé de guilde.
 * Permet aux joueurs d'écrire dans le chat de guilde en préfixant leur message par '#' (ex: # Salut la guilde !).
 */
public class GuildChatListener implements Listener {

    private final Main plugin;
    private final GuildManager guildManager;
    private final MessageManager messageManager;

    /**
     * Constructeur de l'écouteur de chat de guilde.
     *
     * @param plugin Instance principale du plugin.
     */
    public GuildChatListener(Main plugin) {
        this.plugin = plugin;
        this.guildManager = plugin.getGuildManager();
        this.messageManager = plugin.getMessageManager();
    }

    /**
     * Intercepte les messages de chat commençant par '#' pour les rediriger exclusivement vers la guilde du joueur.
     *
     * @param event L'événement AsyncChatEvent de Paper.
     */
    @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true)
    public void onAsyncChat(AsyncChatEvent event) {
        String rawText = PlainTextComponentSerializer.plainText().serialize(event.message()).trim();
        if (!rawText.startsWith("#")) {
            return;
        }

        event.setCancelled(true);
        Player sender = event.getPlayer();

        Guild guild = guildManager.getGuildByPlayer(sender.getUniqueId());
        if (guild == null) {
            messageManager.send(sender, "guild.not_in_guild");
            return;
        }

        String guildMsg = rawText.substring(1).trim();
        if (guildMsg.isEmpty()) {
            return;
        }

        sendGuildChatMessage(guild, sender, guildMsg);
    }

    /**
     * Diffuse un message formaté dans le canal privé de la guilde à tous les membres connectés.
     *
     * @param guild   La guilde émettrice.
     * @param sender  Le joueur ayant envoyé le message.
     * @param message Le texte du message.
     */
    public void sendGuildChatMessage(Guild guild, Player sender, String message) {
        GuildMember member = guild.getMember(sender.getUniqueId());
        GuildRank rank = member != null ? guild.getRank(member.getRankId()) : null;
        String rankName = rank != null ? rank.getName() : "Membre";

        String formatted = messageManager.get("guild.chat.format",
                "{guild}", guild.getFormattedName(),
                "{tag}", guild.getFormattedTag(),
                "{color}", guild.getColor(),
                "{rank}", rankName,
                "{player}", sender.getName(),
                "{message}", message
        );

        for (GuildMember m : guild.getMembers()) {
            if (m.getOfflinePlayer() != null && m.getOfflinePlayer().isOnline()) {
                Player onlinePlayer = m.getOfflinePlayer().getPlayer();
                if (onlinePlayer != null) {
                    TextUtil.sendMessage(onlinePlayer, formatted);
                }
            }
        }
    }
}
