{ 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
      ];
    };
}
