inputs: {
  config,
  lib,
  pkgs,
  ...
}: let
  cfg = config.services.testdata;
  package = inputs.self.packages.${pkgs.stdenv.hostPlatform.system}.default;
  inherit (lib) mkIf mkEnableOption mkOption types;

  format = pkgs.formats.json {};
  configFile = format.generate "config.json" cfg.settings;
in {
  options.services.testdata = {
    enable = mkEnableOption "testdata";

    settings = mkOption {
      type = with types; let
        valueType = nullOr (oneOf [
          # TODO: restrict type to actual config file structure
          bool
          int
          float
          str
          path
          (attrsOf valueType)
          (listOf valueType)
        ]);
      in
        valueType;
      default = throw "Please specify services.testdata.settings";
    };

    host = mkOption {
      type = types.str;
      default = throw "Please specify a services.testdata.port";
    };

    port = mkOption {
      type = types.int;
      default = throw "Please specify a services.testdata.port";
    };
  };

  config = mkIf cfg.enable {
    environment.systemPackages = [package];

    systemd.services.testdata = {
      enable = true;

      serviceConfig = {
        Type = "simple";
        ExecStart = "${package}/bin/testdata --config ${configFile} --listen ${cfg.host} --port ${builtins.toString cfg.port}";
      };

      wantedBy = ["multi-user.target"];
    };
  };
}