{ depot, pkgs, lib, ... }:
{ ... }:

let
  inherit (depot.users) wpcarro;
  inherit (depot.users.wpcarro.lib) usermod;

  wpcarrosEmacs = wpcarro.emacs.nixos {
    load = [ ./marcus.el ];
  };

  quasselClient = pkgs.quassel.override {
    client = true;
    enableDaemon = false;
    monolithic = false;
  };
in
{
  imports = [
    (depot.path.origSrc + "/users/wpcarro/nixos/marcus/hardware.nix")
    (pkgs.home-manager.src + "/nixos")
    (usermod "laptop.nix")
  ];

  # Use the TVL binary cache
  tvl.cache.enable = true;

  boot.loader.systemd-boot.enable = true;
  boot.loader.efi.canTouchEfiVariables = true;

  networking = {
    # The global useDHCP flag is deprecated, therefore explicitly set to false
    # here.  Per-interface useDHCP will be mandatory in the future, so this
    # generated config replicates the default behaviour.
    useDHCP = false;
    hostName = "marcus";
    networkmanager.enable = true;
    interfaces.enp0s31f6.useDHCP = true;
    interfaces.wlp0s20f3.useDHCP = true;
  };

  services = wpcarro.common.services // {
    # Enable the Tailscale daemon to connect to work and personal Tailnet.
    tailscale.enable = true;

    tzupdate.enable = true;

    depot.auto-deploy = {
      enable = true;
      interval = "1d";
    };

    libinput = {
      enable = true;
      touchpad.naturalScrolling = false;
      touchpad.tapping = false;
    };

    xserver = {
      enable = true;
      xkb.layout = "us";
      xkb.options = "caps:escape";
      displayManager = {
        # Give EXWM permission to control the session (from tazjin's setup).
        sessionCommands = "${pkgs.xorg.xhost}/bin/xhost +SI:localhost:$USER";
        lightdm.enable = true;
      };
      extraConfig = ''
        Section "InputClass"
            Identifier "Touchscreen catchall"
            MatchIsTouchscreen "on"
            Option "Ignore" "on"
        EndSection
      '';
      windowManager.session = lib.singleton {
        name = "exwm";
        start = "${wpcarrosEmacs}/bin/wpcarros-emacs";
      };
    };
  };

  users.mutableUsers = true;
  users.users.wpcarro = {
    isNormalUser = true;
    extraGroups = [
      "networkmanager"
      "wheel"
      "video" # needed to control the screen brightness
    ];
    shell = pkgs.fish;
  };

  security.sudo.wheelNeedsPassword = false;

  fonts = {
    packages = with pkgs; [
      jetbrains-mono
    ];

    fontconfig = {
      defaultFonts = {
        monospace = [ "JetBrains Mono" ];
      };
    };
  };

  programs = wpcarro.common.programs;

  environment.variables = {
    EDITOR = "emacsclient";
    ALTERNATE_EDITOR = "emacs -q -nw";
    VISUAL = "emacsclient";
  };

  home-manager.useGlobalPkgs = true;
  home-manager.users.wpcarro = { config, lib, ... }: {
    programs.git = {
      enable = true;
      userName = "William Carroll";
      userEmail = "wpcarro@gmail.com";
      extraConfig = {
        pull.rebase = true;
      };
    };

    services.picom = {
      enable = true;
      vSync = true;
      backend = "glx";
    };

    services.redshift = {
      enable = true;
      latitude = 37.4223931;
      longitude = -122.0864016;
    };

    services.dunst.enable = true;
    xdg.configFile."dunst/dunstrc" = {
      source = wpcarro.dotfiles.dunstrc;
      onChange = ''
        ${pkgs.procps}/bin/pkill -u "$USER" ''${VERBOSE+-e} dunst || true
      '';
    };

    systemd.user.startServices = true;

    # Previous default version, see https://github.com/nix-community/home-manager/blob/master/docs/release-notes/rl-2211.adoc
    home.stateVersion = "18.09";
  };

  environment.systemPackages =
    wpcarro.common.shell-utils ++
    (with pkgs; [
      alacritty
      firefox
      pavucontrol
      quasselClient
      tdesktop
      weechat
      wpcarrosEmacs
      xsecurelock
    ]);

  system.stateVersion = "21.11";
}
