{
  config,
  lib,
  ...
}:
with lib; let
  cfg = config.homelab.backups;

  # Get restic backend config if it exists
  resticBackend = cfg.backends.restic or null;
  resticEnabled = resticBackend.enable or false;

  # Filter jobs that use the restic backend
  resticJobs = filter (job: job.backend == "restic") cfg.jobs;
in {
  options.homelab.backups.backends.restic = mkOption {
    type = types.nullOr (types.submodule {
      options = {
        enable = mkEnableOption "Restic backup backend";

        # Default restic options - these map directly to services.restic.backups.<name>
        repository = mkOption {
          type = types.str;
          description = "Default repository for restic backups";
        };

        initialize = lib.mkOption {
          type = lib.types.bool;
          default = true;
          description = ''
            Create the repository if it doesn't exist.
          '';
        };

        passwordFile = mkOption {
          type = types.nullOr types.path;
          default = null;
          description = "Default password file for restic repository";
        };

        environmentFile = mkOption {
          type = types.nullOr types.path;
          default = null;
          description = "Default environment file for restic credentials";
        };

        paths = mkOption {
          type = types.listOf types.str;
          default = [];
          description = "Default paths to backup";
        };

        exclude = mkOption {
          type = types.listOf types.str;
          default = [];
          description = "Default exclude patterns";
        };

        timerConfig = mkOption {
          type = types.attrs;
          default = {
            OnCalendar = "daily";
            RandomizedDelaySec = "1h";
          };
          description = "Default timer configuration";
        };

        pruneOpts = mkOption {
          type = types.listOf types.str;
          default = [
            "--keep-daily 7"
            "--keep-weekly 4"
            "--keep-monthly 6"
          ];
          description = "Default pruning options";
        };

        # Allow any other restic options
        extraOptions = mkOption {
          type = types.attrs;
          default = {};
          description = "Additional default restic options";
        };
      };
    });
    default = null;
    description = "Restic backend configuration";
  };

  config = mkIf (cfg.enable && resticEnabled && length resticJobs > 0) {
    # Configure restic service for each job using the restic backend
    services.restic.backups = listToAttrs (map (
        job: let
          # Get base config without the 'enable' field
          baseConfig = removeAttrs resticBackend ["enable"];
          # Merge extraOptions into base config
          baseWithExtras = recursiveUpdate (removeAttrs baseConfig ["extraOptions"]) (baseConfig.extraOptions or {});
          # Apply job-specific overrides
          finalConfig = recursiveUpdate baseWithExtras job.backendOptions;
        in
          nameValuePair job.name finalConfig
      )
      resticJobs);
  };
}
