{
  config,
  lib,
  pkgs,
  ...
}: let
  inherit
    (lib)
    concatStringsSep
    literalExample
    mapAttrs'
    mkIf
    mkOption
    nameValuePair
    ;

  cfg = config.my.wakeonwlan;

  mkWowlanService = name: cfg:
    nameValuePair "wowlan-${name}" {
      description = "Enable WoWLAN for interface ${name}";
      requires = ["network.target"];
      after = ["network.target"];
      wantedBy = ["multi-user.target"];
      serviceConfig = {
        Type = "oneshot";
      };
      script = ''
        ${pkgs.iw}/bin/iw ${name} wowlan enable ${concatStringsSep " " cfg.methods}
      '';
    };
in {
  options.my.wakeonwlan = let
    inherit (lib) types;
  in {
    interfaces = mkOption {
      default = {};
      description = "Wireless interfaces where you want to enable WoWLAN";
      example = literalExample ''
        {
          phy0.methods = [
            "magic-packet"
            "disconnect"
            "gtk-rekey-failure"
            "eap-identity-request"
            "rfkill-release"
          ];
          phy2.methods = [ "any" ];
        }
      '';
      type = types.attrsOf (
        types.submodule {
          options = {
            methods = mkOption {
              type = types.listOf (types.enum [
                "4way-handshake"
                "any"
                "disconnect"
                "eap-identity-request"
                "gtk-rekey-failure"
                "magic-packet"
                "rfkill-release"
              ]);
              description = "Wake-On-WiFiLan methods for this interface.";
            };
          };
        }
      );
    };
  };

  config = mkIf (cfg.interfaces != {}) {
    systemd.services = mapAttrs' mkWowlanService cfg.interfaces;
  };
}