{
  config,
  lib,
  pkgs,
  ...
}:
let
  cfg = config.mj.services.btrfssnapshot;
  svcName =
    subvol: label:
    "btrfs-snapshot-${lib.strings.sanitizeDerivationName subvol}-${lib.strings.sanitizeDerivationName label}";
in
{
  options.mj.services.btrfssnapshot = {
    enable = lib.mkEnableOption "Enable btrfs snapshots";

    subvolumes = lib.mkOption {
      default = { };
      type =
        with lib.types;
        listOf (submodule {
          options = {
            subvolume = lib.mkOption { type = str; };
            label = lib.mkOption { type = str; };
            keep = lib.mkOption { type = int; };
            refreshInterval = lib.mkOption { type = str; };
          };
        });
    };
  };

  config = lib.mkIf cfg.enable {
    systemd = {

      timers = lib.listToAttrs (
        map (
          params:
          lib.nameValuePair (svcName params.subvolume params.label) {
            description = "${params.label} btrfs snapshot for ${params.subvolume}";
            wantedBy = [ "timers.target" ];
            timerConfig.OnCalendar = params.refreshInterval;
          }
        ) cfg.subvolumes
      );

      services = lib.listToAttrs (
        map (
          params:
          lib.nameValuePair (svcName params.subvolume params.label) {
            description = "${params.label} btrfs snapshot for ${params.subvolume} (keep ${builtins.toString params.keep})";
            serviceConfig = {
              Type = "oneshot";
              ExecStart = ''
                ${pkgs.btrfs-auto-snapshot}/bin/btrfs-auto-snapshot \
                              --verbose \
                              --label=${params.label} \
                              --keep=${builtins.toString params.keep} \
                              ${params.subvolume}'';
            };
          }
        ) cfg.subvolumes
      );

    };
  };
}