{ config, hosts, lib, ... }:

with lib;

let
  prom_configs =
    (mapAttrs (hostName: host: host.config.services.prometheus.exporters.node)
      (filterAttrs
        (_: host: host.config.services.prometheus.exporters.node.enable)
        hosts));
  nd_configs = (mapAttrs (hostName: host: host.config.services.netdata)
    (filterAttrs (_: host: host.config.services.netdata.enable) hosts));
in
{
  services.prometheus = {
    enable = true;
    scrapeConfigs = [
      {
        job_name = "boline";
        static_configs = [{ targets = [ "boline.net.kittywit.ch:8002" ]; }];
      }
      {
        job_name = "samhain-vm";
        metrics_path = "/metrics";
        static_configs = [{ targets = [ "samhain.net.kittywit.ch:10445" ]; }];
      }
    ] ++ mapAttrsToList
      (hostName: prom: {
        job_name = "${hostName}-nd";
        metrics_path = "/api/v1/allmetrics";
        honor_labels = true;
        params = { format = [ "prometheus" ]; };
        static_configs = [{ targets = [ "${hostName}.net.kittywit.ch:19999" ]; }];
      })
      nd_configs ++ mapAttrsToList
      (hostName: prom: {
        job_name = hostName;
        static_configs = [{
          targets = [ "${hostName}.net.kittywit.ch:${toString prom.port}" ];
        }];
      })
      prom_configs;
  };
}

