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

with lib;

let

  cfg = config.editorconfig;

  iniFormat = pkgs.formats.ini { };

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

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

    settings = mkOption {
      type = iniFormat.type;
      default = { };
      description = ''
        Configuration written to <filename>$HOME/.editorconfig</filename>.
        <code>root = true</code> is automatically added to the file,
        it must not be added here.
        See <link xlink:href="https://editorconfig.org"/> for documentation.
      '';
      example = 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 = mkIf (cfg.enable && cfg.settings != { }) {
    home.file.".editorconfig".text = let
      renderedSettings = generators.toINIWithGlobalSection { } {
        globalSection = { root = true; };
        sections = cfg.settings;
      };
    in ''
      # Generated by Home Manager
      ${renderedSettings}
    '';
  };
}