{ pkgs ? import <nixpkgs> { }
, address
, privateKey
, dns ? "8.8.8.8"
, serverPublicKey
, serverEndpoint
}:

let
  toINI = pkgs.lib.generators.toINI { };

  configs = toINI {
    Interface = {
      # "10.10.10.10/32"
      Address = address;
      # See <system>/notes/vpn.md to generate private key and public key
      PrivateKey = privateKey;
      DNS = dns;
    };
    Peer = {
      # See <system>/notes/vpn.md to generate private key and public key
      PublicKey = serverPublicKey;
      AllowedIPs = "0.0.0.0/0";
      # <hostname>:<port>
      Endpoint = serverEndpoint;
      PersistentKeepalive = 25;
    };
  };

  configFile = pkgs.writeText "wg-client.conf" configs;

  showQrcode = pkgs.writeScript "qrcode" ''
    ${pkgs.qrencode}/bin/qrencode -t ansiutf8 < ${configFile}
  '';
in
pkgs.runCommand "wg-client" { } ''
  mkdir $out;

  cp ${configFile} $out/wg-client.conf;
  cp ${showQrcode} $out/qrcode;
''