# Edit this configuration file to define what should be installed on
# your system.  Help is available in the configuration.nix(5) man page
# and in the NixOS manual (accessible by running ‘nixos-help’).
{
  config,
  pkgs,
  ...
}: {
  imports = [
  ];

  # Setup nixbuild.net, since this laptop is somewhat under powered
  programs.ssh.extraConfig = ''
    Host eu.nixbuild.net
      PubkeyAcceptedKeyTypes ssh-ed25519
      ServerAliveInterval 60
      IPQoS throughput
      IdentityFile /home/nathan/.ssh/id_ed25519
      ControlMaster auto
  '';
  programs.ssh.knownHosts = {
    nixbuild = {
      hostNames = ["eu.nixbuild.net"];
      publicKey = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIPIQCZc54poJ8vqawd8TraNryQeJnvH1eLpIDgbiqymM";
    };
  };

  # Configure nix
  nix = {
    settings = {
      # Auto optimize the store after every action
      auto-optimise-store = true;
      trusted-users = [
        "root"
        "nathan"
      ];
    };
    # GC agressively
    gc = {
      automatic = true;
      dates = "daily";
      options = "--delete-older-than 7d";
    };
    distributedBuilds = true;
    buildMachines = [
      {
        hostName = "eu.nixbuild.net";
        system = "x86_64-linux";
        maxJobs = 100;
        supportedFeatures = [
          "benchmark"
          "big-parallel"
        ];
      }
    ];
  };

  # Bootloader and plymouth
  boot = {
    loader = {
      systemd-boot = {
        enable = true;
        consoleMode = "auto";
      };
      efi.canTouchEfiVariables = true;
    };
    plymouth = {
      enable = true;
    };
  };

  # Steam setup
  programs.steam = {
    enable = true;
    gamescopeSession = {
      enable = true;
      args = [
        "--expose-wayland"
      ];
    };
  };

  networking.hostName = "crash"; # Define your hostname.

  services.tailscale.enable = true;

  networking.networkmanager.enable = true;

  # Set your time zone.
  time.timeZone = "America/New_York";

  # Select internationalisation properties.
  i18n.defaultLocale = "en_US.UTF-8";

  i18n.extraLocaleSettings = {
    LC_ADDRESS = "en_US.UTF-8";
    LC_IDENTIFICATION = "en_US.UTF-8";
    LC_MEASUREMENT = "en_US.UTF-8";
    LC_MONETARY = "en_US.UTF-8";
    LC_NAME = "en_US.UTF-8";
    LC_NUMERIC = "en_US.UTF-8";

    LC_PAPER = "en_US.UTF-8";
    LC_TELEPHONE = "en_US.UTF-8";
    LC_TIME = "en_US.UTF-8";
  };

  # Enable the X11 windowing system.
  # You can disable this if you're only using the Wayland session.
  services.xserver.enable = true;

  # Enable the KDE Plasma Desktop Environment.
  services.displayManager.sddm.enable = true;
  services.desktopManager.plasma6.enable = true;
  environment.sessionVariables.NIXOS_OZONE_WL = "1";
  # Setup bluetooth
  hardware.bluetooth.enable = true;

  # Configure keymap in X11
  services.xserver.xkb = {
    layout = "us";
    variant = "";
  };

  # Enable CUPS to print documents.
  services.printing.enable = true;

  # Enable sound with pipewire.
  hardware.pulseaudio.enable = false;
  security.rtkit.enable = true;
  services.pipewire = {
    enable = true;
    alsa.enable = true;
    alsa.support32Bit = true;
    pulse.enable = true;
    # If you want to use JACK applications, uncomment this
    #jack.enable = true;

    # use the example session manager (no others are packaged yet so this is enabled by default,
    # no need to redefine it in your config for now)
    #media-session.enable = true;
  };

  # Enable touchpad support (enabled default in most desktopManager).
  # services.xserver.libinput.enable = true;

  # Define a user account. Don't forget to set a password with ‘passwd’.
  users.users.nathan = {
    extraGroups = ["networkmanager"];
  };

  # List packages installed in system profile. To search, run:
  # $ nix search wget
  environment.systemPackages = with pkgs; [
    # Touch stuff
    libinput
    maliit-keyboard
    dconf-editor
    iptsd
    surface-control
    wl-clipboard
    # Podman
    podman-desktop
    podman-compose
    # System tools
    gparted
    f2fs-tools
  ];

  virtualisation.podman = {enable = true;};

  # Enable sway
  programs.sway = {
    enable = true;
    package = pkgs.swayfx;
  };

  # We need to use a fork of iptsd for the LiftTimeout option
  # https://github.com/linux-surface/iptsd/issues/166#issuecomment-2391567615
  nixpkgs.overlays = let
    iptsd_overlay = self: super: {
      iptsd = super.iptsd.overrideAttrs (prev: {
        src = pkgs.fetchFromGitHub {
          owner = "wvffle";
          repo = "iptsd";
          rev = "9c3e4c7b85767a3239bb2ba1ee12430ba5c92a86";
          hash = "sha256-wyCstqTpyFDLRe/AGFrjJi9A+txwkFNbsW4KLNcMf1Q=";
        };
      });
    };
  in [iptsd_overlay];
  # Setup iptsd for touch and stylus support
  services.iptsd = {
    enable = true;
    config = {
      Touchscreen = {
        DisableOnPalm = true;
        DisableOnStylus = true;
      };
      Contacts = {
        SizeMin = "0.775";
        SizeMax = "1.710";
        AspectMin = "1.005";
        AspectMax = "1.470";
      };
      Stylus = {
        LiftTimeout = "0.07";
      };
      DFT = {
        PositionMinAmp = "10";
      };
    };
  };

  # Since this _is_ a tablet, waydroid time
  virtualisation.waydroid.enable = true;

  # And thermald
  services.thermald = {
    enable = true;
  };

  # Other power saving goodies
  hardware.enableAllFirmware = true;
  services.tlp = {
    enable = false;
    settings = {
      CPU_SCALING_GOVERNOR_ON_AC = "performance";
      CPU_SCALING_GOVERNOR_ON_BAT = "powersave";

      CPU_ENERGY_PERF_POLICY_ON_BAT = "power";
      CPU_ENERGY_PERF_POLICY_ON_AC = "performance";
    };
  };
  powerManagement.enable = true;
  services.power-profiles-daemon.enable = true;
  services.cpupower-gui.enable = true;

  # Nvidia gpu setup
  hardware.nvidia = {
    open = true;
    prime = {
      intelBusId = "PCI:0:2:0";
      nvidiaBusId = "PCI:2:0:0";
    };
  };

  # Some programs need SUID wrappers, can be configured further or are
  # started in user sessions.
  # programs.mtr.enable = true;
  # programs.gnupg.agent = {
  #   enable = true;
  #   enableSSHSupport = true;
  # };

  # List services that you want to enable:

  # Enable the OpenSSH daemon.
  # services.openssh.enable = true;

  # Open ports in the firewall.
  # networking.firewall.allowedTCPPorts = [ ... ];
  # networking.firewall.allowedUDPPorts = [ ... ];
  # Or disable the firewall altogether.
  networking.firewall.enable = false;

  # This value determines the NixOS release from which the default
  # settings for stateful data, like file locations and database versions
  # on your system were taken. It‘s perfectly fine and recommended to leave
  # this value at the release version of the first install of this system.
  # Before changing this value read the documentation for this option
  # (e.g. man configuration.nix or on https://nixos.org/nixos/options.html).

  system.stateVersion = "24.11"; # Did you read the comment?
}