# SPDX-FileCopyrightText: 2020 Luke Granger-Brown <depot@lukegb.com>
#
# SPDX-License-Identifier: Apache-2.0

{ depot, lib, pkgs, ... }@args:
let
  inherit (builtins) foldl' mapAttrs;
  baseModule = name: { ... }: {
    _module.args = args // {
      rebuilder = rebuilder name;
    };
  };
  systemFor = systemName: config:
    (depot.third_party.nixeval {
      system = builtins.currentSystem;
      modules = [ (baseModule systemName) (args: { imports = [ lib/common.nix config ]; }) ];
    });
  systems = [ "porcorosso" "ixvm-fra01" "marukuru" "clouvider-fra01" "totoro" "kusakabe" "swann" "clouvider-lon01" ];
  rebuilder = system: (import ./lib/rebuilder.nix (args // { system = system; }));
  systemCfgs = lib.genAttrs systems
    (name: import (./. + "/${name}"));
  evaledSystems = mapAttrs systemFor systemCfgs;
  systemDrvs = mapAttrs (_: sys: sys.config.system.build.toplevel) evaledSystems;
  systemTailscaleIPs = lib.mapAttrs' (n: v: lib.nameValuePair v [n]) (lib.filterAttrs (n: v: v != null) (mapAttrs (_: sys: sys.config.my.ip.tailscale) evaledSystems));

  systemExporters = builtins.listToAttrs (builtins.concatLists (lib.mapAttrsToList (sysName: sys: lib.mapAttrsToList (exporterName: exporter: let jobName = "${sysName}/exporters/${exporterName}"; in lib.nameValuePair jobName {
    job_name = jobName;
    static_configs = [{
      targets = ["${sysName}:${toString exporter.port}"];
      labels = {
        system = sysName;
        exporter = exporterName;
      };
    }];
  }) (lib.filterAttrs (_: exporter: exporter.enable) sys.config.services.prometheus.exporters)) evaledSystems));
in systemDrvs // {
  systems = systemDrvs;
  systemExporters = systemExporters;
  tailscaleIPs = systemTailscaleIPs;
}