{ config, pkgs, lib, ...}:
with lib;
let 
  cfg = config.custom.hardware.wooting;
in
{ 
  options.custom.hardware.wooting = {
    enable = mkEnableOption "Enable wooting hardware support";
  };

  config = let
    wooting-udev = pkgs.stdenv.mkDerivation rec {
      pname = "wooting-udev-rules";
      version = "unstable-2023-03-31";

      # Source: https://help.wooting.io/en/article/wootility-configuring-device-access-for-wootility-under-linux-udev-rules-r6lb2o/
      src = [ ./wooting.rules ];

      dontUnpack = true;

      installPhase = ''
        install -Dpm644 $src $out/lib/udev/rules.d/70-wooting.rules
      '';

      meta = with lib; {
        homepage = "https://help.wooting.io/en/article/wootility-configuring-device-access-for-wootility-under-linux-udev-rules-r6lb2o/";
        description = "udev rules that give NixOS permission to communicate with Wooting keyboards";
        platforms = platforms.linux;
        license = "unknown";
        maintainers = with maintainers; [ davidtwco ];
      };
    };
  in mkIf cfg.enable {
    services.udev.packages = [ wooting-udev ];

    environment.systemPackages = with pkgs; [
      wootility
    ];
  };
}
