{ depot, pkgs, ... }:
let
  inherit (pkgs) stdenvNoCC jdk aspectj unifi;
in
stdenvNoCC.mkDerivation {
  pname = "unifi-hack";
  version = "depot";

  src = ./aspect;

  nativeBuildInputs = [ jdk aspectj depot.pkgs.tiny-remapper ];

  buildPhase = ''
    mkdir $NIX_BUILD_TOP/tmp

    cp $(type -p ajc) $NIX_BUILD_TOP/tmp/ajc
    substituteInPlace $NIX_BUILD_TOP/tmp/ajc \
      --replace '-Xmx64M' ""

    ajc_classpath="$(ls ${unifi}/lib/*.jar | tr '\n' ':' | sed 's/:$//')"
    tiny-remapper ${unifi}/lib/ace.jar $NIX_BUILD_TOP/tmp/acedeobf.jar ./ace.jar.tiny2map intermediary named
    $NIX_BUILD_TOP/tmp/ajc -8 \
      -classpath "${aspectj}/lib/aspectjrt.jar:$ajc_classpath" \
      -inpath $NIX_BUILD_TOP/tmp/acedeobf.jar \
      -outjar $NIX_BUILD_TOP/tmp/aceaspected.jar \
      ./MyLogin.aj
    tiny-remapper $NIX_BUILD_TOP/tmp/aceaspected.jar $NIX_BUILD_TOP/tmp/acereobf.jar ./ace.jar.tiny2map named intermediary

    # Repack the manifest
    pushd $NIX_BUILD_TOP/tmp
    jar xf acereobf.jar META-INF/MANIFEST.MF
    awk \
      '/^[^ ]/ { inclasspath=0 } /Class-Path:/ { inclasspath=1 } { if (inclasspath) print; }' \
      META-INF/MANIFEST.MF > classpath.MF
    substituteInPlace classpath.MF \
      --replace 'Class-Path: ' 'Class-Path: aspectjrt.jar '
    jar -ufm acereobf.jar classpath.MF
    popd
  '';

  installPhase = ''
    cp -R ${unifi} $out
    chmod -R u+w $out
    rm $out/lib/ace.jar
    cp $NIX_BUILD_TOP/tmp/acereobf.jar $out/lib/ace.jar
    cp ${aspectj}/lib/aspectjrt.jar $out/lib/aspectjrt.jar
  '';
}