{
  lib,
  config,
  ...
}:
with lib;

let

in
{
  options = {
    grafana = {
      enable = mkEnableOption "enables grafana";
      port = lib.mkOption {
        type = lib.types.int;
        default = 2342;
        description = "The port Grafana listens on.";
      };
      host = mkOption {
        type = types.str;
        defaultText = literalExpression "127.0.0.1";
        description = "The hostname that Grafana binds to";
      };
      domain = mkOption {
        type = types.str;
        description = "Domain name for Grafana to be served on.";
      };
    };
    alloy = {
      enable = mkEnableOption "enables alloy";
      configPath = lib.mkOption {
        type = lib.types.path;
        default = ./alloy.yaml;
        description = "The path to the configPath.";
      };
    };
    prometheus = {
      enable = mkEnableOption "enables prometheus";
      port = lib.mkOption {
        type = lib.types.int;
        default = 9001;
        description = "The port Prometheus listens on.";
      };
      exporters = {
        enable = mkEnableOption "enables node exporters";
        port = lib.mkOption {
          type = lib.types.int;
          default = 9002;
          description = "The port Prometheus node exporter listens on.";
        };
      };
    };
    loki = {
      enable = mkEnableOption "enables prometheus";
      configFile = lib.mkOption {
        type = lib.types.path;
        default = ./loki.yaml;
        description = "The path to the configFile.";
      };
      dataDir = lib.mkOption {
        type = lib.types.str;
        default = "/var/loki";
        description = "The path to the data directory.";
      };
    };
  };

  config = mkMerge [
    (mkIf config.grafana.enable {
      # services.grafana = {
      #   enable = true;
      #   settings = {
      #     server = {
      #       domain = config.grafana.domain;
      #       http_port = config.grafana.port;
      #       http_addr = config.grafana.host;
      #     };
      #   };
      # };

      # nginx reverse proxy
      # services.nginx.virtualHosts."${config.grafana.domain}" = {
      #   enableACME = true;
      #   forceSSL = true;
      #   locations."/" = {
      #     proxyPass = "http://${config.grafana.host}:${toString config.grafana.port}";
      #     proxyWebsockets = true;
      #     extraConfig = "proxy_ssl_server_name on;" + "proxy_pass_header Authorization;";
      #   };
      # };
    })
    (mkIf config.loki.enable {
      networking.firewall.allowedTCPPorts = [ 3100 ];
      services.loki = {
        enable = true;
        configFile = config.loki.configFile;
        dataDir = config.loki.dataDir;
      };
    })
    (mkIf config.alloy.enable {
      services.alloy = {
        enable = true;
        configPath = config.alloy.configPath;
      };
    })

    (mkIf config.prometheus.enable {
      services.prometheus = {
        enable = true;
        port = config.prometheus.port;
        exporters = mkIf config.prometheus.exporters.enable {
          node = {
            enable = true;
            enabledCollectors = [ "systemd" ];
            port = config.prometheus.exporters.port;
          };
        };
        scrapeConfigs = [
          {
            job_name = "desktop";
            static_configs = [
              {
                targets = [ "${config.grafana.host}:${toString config.prometheus.exporters.port}" ];
              }
            ];
          }
        ];
      };
    })
  ];
}
