{ stdenv
, lib
, fetchFromGitHub
, cmake
, ninja
, jdk8
, jdk
, ghc_filesystem
, zlib
, file
, wrapQtAppsHook
, xorg
, libpulseaudio
, qtbase
, quazip
, libGL
, msaClientID ? ""
, extra-cmake-modules
, qtcharts
  # For wrapper
, makeWrapper
}:



let polymc = 
let

  libpath = with xorg; lib.makeLibraryPath ([
    libX11
    libXext
    libXcursor
    libXrandr
    libXxf86vm
    libpulseaudio
    libGL
  ]);


  gameLibraryPath = libpath + ":/run/opengl-driver/lib";


in
stdenv.mkDerivation rec {
  pname = "polymc";
  version = "5.1";

  src = fetchFromGitHub {
    owner = "PolyMC";
    repo = "PolyMC";
    rev = version;
    sha256 = "sha256-D7OYzuvrigtmbk3Apqf29v2bTMgmlDZKFYOx71isVRM=";
    fetchSubmodules = true;
  };
  dontWrapQtApps = true;
  nativeBuildInputs = [ cmake extra-cmake-modules ninja jdk ghc_filesystem file wrapQtAppsHook ];
  buildInputs = [ qtbase quazip zlib qtcharts ];


  cmakeFlags = [
    "-GNinja"
    "-DLauncher_QT_VERSION_MAJOR=${lib.versions.major qtbase.version}"
  ] ++ lib.optionals (msaClientID != "") [ "-DLauncher_MSA_CLIENT_ID=${msaClientID}" ];


  postPatch = ''
    # hardcode jdk paths
    substituteInPlace launcher/java/JavaUtils.cpp \
      --replace 'scanJavaDir("/usr/lib/jvm")' 'javas.append("${jdk}/lib/openjdk/bin/java")' \
      --replace 'scanJavaDir("/usr/lib32/jvm")' 'javas.append("${jdk8}/lib/openjdk/bin/java")' \
  '';

  postFixup = ''
    # xorg.xrandr needed for LWJGL [2.9.2, 3) https://github.com/LWJGL/lwjgl/issues/128
    wrapQtApp $out/bin/polymc \
      --prefix LD_LIBRARY_PATH : "${gameLibraryPath}" \
      --prefix PATH : "${lib.makeBinPath ([ xorg.xrandr ]) }"
  '';
  passthru = {


    wrap =
      { extraJDKs ? [ ]
      , extraPaths ? [ ]
      , extraLibs ? [ ]
      }: stdenv.mkDerivation rec {
        pname = "polymc-wrapped";
        version = polymc.version;

        src = polymc;
        nativeBuildInputs = [ makeWrapper ];
        phases = [ "installPhase" "fixupPhase" ];
        installPhase = ''
          mkdir -p $out/bin
          ln -s $src/bin/polymc $out/bin/polymc
          ln -s $src/share $out/share
        '';

        postFixup = let javaPaths = lib.makeSearchPath "bin/java" (extraJDKs); in
          ''
            wrapProgram $out/bin/polymc \
              --prefix LD_LIBRARY_PATH : "${lib.makeLibraryPath extraLibs}" \
              --prefix POLYMC_JAVA_PATHS : "${javaPaths}" \
              --prefix PATH : "${lib.makeBinPath extraPaths}"
          '';

        preferLocalBuild = true;
        meta = polymc.meta;

      };
  };
  meta = with lib; {
    homepage = "https://polymc.org/";
    downloadPage = "https://polymc.org/download/";
    changelog = "https://github.com/PolyMC/PolyMC/releases";
    description = "A free, open source launcher for Minecraft";
    longDescription = ''
      Allows you to have multiple, separate instances of Minecraft (each with
      their own mods, texture packs, saves, etc) and helps you manage them and
      their associated options with a simple interface.
    '';
    platforms = [ "x86_64-linux" ];
    license = licenses.gpl3Only;
  };
};
in
polymc