{ stdenv
, lib
, fetchFromGitHub
, fetchurl
, autoPatchelfHook
, makeWrapper
, nix-update-script
, glibcLocales
, python3Packages
, gtk-sharp-2_0
, gtk2-x11
, screen
}:

let
  pythonLibs = with python3Packages; makePythonPath [
    construct
    psutil
    pyyaml
    requests

    (robotframework.overrideDerivation (oldAttrs: {
      src = fetchFromGitHub {
        owner = "robotframework";
        repo = "robotframework";
        rev = "v6.1";
        hash = "sha256-l1VupBKi52UWqJMisT2CVnXph3fGxB63mBVvYdM1NWE=";
      };
    }))
  ];
in
stdenv.mkDerivation (finalAttrs: {
  pname = "renode";
  version = "1.15.1";

  src = fetchurl {
    url = "https://github.com/renode/renode/releases/download/v${finalAttrs.version}/renode-${finalAttrs.version}.linux-portable.tar.gz";
    hash = "sha256-W+JtyaXcYZD+iaVEFX6eatxV3/Vr4aZrsCLm1Aj+ISs=";
  };

  nativeBuildInputs = [
    autoPatchelfHook
    makeWrapper
  ];

  propagatedBuildInputs = [
    gtk2-x11
    gtk-sharp-2_0
    screen
  ];

  strictDeps = true;

  installPhase = ''
    runHook preInstall

    mkdir -p $out/{bin,libexec/renode}

    mv * $out/libexec/renode
    mv .renode-root $out/libexec/renode
    chmod +x $out/libexec/renode/*.so

    makeWrapper "$out/libexec/renode/renode" "$out/bin/renode" \
      --prefix PATH : "$out/libexec/renode" \
      --suffix LD_LIBRARY_PATH : "${gtk2-x11}/lib" \
      --set LOCALE_ARCHIVE "${glibcLocales}/lib/locale/locale-archive"

    makeWrapper "$out/libexec/renode/renode-test" "$out/bin/renode-test" \
      --prefix PATH : "$out/libexec/renode" \
      --prefix PYTHONPATH : "${pythonLibs}" \
      --suffix LD_LIBRARY_PATH : "${gtk2-x11}/lib" \
      --set LOCALE_ARCHIVE "${glibcLocales}/lib/locale/locale-archive"

    substituteInPlace "$out/libexec/renode/renode-test" \
      --replace '$PYTHON_RUNNER' '${python3Packages.python}/bin/python3'

    runHook postInstall
  '';

  passthru.updateScript = nix-update-script { };

  meta = {
    description = "Virtual development framework for complex embedded systems";
    homepage = "https://renode.io";
    changelog = "https://github.com/renode/renode/blob/v${finalAttrs.version}/CHANGELOG.rst";
    license = lib.licenses.bsd3;
    maintainers = with lib.maintainers; [ otavio ];
    platforms = [ "x86_64-linux" ];
  };
})
