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

let

  cfg = config.editorconfig;

  iniFormat = pkgs.formats.ini { };

in
{
  meta.maintainers = with lib.maintainers; [ loicreynier ];

  options.editorconfig = {
    enable = lib.mkEnableOption "EditorConfig home configuration file";

    settings = lib.mkOption {
      type = iniFormat.type;
      default = { };
      description = ''
        Configuration written to {file}`$HOME/.editorconfig`.
        `root = true` is automatically added to the file,
        it must not be added here.
        See <https://editorconfig.org> for documentation.
      '';
      example = lib.literalExpression ''
        {
          "*" = {
            charset = "utf-8";
            end_of_line = "lf";
            trim_trailing_whitespace = true;
            insert_final_newline = true;
            max_line_width = 78;
            indent_style = "space";
            indent_size = 4;
          };
        };
      '';
    };
  };

  config = lib.mkIf (cfg.enable && cfg.settings != { }) {
    home.file.".editorconfig".text =
      let
        renderedSettings = lib.generators.toINIWithGlobalSection { } {
          globalSection = {
            root = true;
          };
          sections = cfg.settings;
        };
      in
      ''
        # Generated by Home Manager
        ${renderedSettings}
      '';
  };
}
