{ config, pkgs, modulesPath, ... }:

let firmware = pkgs.callPackage ./firmware.nix { };
in {
  imports = [
    "${modulesPath}/profiles/base.nix"
    "${modulesPath}/installer/sd-card/sd-image.nix"
    ./default.nix
  ];

  sdImage = {
    imageName =
      "${config.sdImage.imageBaseName}-${config.system.nixos.label}-${pkgs.stdenv.hostPlatform.system}-starfive-visionfive2.img";

    # Overridden by postBuildCommands
    populateFirmwareCommands = "";

    firmwarePartitionOffset = 4;
    firmwareSize = 4;

    postBuildCommands = ''
      # preserve root partition
      eval $(partx $img -o START,SECTORS --nr 2 --pairs)

      # increase image size for gpt backup header
      truncate -s '+2M' $img

      sfdisk $img <<EOF
          label: gpt
          unit: sectors
          sector-size: 512

          start=4096, size=4096, type=2E54B353-1271-4842-806F-E436D6AF6985
          start=8192, size=8192, type=5B193300-FC78-40CD-8002-E86C45580B47
          start=$START, size=$SECTORS, type=0FC63DAF-8483-4772-8E79-3D69D8477DE4, attrs="LegacyBIOSBootable"
      EOF

      eval $(partx $img -o START,SECTORS --nr 1 --pairs)
      dd conv=notrunc if=${firmware.uboot}/u-boot-spl.bin.normal.out of=$img seek=$START count=$SECTORS

      eval $(partx $img -o START,SECTORS --nr 2 --pairs)
      dd conv=notrunc if=${firmware.uboot}/u-boot.itb of=$img seek=$START count=$SECTORS
    '';

    populateRootCommands = ''
      mkdir -p ./files/boot
      ${config.boot.loader.generic-extlinux-compatible.populateCmd} -c ${config.system.build.toplevel} -d ./files/boot
    '';
  };

  environment.systemPackages = [ firmware.updater-flash ];
}