{ config, lib, pkgs, ... }:

with lib;

let cfg = config.sydnix.qemu;
in {
  options.sydnix.qemu = {
    enable = mkEnableOption "Qemu";
  };

  config = mkIf cfg.enable
    (let
      # Necessary for UEFI boot with libvirt.
      qemu-uefi = pkgs.writeShellScriptBin "qemu-system-x86_64-uefi" ''
        qemu-system-x86_64 \
          -bios ${pkgs.OVMF.fd}/FV/OVMF.fd \
          "$@"
      '';
    in {
      sydnix.impermanence.directories = [
        # Most importantly, stores images and disks.
        "/var/lib/libvirt"
      ];

      programs.virt-manager.enable = true;

      environment.systemPackages = [
        pkgs.virtiofsd
        qemu-uefi
      ];

      virtualisation.libvirtd = {
        enable = true;
        qemu.vhostUserPackages = [ pkgs.virtiofsd ];
      };

      # Hack to enable UEFI support.
      systemd.tmpfiles.rules = [
        "L+ /var/lib/qemu/firmware - - - - ${pkgs.qemu}/share/qemu/firmware"
      ];
    });
}
