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

  cfg = config.services.gnome-keyring;

in
{
  meta.maintainers = [ lib.maintainers.rycee ];

  options = {
    services.gnome-keyring = {
      enable = lib.mkEnableOption "GNOME Keyring";

      package = lib.mkPackageOption pkgs "gnome-keyring" { };

      components = lib.mkOption {
        type = lib.types.listOf (
          lib.types.enum [
            "pkcs11"
            "secrets"
            "ssh"
          ]
        );
        default = [ ];
        description = ''
          The GNOME keyring components to start. If empty then the
          default set of components will be started.
        '';
      };
    };
  };

  config = lib.mkIf cfg.enable {
    assertions = [
      (lib.hm.assertions.assertPlatform "services.gnome-keyring" pkgs lib.platforms.linux)
      {
        assertion = !config.services.pass-secret-service.enable;
        message = ''
          Only one secrets service per user can be enabled at a time.
          Other services enabled:
          - pass-secret-service
        '';
      }
    ];

    systemd.user.services.gnome-keyring = {
      Unit = {
        Description = "GNOME Keyring";
        PartOf = [ "graphical-session-pre.target" ];
      };

      Service = {
        ExecStart =
          let
            args = lib.concatStringsSep " " (
              [
                "--start"
                "--foreground"
              ]
              ++ lib.optional (cfg.components != [ ]) ("--components=" + lib.concatStringsSep "," cfg.components)
            );
          in
          "${lib.getExe' cfg.package "gnome-keyring-daemon"} ${args}";
        Restart = "on-abort";
      };

      Install = {
        WantedBy = [ "graphical-session-pre.target" ];
      };
    };
  };
}
