{ config, lib, pkgs, inputs, ... }:

with pkgs;

let
  emacs-vterm = ((emacsPackagesFor emacs28NativeComp).emacsWithPackages
    (epkgs: [ epkgs.vterm ]));
  patched-webtorrent-cli = nodePackages.webtorrent-cli.override {
    preRebuild = ''
      sed -i -e "s|#!/usr/bin/env node|#! ${pkgs.nodejs}/bin/node|" node_modules/node-gyp-build/bin.js
    '';
  };
  isync-oauth2 = isync.overrideAttrs
    (div: rec { buildInputs = [ openssl patched-cyrus-sasl-oauth2 zlib ]; });
  mpv-sponsorblock =
    (mpv-with-scripts.override { scripts = [ mpvScripts.sponsorblock ]; });

in {
  environment.systemPackages = [
    # Monitoring
    htop
    acpi
    # Password management
    gnupg
    pass-wayland
    passff-host
    gitAndTools.pass-git-helper
    inputs.agenix.defaultPackage.x86_64-linux
    git-crypt
    # Browsers
    firefox
    ungoogled-chromium
    # LaTeX
    texlive.combined.scheme-full
    pandoc
    texlab
    # Text editors
    neovim
    neovim-remote
    emacs-vterm
    (ripgrep.override { withPCRE2 = true; })
    fd
    clang
    coreutils
    # Terminals
    tmux
    tmuxp
    fish
    # Development
    git
    direnv
    nix-direnv
    podman-compose
    gnumake
    gitAndTools.pre-commit
    # Rice
    adapta-gtk-theme
    paper-icon-theme
    # Audio
    mopidy
    ncmpcpp
    mpc_cli
    pulsemixer
    # Productivity
    fff
    zathura
    libreoffice-fresh
    gnome3.simple-scan
    bc
    citrix_workspace
    # Mail stack
    neomutt
    isync-oauth2
    notmuch
    msmtp
    w3m
    urlscan
    # Media
    gimp
    mpv-sponsorblock
    patched-webtorrent-cli
    deluge
    yt-dlp-light
    calibre
    beets
    # File management
    zip
    unzip
    unar
    cifs-utils
    keyutils
    # Overlays
    cachix
    # Videoconference
    teams
    # Networking
    openvpn
    openconnect-sso
    # Programming tools
    ## Shell
    shellcheck
    shfmt
    ## Nix
    nixfmt
    ## Python
    nodePackages.pyright
    black
    ## C/C++
    clang-tools
    ## Go
    gopls
    gotests
    gore
    golangci-lint
  ];

  # Fonts declaration
  fonts.fonts = with pkgs; [
    google-fonts
    inconsolata-nerdfont
    terminus_font_ttf
    iosevka-bin
    libertine
    emacs-all-the-icons-fonts
  ];

}