{
  config,
  pkgs,
  lib,
  ...
}: {
  networking.firewall.allowedUDPPorts = [51820];

  networking.wireguard = {
    enable = true;
    interfaces = {
      # network interface name.
      # You can name the interface arbitrarily.
      wg0 = {
        # the IP address and subnet of this peer
        #ips = ["fc00:5182::1:2/112"];
        ips = [config.local.wireguard-peer-ip];

        # WireGuard Port
        # Must be accessible by peers
        listenPort = config.local.wireguard-peer-port or 51820;

        peers = [
          {
            ## NOTE! CHECK THE .sops.yaml and RUN SOPS `sops updatekeys`!
            name = config.local.wireguard-peer-name or "default-wireguard-peer";
            publicKey = config.sops.secrets.wireguard_public;
            preSharedKey = config.sops.secrets.wireguard_preshared;
            allowedIPs = [
              "::/0" # Route all IPv6 traffic through the VPN, TODO: Dynamic Function to choose between different options
            ];
            endpoint = "wireguard.prg-radio.org:51820";
            #  ToDo: route to endpoint not automatically configured
            # https://wiki.archlinux.org/index.php/WireGuard#Loop_routing
            # https://discourse.nixos.org/t/solved-minimal-firewall-setup-for-wireguard-client/7577
            # Send keepalives every 25 seconds. Important to keep NAT tables alive.
            persistentKeepalive = 60;
          }
        ];
      };
    };
  };
}
