{
  config,
  lib,
  pkgs,
  ...
}:
with lib;
let
  cfg = config.qois.backplane-net;
  hostName = config.networking.hostName;
  netConfig = config.qois.meta.network.virtual.${cfg.netName};
  hostNetConfig = netConfig.hosts.${hostName};
  interface = "wg-${cfg.netName}";
  wgService = [ "wireguard-${interface}.service" ];
in

{
  options.qois.backplane-net = {
    enable = mkEnableOption "Enable backplane server services";
    netName = mkOption {
      description = "Network Name";
      type = types.str;
      default = "backplane";
    };
    domain = mkOption {
      description = "Domain";
      type = types.str;
      default = hostNetConfig;
    };
    port = mkOption {
      description = "Wireguard Default Port";
      type = types.number;
      default = 51825;
    };
  };

  config = {
    sops.secrets."wgautomesh/gossip-secret".restartUnits = [ "wgautomesh.service" ];

    networking.wireguard.enable = true;
    networking.wireguard.interfaces."wg-${cfg.netName}" = {
      ips = [ "${hostNetConfig.v4.ip}/${toString netConfig.v4.prefixLength}" ];
      listenPort = if hostNetConfig.endpoint != null then hostNetConfig.endpoint.port else cfg.port;
      privateKeyFile = "/secrets/wireguard/private/${cfg.netName}";
      generatePrivateKeyFile = true;
    };

    systemd.network.wait-online.ignoredInterfaces = [ interface ];

    networking.firewall.allowedUDPPorts =
      if hostNetConfig.endpoint != null then [ hostNetConfig.endpoint.port ] else [ cfg.port ];

    # Configure wgautomesh to setup peers. Make sure that the name is not used in the VPN module
    services.wgautomesh = {
      enable = true;
      gossipSecretFile = config.sops.secrets."wgautomesh/gossip-secret".path;
      openFirewall = true;
      settings = {
        inherit interface;

        # Map meta network configuration to the format of wgautomesh and filter out peers with endpoints
        peers = pipe netConfig.hosts [
          (filterAttrs (peerHostName: _: peerHostName != hostName)) # Not this host
          (mapAttrsToList (
            _: peerConfig: {
              address = peerConfig.v4.ip;
              endpoint =
                if (peerConfig.endpoint != null) then
                  with peerConfig.endpoint; "${fqdn}:${toString port}"
                else
                  null;
              pubkey = peerConfig.publicKey;
            }
          ))
        ];
      };
    };
    systemd.services.wgautomesh = {
      requires = wgService;
      after = wgService;
    };
  };
}
