{
  config,
  nixosConfig,
  lib,
  mylib,
  pkgs,
  ...
}: let
  inherit (config.modules) mpd;
in {
  options.modules.mpd = import ./options.nix {inherit lib mylib;};

  config = lib.mkIf mpd.enable {
    services = {
      mpd = {
        enable = true;
        dataDir = "${config.home.homeDirectory}/Music/.mpd";
        musicDirectory = "${config.home.homeDirectory}/Music";
        network = {
          listenAddress = "127.0.0.1"; # Listen on all addresses: "any"
          port = 6600;
        };
        extraArgs = ["--verbose"];

        extraConfig = ''
          # Refresh the database whenever files in the musicDirectory change
          auto_update "yes"

          # Don't start playback after startup
          restore_paused "yes"

          # Use track tags on shuffle and album tags on album play (auto)
          # Use album's tags (album)
          # Use track's tags (track)
          # replaygain "auto"

          # PipeWire main output
          audio_output {
            type "pipewire"
            name "PipeWire Sound Server"

            # Use hardware mixer instead of software volume filter
            # Alternative: replaygain_handler "software"
            # mixer_type "hardware"
            # replay_gain_handler "mixer"
          }

          # FiFo output for cava visualization
          audio_output {
            type   "fifo"
            name   "my_fifo"
            path   "/tmp/mpd.fifo"
            format "44100:16:2"
          }

          # Pre-cache 1GB of the queue
          # input_cache {
          #   size "1 GB"
          # }

          # If mpd should follow symlinks pointing outside the musicDirectory
          # follow_outside_symlinks "no"

          # If mpd should follow symlinks pointing inside the musicDirectory
          # follow_inside_symlinks "yes"
        '';
      };

      # MPD integration with mpris (used by player-ctl).
      # We want to use mpris as it also supports other players (e.g. Spotify) or browsers.
      mpd-mpris = {
        enable = true;
        mpd.useLocal = true;
      };

      mpd-discord-rpc = {
        enable = true;

        # NOTE: Bitch wants to create a default config file inside a
        #       read-only filesystem when changing settings here...
        # settings = {
        #   hosts = "127.0.0.1:${builtins.toString config.services.mpd.network.port}";
        #   format = {
        #     details = "$title";
        #     state = "On $album by $artist";
        #   };
        # };
      };
    };
  };
}
