package com.playerblocklife;

import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.configuration.file.YamlConfiguration;

import java.io.File;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;

public class MessageManager {
    private final PlayerBlockLife plugin;
    private FileConfiguration messageConfig;
    private File messageFile;
    private final Map<String, String> messageCache = new HashMap<>();
    
    /**
     * 构造一个新的消息管理器
     * 
     * @param plugin 插件主类实例
     */
    public MessageManager(PlayerBlockLife plugin) {
        this.plugin = plugin;
        this.messageFile = new File(plugin.getDataFolder(), "messages.yml");
    }
    
    /**
     * 加载消息配置
     */
    public void loadMessages() {
        ConfigManager config = plugin.getConfigManager();
        
        // 检查是否使用外部消息文件
        if (config.useExternalMessageFile()) {
            String fileName = config.getExternalMessageFileName();
            this.messageFile = new File(plugin.getDataFolder(), fileName);
            
            // 确保配置文件夹存在
            if (!plugin.getDataFolder().exists()) {
                plugin.getDataFolder().mkdirs();
            }
            
            // 如果消息文件不存在，从JAR中复制默认配置
            if (!messageFile.exists()) {
                plugin.saveResource(fileName, false);
                plugin.logInfo("创建默认消息配置文件: " + fileName);
            }
            
            // 加载消息配置
            reloadMessages();
        } else {
            // 使用config.yml中的消息
            plugin.logInfo("使用config.yml中的消息配置");
            messageConfig = null;
            messageCache.clear();
        }
    }
    
    /**
     * 重新加载消息配置
     */
    public void reloadMessages() {
        ConfigManager config = plugin.getConfigManager();
        
        if (!config.useExternalMessageFile()) {
            return;
        }
        
        try {
            messageConfig = YamlConfiguration.loadConfiguration(messageFile);
            
            // 加载默认消息作为后备
            InputStream defaultStream = plugin.getResource(messageFile.getName());
            if (defaultStream != null) {
                YamlConfiguration defaultConfig = YamlConfiguration.loadConfiguration(
                    new InputStreamReader(defaultStream, StandardCharsets.UTF_8));
                messageConfig.setDefaults(defaultConfig);
            }
            
            // 清空缓存
            messageCache.clear();
            
            plugin.logInfo("消息配置已加载: " + messageFile.getName());
        } catch (Exception e) {
            plugin.logError("加载消息配置文件失败", e);
        }
    }
    
    /**
     * 获取消息
     */
    /**
     * 获取消息
     * 
     * @param path 消息路径
     * @param defaultValue 默认值
     * @return 消息内容
     */
    public String getMessage(String path, String defaultValue) {
        ConfigManager config = plugin.getConfigManager();
        
        // 检查缓存
        String cacheKey = path + "|" + defaultValue;
        if (messageCache.containsKey(cacheKey)) {
            return messageCache.get(cacheKey);
        }
        
        String message;
        
        if (config.useExternalMessageFile() && messageConfig != null) {
            // 从外部消息文件获取
            message = messageConfig.getString(path, defaultValue);
            if (message == null) {
                message = defaultValue;
            }
        } else {
            // 从config.yml获取或使用默认值
            message = config.getMessage(path, defaultValue);
        }
        
        // 替换颜色代码
        if (message != null) {
            message = message.replace("&", "§");
        }
        
        // 缓存结果
        messageCache.put(cacheKey, message);
        
        return message;
    }
    
    /**
     * 获取格式化消息（替换变量）
     */
    /**
     * 获取格式化消息（替换变量）
     * 
     * @param path 消息路径
     * @param defaultValue 默认值
     * @param variables 变量映射
     * @return 格式化后的消息内容
     */
    public String getFormattedMessage(String path, String defaultValue, Map<String, String> variables) {
        String message = getMessage(path, defaultValue);
        
        if (message != null && variables != null) {
            for (Map.Entry<String, String> entry : variables.entrySet()) {
                message = message.replace("{" + entry.getKey() + "}", entry.getValue());
            }
        }
        
        return message;
    }
    
    /**
     * 获取控制台消息
     */
    /**
     * 获取控制台消息
     * 
     * @param path 消息路径
     * @param defaultValue 默认值
     * @return 控制台消息内容
     */
    public String getConsoleMessage(String path, String defaultValue) {
        String message = getMessage("console." + path, defaultValue);
        // 移除颜色代码（控制台不需要）
        if (message != null) {
            message = message.replace("§", "&");
        }
        return message;
    }
    
    /**
     * 获取游戏内消息
     */
    /**
     * 获取游戏内消息
     * 
     * @param path 消息路径
     * @param defaultValue 默认值
     * @return 游戏内消息内容
     */
    public String getGameMessage(String path, String defaultValue) {
        return getMessage("game." + path, defaultValue);
    }
    
    /**
     * 获取命令消息
     */
    /**
     * 获取命令消息
     * 
     * @param command 命令名称
     * @param path 消息路径
     * @param defaultValue 默认值
     * @return 命令消息内容
     */
    public String getCommandMessage(String command, String path, String defaultValue) {
        return getMessage("commands." + command + "." + path, defaultValue);
    }
    
    /**
     * 获取广播消息
     */
    /**
     * 获取广播消息
     * 
     * @param path 消息路径
     * @param defaultValue 默认值
     * @return 广播消息内容
     */
    public String getBroadcastMessage(String path, String defaultValue) {
        return getMessage("broadcast." + path, defaultValue);
    }
    
    /**
     * 检查消息文件是否存在
     */
    /**
     * 检查消息文件是否存在
     * 
     * @return 如果外部消息文件存在则返回true，否则返回false
     */
    public boolean hasExternalMessageFile() {
        return messageFile.exists();
    }
    
    /**
     * 获取消息文件路径
     */
    /**
     * 获取消息文件路径
     * 
     * @return 消息文件的绝对路径
     */
    public String getMessageFilePath() {
        return messageFile.getAbsolutePath();
    }
}