{ config, pkgs, ... }:

let

  postBuildHook = pkgs.writeScript "post-build-hook.sh" ''
    #!${pkgs.runtimeShell}
    export PATH=$PATH:${pkgs.nix}/bin
    exec ${pkgs.cachix}/bin/cachix -c /var/lib/post-build-hook/nix-community-cachix.dhall push nix-community $OUT_PATHS
  '';

  sockPath = "/run/post-build-hook.sock";

  queueBuildHook = pkgs.writeScript "post-build-hook.sh" ''
    ${pkgs.queued-build-hook}/bin/queued-build-hook queue --socket ${sockPath}
  '';

  sources = import ../nix/sources.nix;

in {

  nixpkgs.overlays = [
    (self: super: {
      queued-build-hook = (import sources.queued-build-hook {});
    })
  ];

  systemd.sockets.queued-build-hook = {
    description = "Post-build-hook socket";
    wantedBy = [ "sockets.target" ];
    socketConfig = {
      ListenStream = sockPath;
      SocketUser = "root";
      SocketMode = "0600";
    };
  };

  systemd.services.queued-build-hook = {
    description = "Post-build-hook service";
    wantedBy = [ "multi-user.target" ];
    after = [ "network.target" "queued-build-hook.socket" ];
    requires = [ "queued-build-hook.socket" ];
    serviceConfig.ExecStart = "${pkgs.queued-build-hook}/bin/queued-build-hook daemon --retry-interval 30 --hook ${postBuildHook}";
  };

  nix.extraOptions = ''
    post-build-hook = ${queueBuildHook}
  '';

}