{ lib
, glib
, stdenv
, dbus
, freetype
, fontconfig
, zlib
, qtquickcontrols2
, libXinerama
, libxcb
, libSM
, libXi
, libglvnd
, libXext
, libXrandr
, mailspring
, libX11
, libICE
, libXrender
, autoPatchelfHook
, makeWrapper
, mkDerivation
, xkeyboard_config
, fetchurl
, buildFHSEnv
, openal
, makeDesktopItem
}:

let

  superposition = stdenv.mkDerivation rec{
    pname = "unigine-superposition";
    version = "1.1";

    src = fetchurl {
      url = "https://assets.unigine.com/d/Unigine_Superposition-${version}.run";
      sha256 = "12hzlz792pf8pvxf13fww3qhahqzwzkxq9q3mq20hbhvaphbg7nd";
    };

    nativeBuildInputs = [
      autoPatchelfHook
      makeWrapper
    ];

    buildInputs = [
      glib
      stdenv.cc.cc
      dbus
      freetype
      fontconfig
      zlib
      qtquickcontrols2
      libXinerama
      libxcb
      libSM
      libXi
      libglvnd
      libXext
      libXrandr
      mailspring
      libX11
      libICE
      libXrender
    ];

    installPhase = ''
      bash $src --target $name --noexec
      mkdir -p $out/bin $out/lib/unigine/superposition/
      cp -r $name/* $out/lib/unigine/superposition/
      echo "exec $out/lib/unigine/superposition/Superposition" >> $out/bin/superposition
      chmod +x $out/bin/superposition
       wrapProgram $out/lib/unigine/superposition/Superposition \
        --set QT_XKB_CONFIG_ROOT ${xkeyboard_config} \
        --run "cd $out/lib/unigine/superposition/"
    '';

    dontUnpack = true;
    dontWrapQtApps = true;

    postPatchMkspecs = ''
      cp -f $name/bin/superposition $out/lib/unigine/superposition/bin/superposition
    '';
  };

  desktopItem = makeDesktopItem {
    name = "Superposition";
    exec = "Superposition";
    genericName = "A GPU Stress test tool from the UNIGINE";
    icon = "Superposition";
    desktopName = "Superposition Benchmark";
  };

in

# We can patch the "/bin/superposition", but "/bin/launcher" checks it for changes.
# For that we need use a buildFHSEnv.

buildFHSEnv {
  name = "Superposition";

  targetPkgs = pkgs: [
    superposition
    glib
    stdenv.cc.cc
    dbus
    freetype
    fontconfig
    zlib
    qtquickcontrols2
    libXinerama
    libxcb
    libSM
    libXi
    libglvnd
    libXext
    libXrandr
    mailspring
    libX11
    libICE
    libXrender
    openal
  ];
  runScript = "superposition";

  extraInstallCommands = ''
    # create directories
    mkdir -p $out/share/icons/hicolor $out/share/applications
    # create .desktop file
    ln -s ${desktopItem}/share/applications/* $out/share/applications
    # install Superposition.desktop and icon
    cp ${superposition}/lib/unigine/superposition/Superposition.png $out/share/icons/
    for RES in 16 24 32 48 64 128 256; do
      mkdir -p $out/share/icons/hicolor/"$RES"x"$RES"/apps
      cp ${superposition}/lib/unigine/superposition/icons/superposition_icon_$RES.png $out/share/icons/hicolor/"$RES"x"$RES"/apps/Superposition.png
    done
  '';

  meta = {
    description = "Unigine Superposition GPU benchmarking tool";
    homepage = "https://benchmark.unigine.com/superposition";
    sourceProvenance = with lib.sourceTypes; [ binaryNativeCode ];
    license = lib.licenses.unfree;
    maintainers = [ lib.maintainers.BarinovMaxim ];
    platforms = [ "x86_64-linux" ];
    mainProgram = "Superposition";
  };
}
