{
  pkgs,
  host,
  options,
  ...
}: let
  inherit (import ../../hosts/${host}/variables.nix) hostId;
in {
  assertions = [
    {
      assertion = builtins.match "^[[:alnum:]]([[:alnum:]_-]{0,61}[[:alnum:]])?$" host != null;
      message = "Invalid hostname '${host}'.";
    }
  ];

  networking = {
    hostName = "${host}";
    hostId = hostId;
    networkmanager = {
      enable = true;
      # Enable captive portal detection
      wifi.scanRandMacAddress = true;
    };
    timeServers = options.networking.timeServers.default ++ ["pool.ntp.org"];
    firewall = {
      enable = true;
      allowedTCPPorts = [ 22 80 443 8080 ];
    };
  };

  # Captive portal detection via NetworkManager connectivity checks
  networking.networkmanager.settings.connectivity = {
    uri = "http://nmcheck.gnome.org/check_network_status.txt";
    interval = 300;
  };

  services.resolved = {
    enable = true;
    # allow-downgrade: use DNSSEC when available, but don't fail on captive portals
    dnssec = "allow-downgrade";
    domains = ["~."];
    fallbackDns = ["1.1.1.1#one.one.one.one" "1.0.0.1#one.one.one.one"];
    # opportunistic: prefer DNS-over-TLS but fall back to plain DNS for captive portals
    dnsovertls = "opportunistic";
  };

  environment.systemPackages = with pkgs; [networkmanagerapplet];
}
