{
  config,
  lib,
  options,
  pkgs,
  ...
}:
let
  inherit (pkgs.stdenv.hostPlatform) efiArch;

  initialPartitions = {
    "10-root" = {
      storePaths = [ config.system.build.toplevel ];
      repartConfig = {
        Type = "root";
        Minimize = "best";
        Format = "erofs";
        MakeDirectories = "/home /root /etc /dev /sys /bin /var /proc /run /usr /usr/bin /srv /tmp /mnt /lib /boot";
        Verity = "data";
        VerityMatchKey = "root";
        SplitName = "root";
      };
    };

    "20-root-verity" = {
      repartConfig = {
        Type = "root-verity";
        Minimize = "best";
        Verity = "hash";
        VerityMatchKey = "root";
        SplitName = "verity";
      };
    };
  };

  # TODO: We don't need a combined image here - add dry-run flag to repart invocation
  verityRepart = import (pkgs.path + "/nixos/lib/eval-config.nix") {
    inherit lib pkgs;
    system = null;
    modules = [
      (
        { modulesPath, ... }:
        {
          imports = [ (modulesPath + "/image/repart.nix") ];
          image.repart = {
            name = "verity";
            split = true;
            mkfsOptions = lib.mkIf config.image.compress {
              erofs = [
                "-zlz4hc,level=12"
                "-Efragments,dedupe,ztailpacking"
              ];
            };
            partitions = initialPartitions;
          };
        }
      )
    ];
  };

  rootPart = "${verityRepart.config.system.build.image}/${verityRepart.config.image.repart.imageFileBasename}.root.raw";
  verityPart = "${verityRepart.config.system.build.image}/${verityRepart.config.image.repart.imageFileBasename}.verity.raw";

  verityImgAttrs = builtins.fromJSON (
    builtins.readFile "${verityRepart.config.system.build.image}/repart-output.json"
  );
  rootAttrs = builtins.elemAt verityImgAttrs 0;
  verityAttrs = builtins.elemAt verityImgAttrs 1;

  rootUuid = rootAttrs.uuid;
  verityUuid = verityAttrs.uuid;
  verityRootHash = rootAttrs.roothash;

  finalPartitions = {
    "10-esp" = {
      contents = {
        "/EFI/BOOT/BOOT${lib.toUpper efiArch}.EFI".source = "${pkgs.systemdUkify}/lib/systemd/boot/efi/systemd-boot${efiArch}.efi";
        "/EFI/Linux/${config.system.boot.loader.ukiFile}".source = "${config.system.build.uki}/${config.system.boot.loader.ukiFile}";
        "/EFI/memtest86/memtest86.efi".source = "${pkgs.memtest86plus}/memtest.efi";
        "/loader/entries/patos-factory-reset.conf".source = pkgs.writeText "patos-factory-reset.conf" ''
            title Patos Factory Reset
            efi /EFI/Linux/${config.system.boot.loader.ukiFile}
            options ${toString config.boot.kernelParams} systemd.factory_reset=yes
            sort-key z_factory_reset
          '';
        "/loader/entries/memtest86.conf".source = pkgs.writeText "memtest86.conf" ''
            title Memtest86+
            efi /EFI/memtest86/memtest86.efi
            options console=ttyS0
            sort-key z_memtest
          '';
        "/loader/loader.conf".source = pkgs.writeText "loader.conf" ''
            timeout 2
          '';
      };
      repartConfig = {
        Type = "esp";
        Format = "vfat";
        SizeMinBytes = "96M";
        SizeMaxBytes = "96M";
        SplitName = "-";
      };
    };
    "20-root-verity-a" = {
      repartConfig = {
        Type = "root-verity";
        Label = "verity-${config.system.image.version}";
        CopyBlocks = "${verityPart}";
        SplitName = "-";
        SizeMinBytes = "64M";
        SizeMaxBytes = "64M";
        UUID = "${verityUuid}";
        ReadOnly = 1;
      };
    };
    # TODO: Add signature partition for systemd-nspawn
    "22-root-a" = {
      repartConfig = {
        Type = "root";
        Label = "root-${config.system.image.version}";
        CopyBlocks = "${rootPart}";
        SplitName = "-";
        UUID = "${rootUuid}";
        ReadOnly = 1;
      };
    };
  };

  finalRepart = import (pkgs.path + "/nixos/lib/eval-config.nix") {
    inherit lib pkgs;
    system = null;
    modules = [
      (
        { modulesPath, ... }:
        {
          imports = [ (modulesPath + "/image/repart.nix") ];
          image.repart = {
            name = "${config.system.image.id}";
            partitions = finalPartitions;
          };
        }
      )
    ];
  };

in
{

  # This fields is immutable by default, but can be overridden.
  options.system.nixos.codeName = lib.mkOption { readOnly = false; };
  options.system.nixos.release = lib.mkOption { readOnly = false; };

  # FIXME: Should be configured somehow
  config.system.nixos = {
    codeName = "Finn";
    distroId = "patos";
    distroName = "PatOS";
    release = "2024-11";
    variant_id = "server";
    variantName = "Server";
    vendorName = "PatOS";
  };

  options.image.compress = lib.mkEnableOption "image compression" // {
    default = true;
  };

  config.system.build = {
    inherit verityRootHash;

    image =
      (pkgs.linkFarm "image-release" [
        {
          name = "${config.system.image.id}_${config.system.image.version}.efi";
          path = "${config.system.build.uki}/${config.system.boot.loader.ukiFile}";
        }
        {
          name = "${config.system.image.id}_${config.system.image.version}_${verityUuid}.verity";
          path = "${verityRepart.config.system.build.image}/${verityRepart.config.image.repart.imageFileBasename}.verity.raw";
        }
        {
          name = "${config.system.image.id}_${config.system.image.version}_${rootUuid}.root";
          path = "${verityRepart.config.system.build.image}/${verityRepart.config.image.repart.imageFileBasename}.root.raw";
        }
        {
          name = "${config.system.image.id}_${config.system.image.version}.img";
          path = "${finalRepart.config.system.build.image}/${finalRepart.config.image.repart.imageFileBasename}.raw";
        }
      ])
      // {
        imageFile = "${config.system.image.id}_${config.system.image.version}.img";
      };

  };

}