{ stdenv, lib, fetchurl, unzip, makeWrapper, jre8, libXtst, gdal }:
let
  pname = "udig";
  version = "2.0.0";

  srcs = {
    x86_64-linux = fetchurl {
      url = "http://udig.refractions.net/files/downloads/udig-${version}.linux.gtk.x86_64.zip";
      hash = "sha256-ijuSWq1jSsB8K653bjcUdNwVGZscDaTuegBr01oNEg4=";
    };
    x86_64-darwin = fetchurl {
      url = "http://udig.refractions.net/files/downloads/udig-${version}.macosx.cocoa.x86_64.zip";
      hash = "sha256-Ihk3InHB3/tEYRqH2ozhokz2GN8Gfig5DJkO/8P1LJs=";
    };
  };
  src = srcs.${stdenv.hostPlatform.system} or (throw "unsupported system ${stdenv.hostPlatform.system}");

  meta = with lib; {
    description = "User-friendly Desktop Internet GIS";
    homepage = "http://udig.refractions.net/";
    sourceProvenance = with sourceTypes; [ binaryNativeCode ];
    license = with licenses; [ epl10 bsd3 ];
    maintainers = with maintainers; [ sikmir ];
    platforms = builtins.attrNames srcs;
    mainProgram = "udig";
  };

  linux = stdenv.mkDerivation {
    inherit pname version src meta;

    nativeBuildInputs = [ unzip makeWrapper ];

    installPhase = ''
      install -dm755 $out/bin $out/opt/udig
      cp -r . $out/opt/udig
      makeWrapper $out/opt/udig/udig.sh $out/bin/udig \
        --prefix PATH : ${jre8}/bin \
        --prefix LD_LIBRARY_PATH : ${lib.makeLibraryPath ([ libXtst gdal ])}
    '';

    postFixup = ''
      patchelf \
        --set-interpreter $(cat $NIX_CC/nix-support/dynamic-linker) \
        $out/opt/udig/udig_internal
    '';
  };

  darwin = stdenv.mkDerivation {
    inherit pname version src meta;

    nativeBuildInputs = [ unzip makeWrapper ];

    postPatch = ''
      substituteInPlace configuration/config.ini \
        --replace "\$LOCALAPPDATA\$" "@user.home"
    '';

    installPhase = ''
      mkdir -p $out/Applications/udig
      cp -R . $out/Applications/udig
      wrapProgram $out/Applications/udig/udig.app/Contents/MacOS/udig_internal \
        --prefix DYLD_LIBRARY_PATH : ${lib.makeLibraryPath ([ gdal ])}
    '';
  };
in
if stdenv.isDarwin
then darwin
else linux
