{ 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);
    };
  };
}