{ stdenv, lib, fetchFromGitHub, makeDesktopItem, unzip, ant, jdk8
# Optional, Jitsi still runs without, but you may pass null:
, alsa-lib, dbus, gtk2, libpulseaudio, openssl, xorg
}:

let jdk = jdk8; in
stdenv.mkDerivation rec {
  pname = "jitsi";
  version = "2.11.5633";

  src = fetchFromGitHub {
    owner = "jitsi";
    repo = "jitsi";
    rev = "refs/tags/${lib.versions.patch version}";
    hash = "sha256-CN4o0VfHdoUteI2wyJ2hFJ9UsQ2wWUzcvrLMbR/l36M=";
  };

  patches = [ ./jitsi.patch ];

  jitsiItem = makeDesktopItem {
    name = "Jitsi";
    exec = "jitsi";
    comment = "VoIP and Instant Messaging client";
    desktopName = "Jitsi";
    genericName = "Instant Messaging";
    categories = [ "Chat" ];
  };

  libPath = lib.makeLibraryPath ([
    stdenv.cc.cc  # For libstdc++.
    alsa-lib
    dbus
    gtk2
    libpulseaudio
    openssl
    xorg.libX11
    xorg.libXext
    xorg.libXScrnSaver
    xorg.libXv
  ]);

  nativeBuildInputs = [ unzip ];
  buildInputs = [ ant jdk ];

  buildPhase = "ant make";

  installPhase = ''
    mkdir -p $out
    cp -a lib $out/
    rm -rf $out/lib/native/solaris
    cp -a sc-bundles $out/
    mkdir $out/bin
    cp resources/install/generic/run.sh $out/bin/jitsi
    chmod +x $out/bin/jitsi
    substituteInPlace $out/bin/jitsi \
      --subst-var-by JAVA ${jdk}/bin/java \
      --subst-var-by EXTRALIBS ${gtk2.out}/lib
    sed -e 's,^java\ ,${jdk}/bin/java ,' -i $out/bin/jitsi
    patchShebangs $out
    libPath="$libPath:${jdk.home}/lib/${jdk.architecture}"
    find $out/ -type f -name '*.so' | while read file; do
      patchelf --set-rpath "$libPath" "$file" && \
          patchelf --shrink-rpath "$file"
    done
  '';

  meta = with lib; {
    homepage = "https://desktop.jitsi.org/";
    description = "Open Source Video Calls and Chat";
    mainProgram = "jitsi";
    sourceProvenance = with sourceTypes; [
      binaryBytecode
      binaryNativeCode
    ];
    license = licenses.lgpl21Plus;
    platforms = platforms.linux;
    maintainers = teams.jitsi.members;
  };
}
