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

let

  # These micro-scripts change the volume while also triggering the volume
  # notification widget

  increaseVolume = pkgs.writeShellScriptBin "increaseVolume" ''
    ${pkgs.pamixer}/bin/pamixer -i 2
    volume=$(${pkgs.pamixer}/bin/pamixer --get-volume)
    ${pkgs.volnoti}/bin/volnoti-show $volume
  '';

  decreaseVolume = pkgs.writeShellScriptBin "decreaseVolume" ''
    ${pkgs.pamixer}/bin/pamixer -d 2
    volume=$(${pkgs.pamixer}/bin/pamixer --get-volume)
    ${pkgs.volnoti}/bin/volnoti-show $volume
  '';

  toggleMute = pkgs.writeShellScriptBin "toggleMute" ''
    ${pkgs.pamixer}/bin/pamixer --toggle-mute
    mute=$(${pkgs.pamixer}/bin/pamixer --get-mute)
    if [ "$mute" == "true" ]; then
        ${pkgs.volnoti}/bin/volnoti-show --mute
    else
        volume=$(${pkgs.pamixer}/bin/pamixer --get-volume)
        ${pkgs.volnoti}/bin/volnoti-show $volume
    fi
  '';

in {

  config = lib.mkIf (pkgs.stdenv.isLinux && config.gui.enable) {
    sound.enable = true;

    # Enable PipeWire
    services.pipewire = {
      enable = true;
      pulse.enable = true;
    };

    # Provides audio source with background noise filtered
    programs.noisetorch.enable = true;

    # These aren't necessary, but helpful for the user
    environment.systemPackages = with pkgs; [
      pamixer # Audio control
      volnoti # Volume notifications
    ];

    home-manager.users.${config.user} = {

      # Graphical volume notifications
      services.volnoti.enable = true;

      xsession.windowManager.i3.config = {

        # Make sure that Volnoti actually starts (home-manager doesn't start
        # user daemon's automatically)
        startup = [{
          command =
            "systemctl --user restart volnoti --alpha 0.15 --radius 40 --timeout 0.2";
          always = true;
          notification = false;
        }];

        # i3 keybinds for changing the volume
        keybindings = {
          "XF86AudioRaiseVolume" =
            "exec --no-startup-id ${increaseVolume}/bin/increaseVolume";
          "XF86AudioLowerVolume" =
            "exec --no-startup-id ${decreaseVolume}/bin/decreaseVolume";
          "XF86AudioMute" = "exec --no-startup-id ${toggleMute}/bin/toggleMute";
          # We can mute the mic by adding "--default-source"
          "XF86AudioMicMute" =
            "exec --no-startup-id ${pkgs.pamixer}/bin/pamixer --default-source --toggle-mute";
        };

      };

    };
  };

}