{ config, lib, ... }:

let
  cfg = config.plusultra.system.zfs;

  inherit (lib) mkEnableOption mkIf mkDefault;
  inherit (lib.plusultra) mkOpt enabled;
  inherit (lib.types) listOf str;
in
{
  options.plusultra.system.zfs = {
    enable = mkEnableOption "ZFS support";

    pools = mkOpt (listOf str) [ "rpool" ] "The ZFS pools to manage.";

    auto-snapshot = {
      enable = mkEnableOption "ZFS auto snapshotting";
    };
  };

  config = mkIf cfg.enable {
    boot.kernelPackages = config.boot.zfs.package.latestCompatibleLinuxPackages;

    services.zfs = {
      autoScrub = {
        enable = true;
        pools = cfg.pools;
      };

      autoSnapshot = mkIf cfg.auto-snapshot.enable {
        enable = true;
        flags = "-k -p --utc";
        weekly = mkDefault 3;
        daily = mkDefault 3;
        hourly = mkDefault 0;
        frequent = mkDefault 0;
        monthly = mkDefault 2;
      };
    };

    plusultra = {
      tools = {
        icehouse = enabled;
      };
    };
  };
}