# thanks k900
{
  config,
  lib,
  pkgs,
  ...
}:
let
  cfg = config.mj.plasma;

  setValue =
    v:
    let
      setValueArgs = ty: vs: "--type ${ty} ${lib.escapeShellArg vs}";
    in
    if builtins.isBool v then
      setValueArgs "bool" (if v then "true" else "false")
    else
      setValueArgs "str" (builtins.toString v);

  pathToArgs =
    path:
    let
      groupArg = item: "--group ${lib.escapeShellArg item}";
      groupArgs = builtins.map groupArg path;
    in
    groupArgs;

  entryToArgs =
    { path, value }:
    let
      file = builtins.head path;
      subpath = builtins.tail path;
      groups = lib.lists.init subpath;
      name = lib.lists.last subpath;

      fileArg = "--file ${lib.escapeShellArg file}";
      pathArgs = pathToArgs groups;
      keyArg = "--key ${lib.escapeShellArg name}";
      valueArg = setValue value;
      allArgs = pathArgs ++ [
        fileArg
        keyArg
        valueArg
      ];
    in
    lib.strings.concatStringsSep " " allArgs;

  flattenAttrs =
    attrs: pathSoFar:
    lib.lists.flatten (
      lib.attrsets.mapAttrsToList (
        name: value:
        if builtins.isAttrs value then
          flattenAttrs value (pathSoFar ++ [ name ])
        else
          {
            path = pathSoFar ++ [ name ];
            inherit value;
          }
      ) attrs
    );

  configToArgs = attrs: builtins.map entryToArgs (flattenAttrs attrs [ ]);

  configToScript =
    attrs:
    let
      args = configToArgs attrs;
      argToCommand = arg: "${pkgs.plasma5Packages.kconfig}/bin/kwriteconfig5 ${arg}";
      commands = builtins.map argToCommand args;
    in
    lib.strings.concatStringsSep "\n" commands;

  writeConfig = attrs: pkgs.writeScript "kconfig-setup" (configToScript attrs);
in
{
  options.mj.plasma = {
    kconfig = lib.mkOption {
      type = lib.types.attrs;
      default = { };
    };
  };

  config = lib.mkIf (cfg.kconfig != { }) {
    home.activation.kconfig-setup = "$DRY_RUN_CMD ${writeConfig cfg.kconfig}";
  };
}