{ config, lib, ... }:

with lib;

{
  networking = {
    hostName = config.machine.hostName;
    useNetworkd = config.machine.useNetworkd;
    useDHCP = !config.machine.useNetworkd;
    dhcpcd.enable = !config.machine.useNetworkd;
  };
  # Based on
  # https://github.com/NixOS/nixpkgs/issues/10001#issuecomment-905532069
  systemd.network = mkIf config.machine.useNetworkd {
    enable = true;
    networks = let
      networkConfig = {
        DHCP = "yes";
        DNSSEC = "yes";
        DNSOverTLS = "yes";
        DNS = [ "1.1.1.1" "1.0.0.1" ];
      };
    in {
      "40-wired" = {
        enable = true;
        name = "en*";
        dhcpV4Config.RouteMetric = 2048;
        inherit networkConfig;
      };
      "40-wireless" = {
        enable = true;
        name = "wl*";
        dhcpV4Config.RouteMetric = 1024;
        inherit networkConfig;
      };
    };
  };
  # Wait for any interface to become available, not for all
  systemd.services."systemd-networkd-wait-online".serviceConfig.ExecStart = [
    "" "${config.systemd.package}/lib/systemd/systemd-networkd-wait-online --any"
  ];
}