package eu.dnetlib.enabling.app;

import java.util.Collection;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.actuate.endpoint.PublicMetrics;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import eu.dnetlib.services.ApiDocUtils;
import io.prometheus.client.exporter.MetricsServlet;
import io.prometheus.client.hotspot.DefaultExports;
import io.prometheus.client.spring.boot.SpringBootMetricsCollector;
import springfox.documentation.spring.web.plugins.Docket;

@Configuration
public class MainConfiguration {

	@Bean
	public Docket api() {
		return ApiDocUtils.newSwaggerDocket();
	}

	@Bean
	@ConditionalOnMissingBean(SpringBootMetricsCollector.class)
	SpringBootMetricsCollector springBootMetricsCollector(final Collection<PublicMetrics> publicMetrics) {

		final SpringBootMetricsCollector springBootMetricsCollector = new SpringBootMetricsCollector(publicMetrics);
		springBootMetricsCollector.register();

		return springBootMetricsCollector;
	}

	@Bean
	@ConditionalOnMissingBean(name = "prometheusMetricsServletRegistrationBean")
	ServletRegistrationBean prometheusMetricsServletRegistrationBean(@Value("${prometheus.metrics.path:/prometheus}") final String metricsPath) {
		DefaultExports.initialize();
		return new ServletRegistrationBean(new MetricsServlet(), metricsPath);
	}

}
