{
  lib,
  pkgs,
  config,
  ...
}:

with lib;
let
  cfg = config.programs.git;
in
{
  options.programs.git = {
    profiles = mkOption {
      type = types.attrsOf (
        types.submodule (
          { name, config, ... }:
          {
            options = {
              name = mkOption { type = types.str; };
              email = mkOption { type = types.str; };
              signingKey = mkOption { type = types.str; };
              dirs = mkOption { type = types.listOf types.str; };
            };
          }
        )
      );
    };
    defaultProfile = mkOption { type = types.str; };
  };

  config =
    let
      inherit (cfg) profiles;
    in
    {
      programs.git = {
        # fix/workaround for https://github.com/NixOS/nixpkgs/issues/169193
        extraConfig.safe.directory = "/etc/nixos";

        userName = profiles."${cfg.defaultProfile}".name;
        userEmail = profiles."${cfg.defaultProfile}".email;
        signing = {
          key = profiles."${cfg.defaultProfile}".signingKey;
        };
        includes = flatten (
          mapAttrsToList (
            name: profile:
            map (dir: {
              condition = "gitdir:${dir}";
              contents.user = {
                inherit (profile) name email signingKey;
              };
            }) profile.dirs
          ) profiles
        );
      };
    };
}