{ pkgs, config, ... }:
let
mkConnection = name: cfg: {
    connection = {
        id = name;
        type = "wifi";
    };
    ipv4 = {
        method = "auto";
    };
    ipv6 = {
        method = "auto";
    };
    wifi = {
        ssid = name;
        mode = "infrastructure";
    };
    wifi-security = {
        auth-alg = "open";
        key-mgmt = "wpa-psk";
        psk = cfg.id;
    };
};
connections = {
    "The Buttshark" = {
        id = "$THE_BUTTSHARK";
    };
    "5G Research Tower (5000 Watt)" = {
        id = "$RESEARCH_TOWER";
    };
    "5G Research Tower (2400 Watt)" = {
        id = "$RESEARCH_TOWER";
    };
};
in
{
  services.pcscd.enable = true;
  services.xserver.videoDrivers = ["nvidia"];
  hardware.opengl.extraPackages = [
      pkgs.intel-compute-runtime
      pkgs.intel-media-driver
  ];
  services.thermald.enable = true;
  services.fwupd.enable = true;
  environment.systemPackages = with pkgs; [
      wireguard-tools

      # CUDA
      pciutils
      file
      gnumake
      gcc
      cudatoolkit
  ];
  hardware.nvidia = {
      package = config.boot.kernelPackages.nvidiaPackages.stable;
      modesetting.enable = true;
      powerManagement.enable = false;
      powerManagement.finegrained = true;
      open = false;
      nvidiaSettings = true;
      prime = {
          intelBusId = "PCI:0:2:0";
          nvidiaBusId = "PCI:1:0:0";
          offload = {
              enable = true;
              enableOffloadCmd = true;
          };
      };
  };
  systemd.services.nvidia-control-devices = {
      wantedBy = [ "multi-user.target" ];
      serviceConfig.ExecStart = "${pkgs.linuxPackages.nvidia_x11.bin}/bin/nvidia-smi";
  };
  specialisation = {
      docked.configuration = {
          system.nixos.tags = [ "docked" ];
          hardware.nvidia = {
              powerManagement.finegrained = pkgs.lib.mkForce false;
              prime.offload.enable = pkgs.lib.mkForce false;
              prime.offload.enableOffloadCmd = pkgs.lib.mkForce false;
              prime.sync.enable = pkgs.lib.mkForce true;
          };
      };
  };
  services.udev.packages = [ pkgs.yubikey-personalization ];
  services.logind.extraConfig = ''HandlePowerKey=ignore'';

  # Calendar
  programs.dconf.enable = true;
  services.gnome.evolution-data-server.enable = true;
  services.gnome.gnome-online-accounts.enable = true;
  services.gnome.gnome-keyring.enable = true;

  # Add the server using gnome-online-accounts:
  # nix-shell -p gnome.gnome-control-center --run "gnome-control-center"
  # Just add the main webdav server and gnome-calendar will automatically pick up all available calendars.

  # networking.nameservers = [ "1.1.1.1#one.one.one.one" "1.0.0.1#one.one.one.one" ];
  # services.resolved = {
  #         enable = true;
  #         dnssec = "true";
  #         domains = [ "~." ];
  #         fallbackDns = [ "1.1.1.1#one.one.one.one" "1.0.0.1#one.one.one.one" ];
  #         dnsovertls = "true";
  # };

  networking.wg-quick.interfaces = {
    wg0 = {
      address = [ "10.0.0.5/24" "2a02:a03f:83ad:2101::5/128" ];
      dns = [ "10.0.0.1" "fdc9:281f:04d7:9ee9::1" ];
      privateKeyFile = "/home/user/.secrets/Wireguard/Aloria.key";
      listenPort = 51820;
      # postUp = "resolvectl dns wg0 10.0.0.1; resolvectl domain wg0 ~thomasave.be;";
      peers = [{
        publicKey = "/9ppjm3yeD0duDvxrqgcHscHmftXko+0s2RbivNEy2c=";
        allowedIPs = [ "10.0.0.1/8"  "192.168.1.2/32" ];
        endpoint = "h.thomasave.be:13231";
        persistentKeepalive = 25;
      }];
    };
  };
  networking.networkmanager = {
      enable = true;
      ensureProfiles = {
        environmentFiles = [
            "/home/user/.secrets/Wireless/Aloria.env"
        ];
        profiles = pkgs.lib.mapAttrs mkConnection connections;
      };
  };


  fileSystems."/home/server" = {
    device = "10.1:/home/server";
    fsType = "nfs";
    options = [ "x-systemd.automount" "x-systemd.mount-timeout=1" "_netdev" "noauto" "timeo=1" ];
  };
  fileSystems."/home/user/Workspace" = {
    device = "10.1:/home/server/Workspace";
    fsType = "nfs";
    options = [ "x-systemd.automount" "x-systemd.mount-timeout=1" "_netdev" "noauto" "timeo=1" ];
  };
  fileSystems."/home/user/Documents" = {
    device = "10.1:/home/server/Storage/Thomas/Documents";
    fsType = "nfs";
    options = [ "x-systemd.automount" "x-systemd.mount-timeout=1" "_netdev" "noauto" "timeo=1" ];
  };
  fileSystems."/home/user/Pictures" = {
    device = "10.1:/home/server/Storage/Thomas/Pictures";
    fsType = "nfs";
    options = [ "x-systemd.automount" "x-systemd.mount-timeout=1" "_netdev" "noauto" "timeo=1" ];
  };
  fileSystems."/home/user/Videos" = {
    device = "10.1:/home/server/Storage/Thomas/Videos";
    fsType = "nfs";
    options = [ "x-systemd.automount" "x-systemd.mount-timeout=1" "_netdev" "noauto" "timeo=1" ];
  };
}
