{ config, lib, pkgs, ... }:

with pkgs;

let
  libuiohook = stdenv.mkDerivation rec {
    pname = "libuiohook";
    version = "1.1";
    src = fetchFromGitHub {
      owner = "kwhat";
      repo = "libuiohook";
      rev = version;
      sha256 = "1isfxn3cfrdqq22d3mlz2lzm4asf9gprs7ww2xy9c3j3srk9kd7r";
    };

    preConfigure = ''
      ./bootstrap.sh
    '';

    nativeBuildInputs = [ pkg-config ];
    buildInputs = [
      libtool autoconf automake
      x11
      xorg.libXtst
      xorg.libXinerama
      xorg.libxkbfile
      libxkbcommon
    ];
  };

  obs-input-overlay = stdenv.mkDerivation rec {
    pname = "obs-input-overlay";
    version = "4.8";
    src = fetchFromGitHub {
      owner = "univrsal";
      repo = "input-overlay";
      rev = "v${version}";
      sha256 = "1dklg0dx9ijwyhgwcaqz859rbpaivmqxqvh9w3h4byrh5pnkz8bf";
      fetchSubmodules = true;
    };

    nativeBuildInputs = [ cmake ];
    buildInputs = [ obs-studio libuiohook ];

    postPatch = ''
      sed -i CMakeLists.txt \
        -e '2iinclude(${obs-studio.src}/cmake/Modules/ObsHelpers.cmake)' \
        -e '2ifind_package(LibObs REQUIRED)'
    '';

    cmakeFlags = [
      "-Wno-dev"
    ];
  };
in
{
  home.packages = [
    obs-studio
    obs-input-overlay
  ];

  xdg.configFile."obs-studio/plugins/input-overlay/bin/64bit/input-overlay.so".source =
    "${obs-input-overlay}/lib/obs-plugins/input-overlay.so";
  xdg.configFile."obs-studio/plugins/input-overlay/data".source =
    "${obs-input-overlay}/share/obs/obs-plugins/input-overlay";

  xdg.configFile."obs-studio/plugins/obs-v4l2sink/bin/64bit/obs-v4l2sink.so".source =
    "${pkgs.obs-v4l2sink}/share/obs/obs-plugins/v4l2sink/bin/64bit/v4l2sink.so";
}