{ lib
, fetchFromGitHub
, fetchpatch
, python3
, glibcLocales
, gobject-introspection
, wrapGAppsHook3
, gtk3
, keybinder3
, libnotify
, libutempter
, vte
, libwnck
, dconf
, nixosTests
}:

python3.pkgs.buildPythonApplication rec {
  pname = "guake";
  version = "3.10";

  pyproject = false;

  src = fetchFromGitHub {
    owner = "Guake";
    repo = "guake";
    rev = "refs/tags/${version}";
    hash = "sha256-e6Bf4HDftHBxFPcw9z02CqgZhSIvt6wlLF6dnIh9fEc=";
  };

  patches = [
    # Avoid trying to recompile schema at runtime,
    # the package should be responsible for ensuring it is up to date.
    # Without this, the package will try to run glib-compile-schemas
    # on every update, which is pointless and will crash
    # unless user has it installed.
    ./no-compile-schemas.patch

    # Avoid using pip since it fails on not being able to find setuptools.
    # Note: This is not a long-term solution, setup.py is deprecated.
    (fetchpatch {
      url = "https://github.com/Guake/guake/commit/14abaa0c69cfab64fe3467fbbea211d830042de8.patch";
      hash = "sha256-RjGRFJDTQX2meAaw3UZi/3OxAtIHbRZVpXTbcJk/scY= ";
      revert = true;
    })

    # Revert switch to FHS.
    (fetchpatch {
      url = "https://github.com/Guake/guake/commit/8c7a23ba62ee262c033dfa5b0b18d3df71361ff4.patch";
      hash = "sha256-0asXI08XITkFc73EUenV9qxY/Eak+TzygRRK7GvhQUc=";
      revert = true;
    })
  ];

  nativeBuildInputs = [
    gobject-introspection
    wrapGAppsHook3
    python3.pkgs.pip
  ];

  buildInputs = [
    glibcLocales
    gtk3
    keybinder3
    libnotify
    libwnck
    python3
    vte
  ];

  makeWrapperArgs = [ "--set LOCALE_ARCHIVE ${glibcLocales}/lib/locale/locale-archive" ];

  propagatedBuildInputs = with python3.pkgs; [
    dbus-python
    pycairo
    pygobject3
    setuptools-scm
    pyyaml
  ];

  makeFlags = [
    "PREFIX=${placeholder "out"}"
  ];

  preFixup = ''
    gappsWrapperArgs+=(
      --prefix LD_LIBRARY_PATH : "${lib.makeLibraryPath [ libutempter ]}"
      # For settings migration.
      --prefix PATH : "${lib.makeBinPath [ dconf ]}"
    )
  '';

  passthru.tests.test = nixosTests.terminal-emulators.guake;

  meta = with lib; {
    description = "Drop-down terminal for GNOME";
    homepage = "http://guake-project.org";
    license = licenses.gpl2Plus;
    maintainers = [ maintainers.msteen ];
    platforms = platforms.linux;
  };
}
