// Path: src/main/java/de/sldk/mc/MetricRegistry.java
// public class MetricRegistry {
// 
//     private static final MetricRegistry INSTANCE = new MetricRegistry();
//     
//     private final List<Metric> metrics = new ArrayList<>();
// 
//     private MetricRegistry() {
//         
//     }
//     
//     public static MetricRegistry getInstance() {
//         return INSTANCE;
//     }
//     
//     public void register(Metric metric) {
//         this.metrics.add(metric);
//     }
// 
//     void collectMetrics() {
//         this.metrics.forEach(Metric::collect);
//     }
// 
// }
// 
// Path: src/main/java/de/sldk/mc/PrometheusExporter.java
// public class PrometheusExporter extends JavaPlugin {
// 
//     private final PrometheusExporterConfig config = new PrometheusExporterConfig(this);
//     private MetricsServer server;
// 
//     @Override
//     public void onEnable() {
// 
//         config.loadDefaultsAndSave();
// 
//         config.enableConfiguredMetrics();
// 
//         startMetricsServer();
//     }
// 
//     private void startMetricsServer() {
//         String host = config.get(PrometheusExporterConfig.HOST);
//         Integer port = config.get(PrometheusExporterConfig.PORT);
// 
// 		server = new MetricsServer(host, port, this);
// 
//         try {
//             server.start();
//             getLogger().info("Started Prometheus metrics endpoint at: " + host + ":" + port);
//         } catch (Exception e) {
//             getLogger().severe("Could not start embedded Jetty server");
//         }
//     }
// 
//     @Override
//     public void onDisable() {
//         try {
//             server.stop();
//         } catch (Exception e) {
//             getLogger().log(Level.WARNING, "Failed to stop metrics server gracefully: " + e.getMessage());
//             getLogger().log(Level.FINE, "Failed to stop metrics server gracefully", e);
//         }
//     }
// 
// }


import de.sldk.mc.MetricRegistry;
import de.sldk.mc.PrometheusExporter;
import de.sldk.mc.metrics.*;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.plugin.Plugin;
import java.util.Arrays;
import java.util.List;
import java.util.function.Function;
    }

    private static MetricConfig metricConfig(String key, boolean defaultValue, Function<Plugin, Metric> metricInitializer) {
        return new MetricConfig(key, defaultValue, metricInitializer);
    }

    public void loadDefaultsAndSave() {
        FileConfiguration configFile = prometheusExporter.getConfig();

        PrometheusExporterConfig.HOST.setDefault(configFile);
        PrometheusExporterConfig.PORT.setDefault(configFile);
        PrometheusExporterConfig.METRICS.forEach(metric -> metric.setDefault(configFile));

        configFile.options().copyDefaults(true);

        prometheusExporter.saveConfig();
    }

    public void enableConfiguredMetrics() {
        PrometheusExporterConfig.METRICS
                .forEach(metricConfig -> {
                    Metric metric = metricConfig.getMetric(prometheusExporter);
                    Boolean enabled = get(metricConfig);

                    if (Boolean.TRUE.equals(enabled)) {
                        metric.enable();
                    }

                    prometheusExporter.getLogger().fine("Metric " + metric.getClass().getSimpleName() + " enabled: " + enabled);

// Path: src/main/java/de/sldk/mc/MetricRegistry.java
// public class MetricRegistry {
// 
//     private static final MetricRegistry INSTANCE = new MetricRegistry();
//     
//     private final List<Metric> metrics = new ArrayList<>();
// 
//     private MetricRegistry() {
//         
//     }
//     
//     public static MetricRegistry getInstance() {
//         return INSTANCE;
//     }
//     
//     public void register(Metric metric) {
//         this.metrics.add(metric);
//     }
// 
//     void collectMetrics() {
//         this.metrics.forEach(Metric::collect);
//     }
// 
// }
// 
// Path: src/main/java/de/sldk/mc/PrometheusExporter.java
// public class PrometheusExporter extends JavaPlugin {
// 
//     private final PrometheusExporterConfig config = new PrometheusExporterConfig(this);
//     private MetricsServer server;
// 
//     @Override
//     public void onEnable() {
// 
//         config.loadDefaultsAndSave();
// 
//         config.enableConfiguredMetrics();
// 
//         startMetricsServer();
//     }
// 
//     private void startMetricsServer() {
//         String host = config.get(PrometheusExporterConfig.HOST);
//         Integer port = config.get(PrometheusExporterConfig.PORT);
// 
// 		server = new MetricsServer(host, port, this);
// 
//         try {
//             server.start();
//             getLogger().info("Started Prometheus metrics endpoint at: " + host + ":" + port);
//         } catch (Exception e) {
//             getLogger().severe("Could not start embedded Jetty server");
//         }
//     }
// 
//     @Override
//     public void onDisable() {
//         try {
//             server.stop();
//         } catch (Exception e) {
//             getLogger().log(Level.WARNING, "Failed to stop metrics server gracefully: " + e.getMessage());
//             getLogger().log(Level.FINE, "Failed to stop metrics server gracefully", e);
//         }
//     }
// 
// }


// Path: src/main/java/de/sldk/mc/config/PrometheusExporterConfig.java
import de.sldk.mc.MetricRegistry;
import de.sldk.mc.PrometheusExporter;
import de.sldk.mc.metrics.*;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.plugin.Plugin;
import java.util.Arrays;
import java.util.List;
import java.util.function.Function;

    }

    private static MetricConfig metricConfig(String key, boolean defaultValue, Function<Plugin, Metric> metricInitializer) {
        return new MetricConfig(key, defaultValue, metricInitializer);
    }

    public void loadDefaultsAndSave() {
        FileConfiguration configFile = prometheusExporter.getConfig();

        PrometheusExporterConfig.HOST.setDefault(configFile);
        PrometheusExporterConfig.PORT.setDefault(configFile);
        PrometheusExporterConfig.METRICS.forEach(metric -> metric.setDefault(configFile));

        configFile.options().copyDefaults(true);

        prometheusExporter.saveConfig();
    }

    public void enableConfiguredMetrics() {
        PrometheusExporterConfig.METRICS
                .forEach(metricConfig -> {
                    Metric metric = metricConfig.getMetric(prometheusExporter);
                    Boolean enabled = get(metricConfig);

                    if (Boolean.TRUE.equals(enabled)) {
                        metric.enable();
                    }

                    prometheusExporter.getLogger().fine("Metric " + metric.getClass().getSimpleName() + " enabled: " + enabled);

                    MetricRegistry.getInstance().register(metric);