package eu.mrneznamy.mrultimatelibrary;

import eu.mrneznamy.mrultimatelibrary.gui.MrLibGUIManager;
import eu.mrneznamy.mrultimatelibrary.placeholders.MrLibPlaceholderExpansion;
import eu.mrneznamy.mrultimatelibrary.economy.MrLibVaultManager;
import eu.mrneznamy.mrultimatelibrary.holograms.MrLibHologramFacade;
import eu.mrneznamy.mrultimatelibrary.utils.MrLibConsoleSayer;
import eu.mrneznamy.mrultimatelibrary.utils.MrLibUpdateChecker;
import eu.mrneznamy.mrultimatelibrary.utils.MrLibColors;
import java.awt.Color;
import java.io.File;
import org.bukkit.Bukkit;
import org.bukkit.plugin.java.JavaPlugin;
import org.bukkit.command.CommandSender;
import java.util.List;
import eu.mrneznamy.mrultimatelibrary.commands.MrUltimateLibraryCommand;

public final class MrUltimateLibrary {

    public static final String VERSION = "1.0.1";
    private static JavaPlugin instance;

    public static void init(JavaPlugin plugin) {
        instance = plugin;
        eu.mrneznamy.mrultimatelibrary.utils.MrLibConsoleSayer.setHostPluginName(plugin.getName());
        eu.mrneznamy.mrultimatelibrary.utils.MrLibConfig.init(plugin);
    }

    public static void start() {

        
        eu.mrneznamy.mrultimatelibrary.stats.MrNeznamyStats.init(instance);

        
        if (instance.getName().equals("MrUltimateLibrary")) {
            MrLibRegisterPlugin.register(instance, "MrUltimateLibrary");
        }

        
        MrLibVaultManager.getInstance();

        
        MrLibHologramFacade hologramFacade = MrLibHologramFacade.getInstance();
        String preferredProvider = eu.mrneznamy.mrultimatelibrary.utils.MrLibConfig.getConfig()
                .getString("hologram-provider");
        if (preferredProvider != null && !preferredProvider.isEmpty()) {
            hologramFacade.setPreferredProvider(preferredProvider);
        }

        Bukkit.getPluginManager().registerEvents(new MrLibGUIManager(), instance);

        try {
            if (Bukkit.getPluginManager().getPlugin("PlaceholderAPI") != null) {
                new MrLibPlaceholderExpansion().register();
                MrLibConsoleSayer.MrSay_Success("PlaceholderAPI expansion registered!");
            }
        } catch (Throwable t) {
            try {
                reportError("mrultimatelibrary", t, "Failed to register PlaceholderAPI expansion");
            } catch (Throwable ignored) {}
        }

        
        eu.mrneznamy.mrultimatelibrary.utils.MrLibPluginUpdater.registerPlugin("MrUltimateLibrary",
                "MrUltimateLibrary");

        
        instance.getServer().getPluginManager()
                .registerEvents(new eu.mrneznamy.mrultimatelibrary.listeners.MrLibUpdateListener(instance), instance);

        MrLibConsoleSayer.MrSay_Info("MrUltimateLibrary &7v" + VERSION + " &fby &b_MrNeznamy_ &7initialized.");
        MrLibConsoleSayer.MrSay_Success("MrUltimateLibrary enabled!");

        
        try {
            MrUltimateLibraryCommand libraryCommand = new MrUltimateLibraryCommand(instance);

            
            org.bukkit.command.PluginCommand command = instance.getCommand("MrUltimateLibrary");
            if (command != null) {
                command.setExecutor(libraryCommand);
                command.setTabCompleter(libraryCommand);
            } else {
                
                final org.bukkit.command.SimpleCommandMap commandMap;
                java.lang.reflect.Field field = org.bukkit.Bukkit.getServer().getClass().getDeclaredField("commandMap");
                field.setAccessible(true);
                commandMap = (org.bukkit.command.SimpleCommandMap) field.get(org.bukkit.Bukkit.getServer());

                
                org.bukkit.command.defaults.BukkitCommand dynamicCommand = new org.bukkit.command.defaults.BukkitCommand(
                        "mrultimatelibrary") {
                    @Override
                    public boolean execute(CommandSender sender, String label, String[] args) {
                        return libraryCommand.onCommand(sender, this, label, args);
                    }

                    @Override
                    public java.util.List<String> tabComplete(CommandSender sender, String alias, String[] args) {
                        return libraryCommand.onTabComplete(sender, this, alias, args);
                    }
                };

                dynamicCommand.setDescription("Main command for MrUltimateLibrary");
                dynamicCommand.setPermission("MrUltimateLibrary.admin");
                dynamicCommand.setAliases(java.util.Arrays.asList("mrlib", "mrlibrary", "mrlibcore"));

                commandMap.register("mrultimatelibrary", dynamicCommand);
            }
        } catch (Throwable ignored) {
        }

        eu.mrneznamy.mrultimatelibrary.utils.MrLibStartupPrinter.print(instance);
    }

    public static void stop() {
        
        eu.mrneznamy.mrultimatelibrary.stats.MrNeznamyStats.shutdown();

        
        try {
            MrLibHologramFacade hologramManager = MrLibHologramFacade.getInstance();
            if (hologramManager != null) {
                hologramManager.cleanupAllHolograms();
            }

            
            int removed = 0;
            for (org.bukkit.World world : org.bukkit.Bukkit.getWorlds()) {
                for (org.bukkit.entity.Entity entity : world.getEntities()) {
                    if (entity instanceof org.bukkit.entity.TextDisplay) {
                        if (entity.hasMetadata("MrUltimateLibrary-Hologram")) {
                            entity.remove();
                            removed++;
                        }
                    }
                }
            }
            if (removed > 0) {
                MrLibConsoleSayer.MrSay_Info("Removed " + removed + " TextDisplay entities on shutdown");
            }
        } catch (Throwable e) {
            instance.getLogger().warning("Error cleaning up holograms: " + e.getMessage());
        }

        MrLibConsoleSayer.MrSay_Info("MrUltimateLibrary disabled!");
    }

    /**
     * Reports an error to MrNeznamy analytics.
     * 
     * @param pluginSlug The slug of the plugin where the error occurred.
     * @param throwable  The exception that occurred.
     * @param message    Optional additional message or context.
     */
    public static void reportError(String pluginSlug, Throwable throwable, String message) {
        if (getInstance() != null && !getInstance().getConfig().getBoolean("enable-error-reporting", true)) {
            return;
        }
        eu.mrneznamy.mrultimatelibrary.stats.MrNeznamyStats.reportError(pluginSlug, throwable, message);
    }

    public static void reportError(String pluginSlug, Throwable throwable) {
        reportError(pluginSlug, throwable, throwable != null ? throwable.getMessage() : "Unknown error");
    }

    public static JavaPlugin getInstance() {
        return instance;
    }
}
