{ config, pkgs, ... }:

{
  home.packages = with pkgs; [
    unstable.marksman
    unstable.svls
    unstable.nil
    unstable.nixpkgs-fmt
  ];

  programs.helix = {
    enable = true;
    package = pkgs.unstable.helix;
    defaultEditor = true;
    settings = {
      theme = "base16";
      editor.cursor-shape = {
        insert = "bar";
      };
    };
    languages = {
      # Rust
      language-server.rust-analyzer.config = {
        cargo = {
          features = "all";
        };
      };

      # Systemverilog
      language-server.svls = {
        command = "svls";
      };

      language = [
        {
          name = "verilog";
          language-servers = [ "svls" ];
        }
        {
          name = "nix";
          language-servers = [ "svls" ];
        }
      ];
    };
    themes = {
      base16 = let
        base00 = "#${config.colorScheme.palette.base00}";
        base01 = "#${config.colorScheme.palette.base01}";
        base02 = "#${config.colorScheme.palette.base02}";
        base03 = "#${config.colorScheme.palette.base03}";
        base04 = "#${config.colorScheme.palette.base04}";
        base05 = "#${config.colorScheme.palette.base05}";
        base06 = "#${config.colorScheme.palette.base06}";
        base07 = "#${config.colorScheme.palette.base07}";
        base08 = "#${config.colorScheme.palette.base08}";
        base09 = "#${config.colorScheme.palette.base09}";
        base0A = "#${config.colorScheme.palette.base0A}";
        base0B = "#${config.colorScheme.palette.base0B}";
        base0C = "#${config.colorScheme.palette.base0C}";
        base0D = "#${config.colorScheme.palette.base0D}";
        base0E = "#${config.colorScheme.palette.base0E}";
        base0F = "#${config.colorScheme.palette.base0F}";
      in  {
        "attributes" = base09;
        "comment" = { fg = base03; modifiers = ["italic"]; };
        "constant" = base09;
        "constant.character.escape" = base0C;
        "constant.numeric" = base09;
        "constructor" = base0D;
        "debug" = base03;
        "diagnostic" = { modifiers = ["underlined"]; };
        "diff.delta" = base09;
        "diff.minus" = base08;
        "diff.plus" = base0B;
        "error" = base08;
        "function" = base0D;
        "hint" = base03;
        "info" = base0D;
        "keyword" = base0E;
        "label" = base0E;
        "namespace" = base0E;
        "operator" = base05;
        "special" = base0D;
        "string"  = base0B;
        "type" = base0A;
        "variable" = base08;
        "variable.other.member" = base0B;
        "warning" = base09;

        "markup.bold" = { fg = base0A; modifiers = ["bold"]; };
        "markup.heading" = base0D;
        "markup.italic" = { fg = base0E; modifiers = ["italic"]; };
        "markup.link.text" = base08;
        "markup.link.url" = { fg = base09; modifiers = ["underlined"]; };
        "markup.list" = base08;
        "markup.quote" = base0C;
        "markup.raw" = base0B;
        "markup.strikethrough" = { modifiers = ["crossed_out"]; };

        "diagnostic.hint" = { underline = { style = "curl"; }; };
        "diagnostic.info" = { underline = { style = "curl"; }; };
        "diagnostic.warning" = { underline = { style = "curl"; }; };
        "diagnostic.error" = { underline = { style = "curl"; }; };

#        "ui.background" = { bg = base00; };
        "ui.bufferline.active" = { fg = base00; bg = base03; modifiers = ["bold"]; };
        "ui.bufferline" = { fg = base04; bg = base00; };
        "ui.cursor" = { fg = base0A; modifiers = ["reversed"]; };
        "ui.cursor.insert" = { fg = base0A; modifiers = ["reversed"]; };
        "ui.cursorline.primary" = { fg = base05; bg = base01; };
        "ui.cursor.match" = { fg = base0A; modifiers = ["reversed"]; };
        "ui.cursor.select" = { fg = base0A; modifiers = ["reversed"]; };
        "ui.gutter" = { bg = base00; };
        "ui.help" = { fg = base06; bg = base01; };
        "ui.linenr" = { fg = base03; bg = base00; };
        "ui.linenr.selected" = { fg = base04; bg = base01; modifiers = ["bold"]; };
        "ui.menu" = { fg = base05; bg = base01; };
        "ui.menu.scroll" = { fg = base03; bg = base01; };
        "ui.menu.selected" = { fg = base01; bg = base04; };
        "ui.popup" = { bg = base01; };
        "ui.selection" = { bg = base02; };
        "ui.selection.primary" = { bg = base02; };
        "ui.statusline" = { fg = base04; bg = base01; };
        "ui.statusline.inactive" = { bg = base01; fg = base03; };
        "ui.statusline.insert" = { fg = base00; bg = base0B; };
        "ui.statusline.normal" = { fg = base00; bg = base03; };
        "ui.statusline.select" = { fg = base00; bg = base0F; };
        "ui.text" = base05;
        "ui.text.focus" = base05;
        "ui.virtual.indent-guide" = { fg = base03; };
        "ui.virtual.inlay-hint" = { fg = base01; };
        "ui.virtual.ruler" = { bg = base01; };
        "ui.window" = { bg = base01; };
      };
    };
  };
}