{ config, pkgs, lib, font, ... }:
let inherit (import ./variables.nix) key theme color accent font dmenu;
in {
  config = {
    programs.kakoune = {
      enable = true;
      extraConfig =
        let
          colors = lib.mapAttrs (_: lib.replaceStrings [ "#" ] [ "rgb:" ]) {
            accent_fg = accent.fg;
            accent_color = accent.color;
            bg_light = color.bg_light;
            bg_dark = color.bg_dark;
            nontxt = color.nontxt;
            orange = color.normal.orange;
            brown = color.normal.brown;
          };
        in
        with colors;
        lib.concatStringsSep "\n"
          (map (lib.readFile) ([
            ./kak/filetypes.kak
            ./kak/hooks.kak
            ./kak/indent.kak
            ./kak/keys.kak
            ./kak/plug.kak
            ./kak/usermode.kak
            ./kak/git-mode.kak
          ] ++ lib.optional (dmenu == "rofi") ./kak/rofi-commands.kak)) + ''

        set global scrolloff 10,20
        set global autoreload yes
        set global startup_info_version 20200901

      '' + ''
          face global crosshairs_line     default,${bg_dark}
          face global crosshairs_column   default+b

          # For Code
          face global value magenta
          face global type yellow
          face global variable blue
          face global module ${brown}
          face global function ${orange}
          face global string green
          face global keyword ${accent_color}
          face global operator yellow
          face global attribute cyan
          face global comment ${bg_light}
          face global documentation comment
          face global meta +i@function
          face global builtin blue

          # For markup
          face global title blue
          face global header cyan
          face global mono green
          face global block magenta
          face global link cyan
          face global bullet cyan
          face global list yellow

          # builtin faces
          face global Default default,default

          face global PrimaryCursor      ${accent_fg},${accent_color}+fg
          face global PrimaryCursorEol   PrimaryCursor
          face global PrimarySelection   default,${bg_light}+f

          face global SecondaryCursor    default,default+rfg
          face global SecondaryCursorEol SecondaryCursor
          face global SecondarySelection PrimarySelection

          face global InactiveCursor     ${accent_fg},${bg_light}+fg

          face global MenuForeground ${accent_fg},${accent_color}
          face global MenuBackground default,${bg_dark}
          face global MenuInfo cyan

          face global Information default,${bg_dark}
          face global Error default,red+g

          face global StatusLine      %sh{
              printf "rgb:"
              head /dev/urandom |
              base64 |
              rg --text -o "${color.random_range}" |
              head -n 6 |
              sd '\n' ""
          }
          face global StatusLineMode  StatusLine
          face global StatusLineInfo  StatusLine
          face global StatusLineValue StatusLine
          face global StatusCursor    ${accent_fg},${accent_color}

          face global Prompt yellow,default
          try %{add-highlighter global/ show-matching}
          face global MatchingChar ${accent_color},default+b

          # Goodies
          try %{add-highlighter global/number-lines number-lines -relative -hlcursor}
          face global LineNumbers         ${bg_light},default
          face global LineNumberCursor    default,${bg_dark}
          face global LineNumbersWrapped  red,default

          try %{add-highlighter global/ show-whitespaces}
          face global Whitespace ${nontxt},default+f
          face global BufferPadding ${nontxt},default
          ## highlight trailing whitespace
          # add-highlighter global/ regex '\h*$' 0:red,red+u

          face global Reference default+bu
          face global InlayHint ${bg_light}+buif

          # Lsp
        '' + (lib.concatStringsSep "\n" (lib.mapAttrsToList
          (name: color: ''
            face global HighlightDiagnostic${name} ${color},default+bu
            face global Diagnostic${name} ${color},default+bu
            face global TextDiagnostic${name} ${color},default+b
            face global InlayDiagnostic${name} ${color},default+br
          '')
          {
            Error = "red";
            Warning = "yellow";
            Hint = "blue";
          }));
    };
    home.file = { ".config/kak-lsp/kak-lsp.toml".source = ./kak/kak-lsp.toml; };
    home.packages = with pkgs; [
      kakoune
      terminal
      ranger
      bmenu
      kak-lsp
      kak-pager
      kak-man-pager

      aspell
      aspellDicts.en
      aspellDicts.pt_BR
    ];
    home.activation = {
      update_kakoune = lib.hm.dag.entryAfter [ "writeBoundary" ] ''
        $DRY_RUN_CMD kak -clear
        $DRY_RUN_CMD kak -l | xargs -r -n1 kak -e "config-source;quit" -ui dummy -c
      '';
    };
    home.sessionVariables = {
      EDITOR = "kak";
      # Some plugins(kak_ansi) like to compile stuff
      CC = "cc";
    };
  };
}

