package de.xxx.metrics;

import io.micrometer.core.instrument.Gauge;
import io.micrometer.core.instrument.MeterRegistry;
import jakarta.annotation.PostConstruct;
import jakarta.annotation.security.PermitAll;
import jakarta.ejb.Singleton;
import jakarta.ejb.Startup;
import jakarta.inject.Inject;
import lombok.Getter;
import org.jboss.logging.Logger;

import java.io.File;
import java.util.function.Supplier;

@Singleton
@Startup
@PermitAll
public class MicrometerService {

    @Getter
    private final Logger logger = Logger.getLogger(getClass());

    @Inject
    private MeterRegistry meterRegistry;


    @PostConstruct
    private void postConstruct() {

        logger.info(String.format("MeterRegistry initialized: %s", meterRegistry != null));
        Gauge.builder("SessionManagementBean.serverLogSize", measureServerFileSizeMetric()).register(meterRegistry);
    }

    public MeterRegistry getRegistry() {
        return meterRegistry;
    }

    private Supplier<Number> measureServerFileSizeMetric() {
        String serverLogFile = getServerLogFile();
        if (serverLogFile == null) {
            return () -> null;
        }
        File logFile = new File(serverLogFile);
        if (logFile.exists() && logFile.isFile()) {
            return logFile::length;
        }
        return () -> null;
    }

    private String getServerLogFile() {
        String logDir = System.getProperty("jboss.server.log.dir");
        if (logDir == null || logDir.isEmpty()) {
            return null;
        }
        String serverLogFile;
        if (logDir.endsWith(File.separator)) {
            serverLogFile = String.format("%s%s", logDir, "server.log");
        } else {
            serverLogFile = String.format("%s%s%s", logDir, File.separator, "server.log");
        }
        return serverLogFile;
    }
}