{ config, pkgs, ... }:

{
  imports =
    [
      ./common-headless.nix
      # ./sway.nix
      ./i3.nix
      ./large-sw.nix
      ./uefi.nix
      ./fstrim.nix
      ./atmega.nix
      ./v4l2loopback.nix
      ./huion.nix
      ./nvim05.nix
      ./nm-restart.nix
    ];

  hardware.enableRedistributableFirmware = true;
  boot.initrd.availableKernelModules = [ "xhci_pci" "nvme" "usb_storage" "sd_mod" "rtsx_pci_sdmmc" ];
  boot.kernelModules = [
    "kvm-intel"
    "rmi_smbus"
    "i2c_hid"
    "psmouse"
  ];

  fileSystems."/" =
    { device = "/dev/disk/by-uuid/c87491ed-0dd6-4eb4-bef2-fe4c707e91f2";
      fsType = "ext4";
    };

  fileSystems."/boot" =
    { device = "/dev/disk/by-uuid/E526-BAB7";
      fsType = "vfat";
    };

  swapDevices = [ ];

  nix.settings.max-jobs = 4;

  environment.etc."lvm/lvm.conf".text = ''
    devices {
      issue_discards = 1
    }
  '';
  boot.initrd.luks.devices = {
    nvme0n1p2 = {
      device = "/dev/disk/by-uuid/5ca3d7ec-3f9e-4a08-8bc2-b26bfc3459c5";
      preLVM = true;
      allowDiscards = true;
    };
  };

  services.xserver = {
    dpi = 120;

    libinput.enable = true;
    config = ''
      Section "InputClass"
        Identifier "touchpad"
        Driver "libinput"
        MatchDevicePath "/dev/input/event*"
        MatchIsPointer "true"
      EndSection
    '';

    videoDrivers = [ "modesetting" ];
    useGlamor = true;
  };
  programs.light.enable = true;

  services.tlp.enable = true;

  networking.hostName = "petalius";
  networking.hostId = "cf58caa9";

  hardware.cpu.intel.updateMicrocode = true;

  # systemd.services.ModemManager = {
  #   enable = true;
  #   wantedBy = [ "multi-user.target" ];
  # };

  hardware.opengl.extraPackages = [ pkgs.vaapiIntel ];

  nixpkgs.config.packageOverrides = pkgs: rec {
  };

  # environment.systemPackages = with pkgs; [
  #   unison
  # ];

  users.extraUsers.gebner.extraGroups = [ "libvirtd" ];
  virtualisation.libvirtd.enable = true;

  # virtualisation.waydroid.enable = true;

  # virtualisation.virtualbox.host.enable = true;

  # boot.kernelPackages = pkgs.lib.mkOverride 10 pkgs.linuxPackages_5_4;

  # boot.kernelPackages = pkgs.lib.mkOverride 10 pkgs.linuxPackages_5_5;

  # boot.kernelPackages = pkgs.lib.mkOverride 10 pkgs.linuxPackages_4_19;
  boot.kernelPatches = [
    # { patch = ./len0073.patch; name = "len0073"; }
  ];
  boot.kernelParams = [
    # "psmouse.synaptics_intertouch=1"
    "psmouse.proto=imps"
  ];

  # time.timeZone = pkgs.lib.mkOverride 10 "Asia/Tokyo";
  # time.timeZone = pkgs.lib.mkOverride 10 "Europe/London";
  # time.timeZone = pkgs.lib.mkOverride 10 "Europe/Lisbon";
  # time.timeZone = pkgs.lib.mkOverride 10 "US/Eastern";

  #services.avahi.nssmdns = true;

  system.stateVersion = "18.03";

  networking.wireguard.interfaces.wg0 = {
    ips = ["10.59.0.2/16"];
    privateKeyFile = "/etc/wgkeys/petalius";
    allowedIPsAsRoutes = true;
    postSetup = ''
      ${pkgs.systemd}/bin/resolvectl domain wg0 '~htdf.gebner.org' '~mtlaa.gebner.org' '~ams.gebner.org'
      ${pkgs.systemd}/bin/resolvectl dns wg0 10.58.0.1
    '';
    peers = [{
      publicKey = "ByLlJbevlTBooAo2RIZGGJvBHKqA9qiOpHBvR5yuJX4=";
      allowedIPs = ["10.56.0.0/14" "10.60.1.1"];
      # endpoint = "htdf-gw.gebner.org:35869";
      # endpoint = "80.109.2.154:35869";
      endpoint = "127.0.0.1:35869";
    }];
  };
  systemd.services.wireguard-wg0.wantedBy = pkgs.lib.mkOverride 10 [];

  systemd.services.wstunnel = {
    path = [ pkgs.wstunnel ];
    wantedBy = [ "wireguard-wg0.service" ];
    after = [ "network.target" ];
    script = ''
      wstunnel -L 35869:htdf-gw.gebner.org:35869 -u wss://gebner.org
    '';
  };

  services.resolved = {
    domains = [];
    enable = true;
  };

  # environment.systemPackages = [
  #   (pkgs.callPackage ./bluez-alsa.nix {})
  # ];

  services.fwupd.enable = true;

}