module Gitlab::HealthChecks
  class PrometheusText
    def marshal(metrics)
      metrics_with_type_declarations(metrics).join("\n")
    end

    private

    def metrics_with_type_declarations(metrics)
      type_declaration_added = {}

      metrics.flat_map do |metric|
        metric_lines = []

        unless type_declaration_added.has_key?(metric.name)
          type_declaration_added[metric.name] = true
          metric_lines << metric_type_declaration(metric)
        end

        metric_lines << metric_text(metric)
      end
    end

    def metric_type_declaration(metric)
      "# TYPE #{metric.name} gauge"
    end

    def metric_text(metric)
      labels = metric.labels&.map { |key, value| "#{key}=\"#{value}\"" }&.join(',') || ''

      if labels.empty?
        "#{metric.name} #{metric.value}"
      else
        "#{metric.name}{#{labels}} #{metric.value}"
      end
    end
  end
end