{ config, lib, ... }:

let
  cfg = config.xdg;

  xdgDirsOption = {
    configDirs = lib.mkOption {
      type = with lib.types; listOf str;
      description = ''
        A list of paths to be appended as part of the `XDG_CONFIG_DIRS`
        environment to be applied per-wrapper.
      '';
      default = [ ];
      example = lib.literalExpression ''
        wrapperManagerLib.getXdgConfigDirs (with pkgs; [
          yt-dlp
          neofetch
        ])
      '';
    };

    dataDirs = lib.mkOption {
      type = with lib.types; listOf str;
      description = ''
        A list of paths to be appended as part of the `XDG_DATA_DIRS`
        environment to be applied per-wrapper.
      '';
      default = [ ];
      example = lib.literalExpression ''
        wrapperManagerLib.getXdgDataDirs (with pkgs; [
          yt-dlp
          neofetch
        ])
      '';
    };
  };
in
{
  options.xdg = xdgDirsOption;

  options.wrappers = lib.mkOption {
    type =
      let
        xdgDirsType =
          {
            name,
            lib,
            config,
            ...
          }:
          {
            options.xdg = xdgDirsOption;

            config = lib.mkMerge [
              {
                # When set this way, we could allow the user to override everything.
                xdg.configDirs = cfg.configDirs;
                xdg.dataDirs = cfg.dataDirs;
              }

              (lib.mkIf (config.xdg.configDirs != [ ]) {
                env.XDG_CONFIG_DIRS.value = lib.lists.map builtins.toString config.xdg.configDirs;
                env.XDG_CONFIG_DIRS.action = "prefix";
              })

              (lib.mkIf (config.xdg.dataDirs != [ ]) {
                env.XDG_DATA_DIRS.value = lib.lists.map builtins.toString config.xdg.dataDirs;
                env.XDG_DATA_DIRS.action = "prefix";
              })
            ];
          };
      in
      with lib.types;
      attrsOf (submodule xdgDirsType);
  };
}
