# This is a common user configuration.
{
  const,
  util,
  config,
  lib,
  __findFile,
  ...
}@args:
with lib;
let
  cfg = config.home.hm;
  package = import <package> args;
  programs = import ./program args;
in
{
  options = {
    home.hm = {
      enable = mkEnableOption "Home-Manager standalone config.";
      username = mkOption {
        default = null;
        type = types.str;
      };
      homeDirectory = mkOption {
        default = "/home/${cfg.username}";
        type = types.str;
      };
      package = mkOption {
        default = { };
        type = types.submodule {
          options = {
            common.enable = mkEnableOption "Common apps.";
            core.enable = mkEnableOption "Core apps.";
            creative.enable = mkEnableOption "Creative apps.";
            desktop.enable = mkEnableOption "Desktop apps.";
            dev.enable = mkEnableOption "Dev apps.";
            extra.enable = mkEnableOption "Extra apps.";
            gaming.enable = mkEnableOption "Gaming apps.";
          };
        };
      };
    };
  };

  config = mkIf cfg.enable (mkMerge [
    {
      home = {
        inherit (cfg) username homeDirectory;
        inherit (const) stateVersion;
        file = import ./config args;
        sessionVariables = import ./variable args;
      };
      xdg = import ./xdg { inherit (cfg) homeDirectory; };
      programs = with programs; core;
      dconf.settings = util.catSet (util.ls ./config/dconf) args;
    }
    (mkIf cfg.package.common.enable { home.packages = package.common; })
    (mkIf cfg.package.core.enable { home.packages = package.core; })
    (mkIf cfg.package.creative.enable { home.packages = package.creative; })
    (mkIf cfg.package.desktop.enable {
      home = {
        packages = package.desktop;
        programs = programs.desktop;
      };
    })
    (mkIf cfg.package.dev.enable { home.packages = package.dev; })
    (mkIf cfg.package.extra.enable { home.packages = package.extra; })
    (mkIf cfg.package.gaming.enable { home.packages = package.gaming; })
  ]);
}