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

let
  cfg = config.local.programs.dev-tools;

  kubectlCompletionsZsh = pkgs.runCommand "kubectl-completion.zsh" {} ''
    ${lib.getExe pkgs.kubectl} completion zsh > $out
  '';

  # https://github.com/NixOS/nixpkgs/pull/384524/files
  apacheDirectoryStudio = with pkgs.unstable; (apache-directory-studio.overrideAttrs (attrs: {
    installPhase = ''
      dest="$out/libexec/ApacheDirectoryStudio"
      mkdir -p "$dest"
      cp -r . "$dest"
      mkdir -p "$out/bin"
      patchelf --set-interpreter "$(cat $NIX_CC/nix-support/dynamic-linker)" \
          "$dest/ApacheDirectoryStudio"
      # About `/tmp/SWT-GDBusServer`, see
      # https://github.com/adoptium/adoptium-support/issues/785#issuecomment-1866680133
      # and
      # https://github.com/adoptium/adoptium-support/issues/785#issuecomment-2387481967.
      makeWrapper "$dest/ApacheDirectoryStudio" \
          "$out/bin/ApacheDirectoryStudio" \
          --prefix PATH : "${jdk}/bin" \
          --prefix LD_LIBRARY_PATH : ${lib.makeLibraryPath [ glib webkitgtk_4_0 ] } \
          --run "mkdir -p /tmp/SWT-GDBusServer"
      install -D icon.xpm "$out/share/pixmaps/apache-directory-studio.xpm"
      install -D -t "$out/share/applications" ${attrs.desktopItem}/share/applications/*
    '';
  }));
in
{
  options.local.programs.dev-tools = with lib; {
    base.enable = mkEnableOption "base tools";
    nix.enable = mkEnableOption "tools for nix developer";
    erlang.enable = mkEnableOption "tools for erlang developer";
    web.enable = mkEnableOption "tools for web developer";
    k8s.enable = mkEnableOption "k8s tools";
    psql = {
      enable = mkEnableOption "psql";
      package = mkOption {
        type = types.package;
        default = pkgs.postgresql;
      };
    };

    eza.enable = mkEnableOption "eza. ls replacement";
    direnv.enable = mkEnableOption "direnv";
    zoxide.enable = mkEnableOption "zoxide";
    ldap.enable = mkEnableOption "ldap";
  };

  config = lib.mkMerge [
    (lib.mkIf cfg.base.enable {
      home.packages = with pkgs; [
        gnumake
        bat # a cat clone with syntax highlighting and git integration
        fd # a simple, fast and user-friendly alternative to find
        ripgrep # a fuzzy finder
        libnotify # tool to send notifications via cli
      ];
    })

    (lib.mkIf cfg.eza.enable {
      programs.eza = {
        enable = true;
        package = pkgs.unstable.eza.override { gitSupport = false; };
      };
      programs.zsh.shellAliases =
        let
          defaultArgs = "--icons --classify --group-directories-first --all";
          bin = "${config.programs.eza.package}/bin/exa ${defaultArgs}";
        in
        lib.mkIf config.programs.zsh.enable {
          ls = "${bin} --oneline";
          lt = "${bin} --tree --level=3";
          ll = "${bin} --long --header";
        };
    })

    (lib.mkIf cfg.direnv.enable {
      programs.direnv = {
        enable = true;
        nix-direnv.enable = true;
      };
    })

    (lib.mkIf cfg.zoxide.enable {
      programs.zoxide = {
        enable = true;
        enableZshIntegration = config.programs.zsh.enable;
      };
    })

    (lib.mkIf cfg.web.enable {
      home.packages = with pkgs.unstable; [
        xh # friendly and fast tool for sending HTTP requests
        deno
        docker-compose
      ];
    })

    (lib.mkIf cfg.erlang.enable {
      home.packages = with pkgs.unstable; [
        erlang
        erlfmt
      ];
    })

    (lib.mkIf cfg.nix.enable {
      home.packages = with pkgs.unstable; [
        nixpkgs-fmt # nix formatter
        nil # nix lsp server
      ];
    })

    (lib.mkIf cfg.k8s.enable {
      home.packages = with pkgs; [
        (google-cloud-sdk.withExtraComponents (
          let gc = google-cloud-sdk.components; in [
            gc.gke-gcloud-auth-plugin
            gc.kubectl
          ]
        ))
      ];

      programs.zsh.initExtra = ''
        source ${kubectlCompletionsZsh}
      '';
    })

    (lib.mkIf cfg.psql.enable {
      home.packages = [ cfg.psql.package ];
    })

    (lib.mkIf cfg.ldap.enable {
      home.packages = [ apacheDirectoryStudio ];
    })
  ];
}