{ stdenv
, mkDerivation
, pkgconfig
, fetchFromGitHub
, deepin
, cmake
, extra-cmake-modules
, qtbase
, libxcb
, kglobalaccel
, kwindowsystem
, kcoreaddons
, kwin
, dtkcore
, gsettings-qt
, fontconfig
, deepin-desktop-schemas
, glib
, libXrender
, mtdev
, qttools
, deepin-gettext-tools
, kwayland
, qtx11extras
, qtquickcontrols2
, epoxy
, qt5integration
, dde-session-ui
, dbus
, wrapGAppsHook
}:

mkDerivation rec {
  pname = "dde-kwin";
  version = "5.0.0";

  src = fetchFromGitHub {
    owner = "linuxdeepin";
    repo = pname;
    rev = version;
    sha256 = "0bvkx9h5ygj46a0j76kfyq3gvk6zn4fx6clhrmcr40hbi2k33cbl";
  };

  nativeBuildInputs = [
    cmake
    deepin-gettext-tools
    deepin.setupHook
    extra-cmake-modules
    pkgconfig
    wrapGAppsHook
  ];

  buildInputs = [
    deepin-desktop-schemas
    dtkcore
    epoxy
    fontconfig
    glib
    gsettings-qt
    kcoreaddons
    kglobalaccel
    kwayland
    kwin
    kwindowsystem
    libXrender
    libxcb
    mtdev
    qtbase
    qtquickcontrols2
    qttools
    qtx11extras
    qt5integration
  ];

  # Need to add kwayland around:
  # * https://github.com/linuxdeepin/dde-kwin/blob/5226bb984c844129f9fa589da56e77decb7b39a1/plugins/kwineffects/blur/CMakeLists.txt#L14
  NIX_CFLAGS_COMPILE = "-I${kwayland.dev}/include/KF5";

  cmakeFlags = [
    "-DKWIN_VERSION=${(builtins.parseDrvName kwin.name).version}"
  ];

  patches = [
    ./0001-dde-kwin.pc-make-paths-relative.patch
    ./fix-paths.patch
  ];

  postPatch = ''
    searchHardCodedPaths

    patchShebangs translate_ts2desktop.sh \
      translate_generation.sh \
      translate_desktop2ts.sh \
      plugins/kwin-xcb/plugin/translate_generation.sh

    fixPath ${deepin-gettext-tools} /usr/bin/deepin-desktop-ts-convert translate_desktop2ts.sh translate_ts2desktop.sh

    fixPath $out /etc/xdg configures/CMakeLists.txt deepin-wm-dbus/deepinwmfaker.cpp

    # TODO: Need environmental patch
    fixPath /run/current-system/sw /usr/lib plugins/kwin-xcb/plugin/main.cpp

    substituteInPlace configures/kwin-wm-multitaskingview.desktop \
      --replace "dbus-send" "${dbus}/bin/dbus-send"

    fixPath ${dde-session-ui} /usr/lib/deepin-daemon/dde-warning-dialog deepin-wm-dbus/deepinwmfaker.cpp

    # Correct qt plugin installation path to be within dde-kwin prefix.
    substituteInPlace CMakeLists.txt \
      --subst-var-by plugin_path "$out/$qtPluginPrefix"
  '';

  postInstall = ''
    # Correct invalid path in .pc
    substituteInPlace $out/lib/pkgconfig/dde-kwin.pc \
      --replace "-L/usr/X11R6/lib64" ""

    chmod +x $out/bin/kwin_no_scale
  '';

  dontWrapQtApps = true;

  preFixup = ''
    gappsWrapperArgs+=(
      "''${qtWrapperArgs[@]}"
    )
  '';

  enableParallelBuilding = true;

  passthru.updateScript = deepin.updateScript { name = "${pname}-${version}"; };

  meta = with stdenv.lib; {
    description = "KWin configuration for Deepin Desktop Environment";
    homepage = "https://github.com/linuxdeepin/dde-kwin";
    license = licenses.gpl3;
    platforms = platforms.linux;
    maintainers = with maintainers; [ romildo worldofpeace ];
  };
}
