# frozen_string_literal: true

require 'prometheus/client'
require 'prometheus/client/formats/text'

##
# Middleware responsible to configure prometheus
# defining metrics and an endpoint to access them.
class PrometheusMiddleware
  attr_accessor :request_duration_milliseconds, :request_count, :response_count

  def configure_prometheus(prometheus_registry, configurations, macaw)
    return nil unless prometheus_registry

    @request_duration_milliseconds = Prometheus::Client::Histogram.new(
      :request_duration_milliseconds,
      docstring: 'The duration of each request in milliseconds',
      labels: [:endpoint],
      buckets: (100..1000).step(100).to_a + (2000..10_000).step(1000).to_a
    )

    @request_count = Prometheus::Client::Counter.new(
      :request_count,
      docstring: 'The total number of requests received',
      labels: [:endpoint]
    )

    @response_count = Prometheus::Client::Counter.new(
      :response_count,
      docstring: 'The total number of responses sent',
      labels: %i[endpoint status]
    )

    prometheus_registry.register(@request_duration_milliseconds)
    prometheus_registry.register(@request_count)
    prometheus_registry.register(@response_count)
    prometheus_endpoint(prometheus_registry, configurations, macaw)
  end

  private

  def prometheus_endpoint(prometheus_registry, configurations, macaw)
    endpoint = configurations['macaw']['prometheus']['endpoint'] || '/metrics'
    macaw.get(endpoint) do |_context|
      [Prometheus::Client::Formats::Text.marshal(prometheus_registry), 200, { 'Content-Type' => 'plaintext' }]
    end
  end
end
