# 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 =
    [ # Include the results of the hardware scan.
      ./hardware-configuration.nix
      # <home-manager/nixos>
    ];

  # List packages installed in system profile. To search, run:
  # $ nix search wget
  environment.systemPackages = with pkgs; [
  #  vim # Do not forget to add an editor to edit configuration.nix! The Nano editor is also installed by default.
  #  wget
    ansible
    birdtray
    bitwarden-cli
    bitwarden-desktop
    bitwarden-menu
    brave
    btop
    calibre
    contrast
    curl
    ddev
    diffr
    dmidecode
    docker
    dog
    fish
    fishPlugins.done
    firefoxpwa
    fsearch
    gimp-with-plugins
    git
    git-open
    gnucash
    gnumake
    htop
    hunspell
    hunspellDicts.en_US-large
    hunspellDicts.es_MX
    jq
    kdePackages.filelight
    kdePackages.isoimagewriter
    kdePackages.kasts
    kdePackages.kcalc
    kdePackages.kcolorchooser
    # kdePackages.kdenetwork-filesharing
    # kdePackages.keysmith
    kdePackages.konqueror
    kdePackages.kontrast
    kdePackages.krecorder
    kdePackages.kruler
    kdePackages.partitionmanager
    keepassxc
    kirc
    libinput
    libreoffice-qt6-still
    # light
    lshw
    magic-wormhole
    md2pdf
    meld
    mkcert
    mmv
    neovim
    nextcloud-client
    # nfs-utils
    nix-search-cli
    php # does PHP 8.2 currently and there's php81, php83, and php84 alternatives
    php82Packages.composer
    (python3.withPackages(ps: with ps; [ numpy pandas python-dotenv ])) # https://github.com/NixOS/nixpkgs/blob/master/doc/languages-frameworks/python.section.md#environment-defined-in-etcnixosconfigurationnix-environment-defined-in-etcnixosconfigurationnix (note this is literally the last thing they wanted me to do, would rather it not be global)
    poppins
    postgresql
    qrscan
    radiotray-ng # Prefer shortwave for real radio
    recoll
    reveal-md
    rink
    rofi
    samba
    shortwave
    signal-desktop
    slack
    strawberry-qt6
    textpieces
    thunderbird
    tor-browser
    transmission_4-qt
    trashy
    vimPlugins.vim-fetch
    vimPlugins.vim-wayland-clipboard
    wget
    whois
    vlc
    vscodium
    # wcalc - command-line calculator but rink does that plus unit conversion!
    wl-clipboard-rs
    xorg.xkill
    yt-dlp
    zoxide
    zulip
    zulip-term
  ];
  environment.pathsToLink = [ "/share/fish" ];

  # Add ~/.local/bin/ to $PATH
  environment.localBinInPath = true;
  environment.homeBinInPath = true;  
  # Only this works, from https://github.com/NixOS/nixpkgs/issues/157383#issuecomment-1186081648
  environment.shellInit = ''
    export PATH="$PATH:$HOME/.local/bin"
  '';

  # Needed for Slack but probably helps other stuff too.
  # See https://wiki.nixos.org/wiki/Slack
  environment.sessionVariables.NIXOS_OZONE_WL = "1";

  # Make it possible for ddev to modify the /etc/hosts file.
  # Otherwise you'll have to manually change the
  # hosts configuration after creating a new ddev project.
  environment.etc.hosts.mode = "0644";

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

  networking.hostName = "nixos"; # Define your hostname.
  # networking.wireless.enable = true;  # Enables wireless support via wpa_supplicant.

  # Configure network proxy if necessary
  # networking.proxy.default = "http://user:password@proxy:port/";
  # networking.proxy.noProxy = "127.0.0.1,localhost,internal.domain";

  # Enable networking
  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";
  };

  # Just make bin/bash work, see https://github.com/Mic92/envfs
  # via the long, sad https://discourse.nixos.org/t/add-bin-bash-to-avoid-unnecessary-pain/5673/37
  services.envfs.enable = true;

  # Via https://github.com/NixOS/nixos-hardware/tree/master/framework
  services.fwupd.enable = true;
  services.fwupd.extraRemotes = [ "lvfs-testing" ];
  # Might be necessary once to make the update succeed
  services.fwupd.uefiCapsuleSettings.DisableCapsuleUpdateOnDisk = true;

  # 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;

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

  # Configure console keymap
  console.keyMap = "dvorak";

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

  # Enable sound with pipewire.
  hardware.pulseaudio.enable = false;
  security.rtkit.enable = true;

  # Enable samba network filesharing in Dolphin
  # security.wrappers = {
  #  mount.source = "${pkgs.utillinux}/bin/mount";
  #  umount.source = "${pkgs.utillinux}/bin/umount";
  #};
  #security.wrappers."mount.nfs".source = "${pkgs.nfs-utils.out}/bin/mount.nfs";

  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;
  };

  # Install & enable docker.
  virtualisation.docker.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.mlncn = {
    isNormalUser = true;
    description = "mlncn";
    extraGroups = [ "networkmanager" "wheel" "docker" ];
    packages = with pkgs; [
      discord
      kdePackages.kate
      logseq
    ];
    # Per Chris for SSHing from the old machine to here
    openssh.authorizedKeys.keys = [ "ssh-ed25519 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIIc/pc2oL80XjIeeazzT5YOCrEaPW7uohA/qlmGr5cM6 mlncn@d64" ];
  };
  # home-manager.users.mlncn = { pkgs, ... }: {
  #  home.packages = [
  #    pkgs.atool
  #    pkgs.httpie
  #  ];
  #  programs.bash.enable = true;
  #  programs.fish.enable = true;

    # The state version is required and should stay at the version you
    # originally installed.
  #  home.stateVersion = "24.05";
  # };
  # home-manager.useUserPackages = true;
  # home-manager.useGlobalPkgs = true;


  # Install firefox.
  programs.firefox.enable = true;
  programs.firefox.nativeMessagingHosts.packages = [ pkgs.firefoxpwa ];
  programs.fish.enable = true;
  programs.bash = {
    interactiveShellInit = ''
      if [[ $(${pkgs.procps}/bin/ps --no-header --pid=$PPID --format=comm) != "fish" && -z ''${BASH_EXECUTION_STRING} ]]
      then
        shopt -q login_shell && LOGIN_OPTION='--login' || LOGIN_OPTION=""
        exec ${pkgs.fish}/bin/fish $LOGIN_OPTION
      fi
    '';
  };

  # Allow unfree packages
  nixpkgs.config.allowUnfree = true;

  # TODO remove this when Logseq gets its act together
  nixpkgs.config.permittedInsecurePackages = [
    "electron-27.3.11"
  ];

  # 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;
  networking.firewall.allowedTCPPorts = [ 9003 ];

  # 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.05"; # Did you read the comment?

}