# Build ISO image
#   nix build --extra-experimental-features nix-command --extra-experimental-features flakes .#iso.odo
#   output: result/iso/nixos.iso

# Run the ISO image
#   "$(nix-build '<nixpkgs>' --no-out-link -A 'qemu')/bin/qemu-system-x86_64" \
#        -accel kvm \
#        -cpu host \
#        -smp cores=8 \
#        -m 32768 \
#        -drive "file=$(nix-build '<nixpkgs>' --no-out-link -A 'OVMF.fd')/FV/OVMF.fd,if=pflash,format=raw,readonly=on" \
#        -drive if=pflash,format=raw,file="/tmp/OVMF_VARS.fd" \
#        -nic user,hostfwd=tcp::60022-:22 \
#        -boot order=d \
#        -cdrom "$(readlink -f ./result/iso/nixos.iso)" \
#        -display vnc=127.0.0.1:0
#
# doas cp "$(nix-build '<nixpkgs>' --no-out-link -A 'OVMF.fd')/FV/OVMF_VARS.fd" /tmp/OVMF_VARS.fd
# doas "$(nix-build '<nixpkgs>' --no-out-link -A 'qemu')/bin/qemu-system-x86_64" -accel kvm -cpu host -smp cores=8 -m 32768 -drive "file=$(nix-build '<nixpkgs>' --no-out-link -A 'OVMF.fd')/FV/OVMF.fd,if=pflash,format=raw,readonly=on" -drive if=pflash,format=raw,file="/tmp/OVMF_VARS.fd" -nic user,hostfwd=tcp::60022-:22 -boot order=d -cdrom /persist/machine_setup/nix/configuration/result/iso/nixos.iso -display vnc=127.0.0.1:0

# Get a repl for this flake
#   nix repl --expr "builtins.getFlake \"$PWD\""

# TODO maybe use `nix eval --raw .#iso.odo.outPath`
# iso.odo.isoName == "nixos.iso"
# full path = <outPath> / iso / <isoName>

{
  description = "My system configuration";

  inputs = {
    impermanence.url = "github:nix-community/impermanence";
    nixpkgs.url = "github:NixOS/nixpkgs/nixos-24.11";
    nixpkgs-unstable.url = "github:NixOS/nixpkgs/nixos-unstable";
    nixpkgs-b93b4e9b5.url = "github:NixOS/nixpkgs/b93b4e9b527904aadf52dba6ca35efde2067cbd4";
    home-manager.url = "github:nix-community/home-manager/release-24.11";
    home-manager.inputs.nixpkgs.follows = "nixpkgs";
    lanzaboote = {
      url = "github:nix-community/lanzaboote/v0.4.1";

      # Optional but recommended to limit the size of your system closure.
      inputs.nixpkgs.follows = "nixpkgs";
    };
    zsh-histdb = {
      url = "path:flakes/zsh-histdb";

      # Optional but recommended to limit the size of your system closure.
      inputs.nixpkgs.follows = "nixpkgs";
    };
  };

  outputs =
    {
      self,
      nixpkgs,
      nixpkgs-unstable,
      nixpkgs-b93b4e9b5,
      impermanence,
      home-manager,
      lanzaboote,
      zsh-histdb,
      ...
    }@inputs:
    let
      base_x86_64_linux = rec {
        system = "x86_64-linux";
        specialArgs = {
          pkgs-b93b4e9b5 = import nixpkgs-b93b4e9b5 {
            inherit system;
          };
          pkgs-unstable = import nixpkgs-unstable {
            inherit system;
          };
        };
        modules = [
          impermanence.nixosModules.impermanence
          home-manager.nixosModules.home-manager
          lanzaboote.nixosModules.lanzaboote
          {
            home-manager.useGlobalPkgs = true;
            home-manager.useUserPackages = true;
          }
          { nixpkgs.overlays = [ zsh-histdb.overlays.default ]; }
          ./configuration.nix
        ];
      };
      systems = {
        odo = {
          main = nixpkgs.lib.nixosSystem (base_x86_64_linux // { });
          iso = nixpkgs.lib.nixosSystem (
            base_x86_64_linux
            // {
              modules = base_x86_64_linux.modules ++ [
                (nixpkgs + "/nixos/modules/installer/cd-dvd/iso-image.nix")
                # TODO: maybe?  imports = [ "${modulesPath}/profiles/image-based-appliance.nix" ];
                {
                  isoImage.makeEfiBootable = true;
                  isoImage.makeUsbBootable = true;
                  me.buildingIso = true;
                }
              ];
            }
          );
        };
      };
    in
    {
      nixosConfigurations.odo = systems.odo.main;
      iso.odo = systems.odo.iso.config.system.build.isoImage;
    };
}