{ config
, pkgs
, ...
}:
{
  imports = [ ../../modules/tabnine.nix ];
  home.packages = with pkgs;
    [
      shellcheck
      shfmt
      dockerfile-language-server-nodejs
      yaml-language-server
      lua-language-server
      taplo # toml
      marksman

      license-cli
      just

      mosh

      curlHTTP3
      xh
      htmlq
      jq
      dasel
      miller
      watchexec
      entr
      personal.projectdo

      litecli

      skopeo
      docker-credential-helpers
      dive
    ] ++ (lib.optionals stdenv.isDarwin [
      lima
      colima
      docker-client
    ]);

  home.sessionVariables = {
    FLY_NO_UPDATE_CHECK = "1";
    MOSH_TITLE_NOPREFIX = "1";
    LIMA_INSTANCE = "nixos";
  };

  programs.emacs.extraPackages = epkgs: (with epkgs; [
    (treesit-grammars.with-grammars (grammars: with grammars; [
      tree-sitter-bash
      tree-sitter-fish
      tree-sitter-just
      tree-sitter-make
      tree-sitter-dockerfile
      tree-sitter-sql
    ]))
  ]);

  editorconfig = {
    enable = true;
    settings = {
      "*" = {
        charset = "utf-8";
        end_of_line = "lf";
        trim_trailing_whitespace = true;
        insert_final_newline = true;
        indent_style = "space";
        indent_size = 2;
        tab_width = 2;
      };
      "*.fish" = {
        indent_size = 4;
      };
      "*.md" = {
        trim_trailing_whitespace = false;
      };
      justfile = {
        indent_style = "tab";
        tab_width = 4;
      };
      Makefile = {
        indent_style = "tab";
        tab_width = 4;
      };
    };
  };

  programs.fish.shellAbbrs = {
    b = { function = "projectdo_build"; };
    r = { function = "projectdo_run"; };
    t = { function = "projectdo_test"; };
    p = { function = "projectdo_tool"; };
  };
  home.shellAliases = {
    j = "just";
    er = "direnv reload";
    ea = "direnv allow";
    ex = "direnv exec";
    es = "direnv status";
    laminarc = "ssh linde laminarc";
  };
  programs.direnv = {
    enable = true;
    nix-direnv = {
      enable = true;
    };
    config = {
      global = {
        disable_stdin = true;
        load_dotenv = true;
        strict_env = true;
        hide_env_diff = true;
      };
      whitelist = {
        prefix = with config.home; [
          "${homeDirectory}/projects/alanpearce.eu"
        ];
      };
    };
    stdlib = ''
      declare -A direnv_layout_dirs
      direnv_layout_dir() {
        echo "''${direnv_layout_dirs[$PWD]:=$(
          local hash="$(${pkgs.coreutils}/bin/sha256sum - <<<"''${PWD}" | cut -c-7)"
      		local path="''${PWD//[^a-zA-Z0-9]/-}"
          echo "${config.xdg.cacheHome}/direnv/layouts/''${hash}''${path}"
        )}"
      }
    '';
  };
}