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

let
  inherit (lib) mkDefault mkEnableOption mkIf mkMerge mkOption types;

  cfg = config.microsoft-surface.ipts;

  iptsConfFile = pkgs.writeTextFile {
    name = "iptsd.conf";
    text = lib.generators.toINI { } cfg.config;
  };

in
{
  options.microsoft-surface.ipts = {
    enable = mkEnableOption "Enable IPTSd for Microsoft Surface";

    config = mkOption {
      type = types.attrs;
      default = { };
      description = ''
        Values to wrote to iptsd.conf, first key is section, second key is property.
        See the example config; https://github.com/linux-surface/iptsd/blob/v1.4.0/etc/iptsd.conf
      '';
      example = ''
        DFT = {
          ButtonMinMag = 1000;
        };
      '';
    };
  };

  config = mkMerge [
    {
      microsoft-surface.ipts.enable = mkDefault false;
    }

    (mkIf cfg.enable {
      systemd.services.iptsd = {
        description = "IPTSD";
        path = with pkgs; [ iptsd ];
        script = "iptsd $(iptsd-find-hidraw)";
        wantedBy = [ "multi-user.target" ];
      };
      environment.etc."iptsd/iptsd.conf".source = "${iptsConfFile}";
    })
  ];
}