{
  config,
  lib,
  pkgs,
  ...
}: let
  inherit (lib.modules) mkForce;
in {
  nix.gc = {
    automatic = true;
    dates = "weekly";
  };

  sops.secrets.nix-gc-environment = {
    sopsFile = ./secrets.yaml;
  };

  systemd.services.nix-gc = {
    script = let
      cfg = config.nix.gc;
    in
      mkForce ''
        #!/usr/bin/env bash
        set -euo pipefail

        # Helper functions
        send_discord_message() {
            local message="$1"
            local escaped_message=$(printf '%s' "$message" | ${pkgs.jq}/bin/jq -R -s '.')
            ${pkgs.curl}/bin/curl -s -H "Accept: application/json" -H "Content-Type: application/json" \
                 -X POST --data "{\"content\": $escaped_message}" "$DISCORD_WEBHOOK_LINK"
        }

        get_filesystem_usage() {
            ${pkgs.coreutils}/bin/df -h / | ${pkgs.gawk}/bin/awk 'NR==2 {print $5 " (" $3 ")"}' | tr -d '\n'
        }

        calculate_ratio() {
            local before="$1"
            local after="$2"
            ${pkgs.gawk}/bin/awk "BEGIN {printf \"%.2f\", ($after / $before) * 100}"
        }

        # Initial filesystem usage
        FS_BEFORE_USAGE=$(get_filesystem_usage)

        send_discord_message "Beginning nix garbage collection on ${config.networking.hostName} - Filesystem usage before: $FS_BEFORE_USAGE"

        # Perform garbage collection
        OUTPUT=$(${config.nix.package.out}/bin/nix-collect-garbage ${cfg.options})

        # Get filesystem usage after garbage collection
        FS_AFTER_USAGE=$(get_filesystem_usage)

        # Extract numeric values for calculation (assuming format like "75% (15G)")
        BEFORE_PERCENT=$(echo $FS_BEFORE_USAGE | ${pkgs.coreutils}/bin/cut -d'%' -f1)
        AFTER_PERCENT=$(echo $FS_AFTER_USAGE | ${pkgs.coreutils}/bin/cut -d'%' -f1)

        # Calculate ratio
        RATIO=$(calculate_ratio $BEFORE_PERCENT $AFTER_PERCENT)

        send_discord_message "Finished nix garbage collection on ${config.networking.hostName} - Filesystem usage: $FS_BEFORE_USAGE -> $FS_AFTER_USAGE ($RATIO%)"

        # Send the output of nix-collect-garbage
        send_discord_message "$OUTPUT"
      '';

    serviceConfig = {
      EnvironmentFile = config.sops.secrets.nix-gc-environment.path;
      Type = "oneshot";
    };
  };
}
