{ lib
, stdenv
, fetchurl
, glib
, jre
, unzip
, makeWrapper
, makeDesktopItem
, copyDesktopItems
, wrapGAppsHook3
}:

let
  icon = fetchurl {
    url = "https://imagej.net/media/icons/imagej.png";
    sha256 = "sha256-nU2nWI1wxZB/xlOKsZzdUjj+qiCTjO6GwEKYgZ5Risg=";
  };
in stdenv.mkDerivation rec {
  pname = "imagej";
  version = "153";

  src = fetchurl {
    url = "https://wsr.imagej.net/distros/cross-platform/ij${version}.zip";
    sha256 = "sha256-MGuUdUDuW3s/yGC68rHr6xxzmYScUjdXRawDpc1UQqw=";
  };
  nativeBuildInputs = [ copyDesktopItems makeWrapper unzip wrapGAppsHook3 ];
  buildInputs = [ glib ];
  dontWrapGApps = true;

  desktopItems = lib.optionals stdenv.isLinux [
    (makeDesktopItem {
      name = "ImageJ";
      desktopName = "ImageJ";
      icon = "imagej";
      categories = [ "Science" "Utility" "Graphics" ];
      exec = "imagej";
    })
  ];

  passthru = {
    inherit jre;
  };

  # JAR files that are intended to be used by other packages
  # should go to $out/share/java.
  # (Some uses ij.jar as a library not as a standalone program.)
  installPhase = ''
    runHook preInstall

    mkdir -p $out/share/java $out/bin
    # Read permisssion suffices for the jar and others.
    # Simple cp shall clear suid bits, if any.
    cp ij.jar $out/share/java
    cp -dR luts macros plugins $out/share

    runHook postInstall
  '';

  postFixup = lib.optionalString stdenv.isLinux ''
    makeWrapper ${jre}/bin/java $out/bin/imagej \
      ''${gappsWrapperArgs[@]} \
      --add-flags "-jar $out/share/java/ij.jar -ijpath $out/share"

    install -Dm644 ${icon} $out/share/icons/hicolor/128x128/apps/imagej.png
    substituteInPlace $out/share/applications/ImageJ.desktop \
      --replace Exec=imagej Exec=$out/bin/imagej
  '';

  meta = with lib; {
    homepage = "https://imagej.nih.gov/ij/";
    description = "Image processing and analysis in Java";
    longDescription = ''
      ImageJ is a public domain Java image processing program
      inspired by NIH Image for the Macintosh.
      It runs on any computer with a Java 1.4 or later virtual machine.
    '';
    sourceProvenance = with sourceTypes; [ binaryBytecode ];
    license = licenses.publicDomain;
    platforms = platforms.unix;
    maintainers = with maintainers; [ yuriaisaka ];
    mainProgram = "imagej";
  };
}
