{ lib
, libicns
, p7zip
, fetchzip
, stdenvNoCC
, makeDesktopItem
, buildFHSUserEnv
, workdir ? "/tmp/blhelisuite32" }: let
  name = "BLHeliSuite32";
  pname = "blhelisuite32";
  version = "32.10";
  suffix = "1044";

  dist = fetchzip {
    name = "${pname}-dist";
    url = "https://github.com/bitdump/BLHeli/releases/download/Rev${version}/${name}xLinux64_${suffix}.zip";
    hash = "sha256-y4S824s9Ipxb1M1IeD6Lo6k7hmm8CEmPflvhaqZz+84=";
  };

  desktopItem = makeDesktopItem {
    name = pname;
    exec = pname;
    icon = pname;
    comment = "This Application may flash and configure BLHeli_32 based ESCs";
    desktopName = name;
    genericName = "BLHeli for brushless ESC firmware";
  };

  icons = stdenvNoCC.mkDerivation {
    pname = "${pname}-icons";
    inherit version;
    src = fetchzip {
      name = "${pname}-macos";
      url = "https://github.com/bitdump/BLHeli/releases/download/Rev${version}/${name}xm_MacOS64_${suffix}.zip";
      hash = "sha256-StRnrVI8p51vNsTMO1LtaZvENbG7XZ1V/mKHe4pO7kU=";
    };

    nativeBuildInputs = [ libicns p7zip ];

    configurePhase = ''
      7z x *.dmg
    '';

    buildPhase = ''
      icns2png -x ${name}xm_MacOS64_${suffix}/${name}xm.app/Contents/Resources/${name}xm.icns
    '';

    installPhase = ''
      mkdir -p "$out"
      cp -r ${name}*.png "$out"
    '';
  };

  linked = stdenvNoCC.mkDerivation {
    inherit pname version;
    phases = [ "unpackPhase" "patchPhase" "installPhase" ];
    src = dist;

    installPhase = ''
      cp -r . "$out"

      # BLHeliSuite32 tries to write next to its binary
      ln -s ${workdir}/settings $out/Settings
      ln -s ${workdir}/music $out/Music
    '';
  };
in buildFHSUserEnv {
  inherit pname version;
  targetPkgs = pkgs: (with pkgs; [
    glib libGL curl
    libgcc gtk3
    zlib systemdLibs
  ]);
  extraInstallCommands = let
    mkIconScale = scale:
    "install -m 444 -D ${icons}/${name}xm_${scale}x${scale}x32.png $out/share/icons/hicolor/${scale}x${scale}/apps/${pname}.png";
  in ''
    ${mkIconScale "16"}
    ${mkIconScale "32"}
    ${mkIconScale "64"}
    ${mkIconScale "128"}
    ${mkIconScale "256"}
    ${mkIconScale "512"}
    ${mkIconScale "1024"}
    cp -r ${desktopItem}/share/applications $out/share/
  '';

  runScript = "sh -c '" +
  "mkdir -p ${workdir}/settings && " +
  "mkdir -p ${workdir}/music && " +
  "exec ${linked}/${name}xl'";
}