{ config, lib, ... }:
let
  cfg = config.programs.jetbrains-remote;
in
{
  meta.maintainers = with lib.maintainers; [ genericnerdyusername ];

  options.programs.jetbrains-remote = {
    enable = lib.mkEnableOption "JetBrains remote development system";

    ides = lib.mkOption {
      type = lib.types.listOf lib.types.package;
      default = [ ];
      example = lib.literalExpression ''
        with pkgs.jetbrains; [ clion pycharm-professional ];
      '';
      description = ''
        IDEs accessible to the JetBrains remote development system.
      '';
    };
  };

  config = lib.mkIf (cfg.enable && cfg.ides != [ ]) {
    home.activation.jetBrainsRemote =
      let
        mkLine =
          ide:
          # Errors out if the symlink already exists
          "${ide}/bin/${ide.meta.mainProgram}-remote-dev-server registerBackendLocationForGateway || true";
        lines = map mkLine cfg.ides;
        linesStr = ''
          rm $HOME/.cache/JetBrains/RemoteDev/userProvidedDist/_nix_store* || true
        ''
        + lib.concatStringsSep "\n" lines;
      in
      lib.hm.dag.entryAfter [ "writeBoundary" ] linesStr;
  };
}
