{ config, lib, ... }:
let
  inherit (builtins) baseNameOf listToAttrs map unsafeDiscardStringContext;
  inherit (lib) literalExpression mkEnableOption mkIf mkOption types;

  cfg = config.xdg.autostart;

  /* "/nix/store/x-foo/application.desktop" -> {
       name = "autostart/application.desktop";
       value = { source = "/nix/store/x-foo/application.desktop"; };
     }
  */
  mapDesktopEntry = entry: {
    name = "autostart/${unsafeDiscardStringContext (baseNameOf entry)}";
    value.source = entry;
  };
in {
  meta.maintainers = with lib.maintainers; [ Scrumplex ];

  options.xdg.autostart = {
    enable = mkEnableOption "creation of XDG autostart entries";

    entries = mkOption {
      type = with types; listOf path;
      description = ''
        Paths to desktop files that should be linked to `XDG_CONFIG_HOME/autostart`
      '';
      default = [ ];
      example = literalExpression ''
        [
          "''${pkgs.evolution}/share/applications/org.gnome.Evolution.desktop"
        ]
      '';
    };
  };

  config = mkIf (cfg.enable && cfg.entries != [ ]) {
    xdg.configFile = listToAttrs (map mapDesktopEntry cfg.entries);
  };
}