{
  config,
  pkgs,
  lib,
  ...
}: {
  options = {
    crony.restic.enable = lib.mkEnableOption "Install and setup restic and backup services.";
  };

  config = lib.mkIf config.crony.restic.enable {
    # Install restic package
    home.packages = with pkgs; [
      restic
    ];

    ##-- Restic Timers And Services --##

    # Restic backup
    systemd.user.services = {
      restic_backup = {
        Unit.Description = "Restic backup service";
        Service = {
          Type = "oneshot";
          ExecStart = toString (pkgs.writeShellScript "restic-backup" ''
            . /etc/restic/local
            restic backup --files-from /home/crony/.config/restic/list --verbose && restic forget --keep-last 10 --keep-daily 7 --keep-weekly 5 --keep-monthly 12
            . /etc/restic/online
            restic backup --files-from /home/crony/.config/restic/list --verbose && restic forget --keep-last 10 --keep-daily 7 --keep-weekly 5 --keep-monthly 12
            rsync -avP --delete "$HOME/.local/backup/" "$HOME/Documents/Share/"
          '');
        };
      };
    };
    systemd.user.timers = {
      restic_backup = {
        Unit.Description = "Restic backup timer";
        Timer = {
          OnBootSec = "5m";
          OnUnitActiveSec = "6h";
        };
        Install.WantedBy = ["timers.target"];
      };
    };

    # Restic check
    systemd.user.services = {
      restic_check = {
        Unit.Description = "Restic check service";
        Service = {
          Type = "oneshot";
          ExecStart = toString (pkgs.writeShellScript "restic-check" ''
            . /etc/restic/local
            restic check --read-data-subset=10%
            . /etc/restic/online
            restic check --read-data-subset=10%
          '');
        };
      };
    };
    systemd.user.timers = {
      restic_check = {
        Unit.Description = "Restic check timer";
        Timer = {OnCalendar = "Thu *-*-* 18:00:00";};
        Install.WantedBy = ["timers.target"];
      };
    };

    # Restic prune
    systemd.user.services = {
      restic_prune = {
        Unit.Description = "Restic prune service";
        Service = {
          Type = "oneshot";
          ExecStart = toString (pkgs.writeShellScript "restic-prune" ''
            . /etc/restic/local
            restic prune
            . /etc/restic/online
            restic prune
          '');
        };
      };
    };
    systemd.user.timers = {
      restic_prune = {
        Unit.Description = "Restic prune timer";
        Timer = {OnCalendar = "Fri *-*-* 18:00:00";};
        Install.WantedBy = ["timers.target"];
      };
    };
  };
}