let
  wslBackupBase =
    { pkgs, lib, ... }:
    let
      inherit (lib.lists) singleton;
    in
    {
      systemd.services.nixos-wsl-backup = {
        description = "NixOS-WSL System Backup";

        serviceConfig = {
          Type = "oneshot";
          User = "root";
          ExecStart = "/home/jam/wsl-backup.nu";
        };

        path = [
          pkgs.nix
          pkgs.git
          pkgs.nushell
        ];
      };

      systemd.timers.nixos-wsl-backup = {
        enable = true;
        description = "Run NixOS-WSL backup every 6 hours";
        wantedBy = singleton "timers.target";
        timerConfig = {
          OnBootSec = "1min";
          OnUnitActiveSec = "4h";
          Persistent = true;
        };
      };

      hjem.extraModules = singleton {
        files."wsl-backup.nu" = {
          executable = true;
          text = /* nu */ ''
            #!/usr/bin/env nu
            def log [msg: string, level: string = "INFO"] {
              let timestamp = (date now | format date '%Y-%m-%d %H:%M:%S')
              print $"[($timestamp)] ($level): ($msg)"
            }

            def main [] {
              log "Starting NixOS-WSL backup..."

              let nixos_host    = "pear"
              let github_repo   = "plumj-am/nixos"
              let windows_drive = "c"
              let windows_user  = "james"
              let windows_base  = $"/mnt/($windows_drive)/Users/($windows_user)"
              let backup_path   = $"($windows_base)/nixos-wsl-backup"
              let backup_file   = $"($backup_path)/nixos.wsl"

              log "Checking prerequisites..."

              if not ($windows_base | path exists) {
                log $"Windows mount not available at ($windows_base)" "ERROR"
                exit 1
              }

              try {
                ^mkdir --parents $backup_path
              } catch { |e|
                log $"Cannot create backup directory: ($e.msg)" "ERROR"
                exit 1
              }

              let temp_dir = try {
                ^mktemp -d
              } catch { |e|
                log $"Cannot create temp directory: ($e.msg)" "ERROR"
                exit 1
              }

              log "Prerequisites check passed"

              log "Cloning repository..."
              cd $temp_dir
              try {
                ^git clone https://github.com/($github_repo).git repo
                cd repo
              } catch { |e|
                log $"Git clone failed: ($e.msg)" "ERROR"
                ^rm -rf $temp_dir
                exit 1
              }

              log "Building system tarball..."
              try {
                ^sudo nix run .#nixosConfigurations.($nixos_host).config.system.build.tarballBuilder --accept-flake-config
              } catch { |e|
                log $"Tarball build failed: ($e.msg)" "ERROR"
                ^rm -rf $temp_dir
                exit 1
              }

              let tarball_path = "nixos.wsl"
              if not ($tarball_path | path exists) {
                log $"Could not find generated tarball at ($tarball_path)" "ERROR"
                ^rm -rf $temp_dir
                exit 1
              }
              log $"Found tarball: ($tarball_path)"

              log "Copying to backup location..."
              try {
                ^cp $tarball_path $backup_file
                log "Backup completed successfully!" "SUCCESS"
                log $"Backup located at: ($backup_file)"
              } catch { |e|
                log $"Copy failed: ($e.msg)" "ERROR"
                log $"Tarball available at: ($temp_dir)/repo/($tarball_path)" "WARN"
                ^rm -rf $temp_dir
                exit 1
              }

              ^rm -rf $temp_dir
              log "Cleanup completed"
            }
          '';
        };
      };
    };
in
{
  flake.modules.nixos.wsl-backup = wslBackupBase;
}