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

with lib;

let
  cfg = config.settings.applications.helix;
in {
  options = {
    settings.applications.helix.enable = lib.mkOption {
      type = lib.types.bool;
      description = ''
        Enable helix text editor
      '';
    };
  };

  config = mkIf cfg.enable {
    home.packages = with pkgs; [
      unstable.marksman
      unstable.markdown-oxide
      unstable.svls
      unstable.nil
      unstable.nixpkgs-fmt
      unstable.tectonic
      unstable.texlab
      dprint
    ];

    home.file.".config/.dprint.json".text =''
      {
        "markdown": {
          "lineWidth":120,
        },
        "excludes": [],
        "plugins": [
          "https://plugins.dprint.dev/markdown-0.16.1.wasm"
        ]
      }
    '';

    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-server.texlab = {
          config = {
            texlab.chktex = {
              onOpenAndSave = true;
              onEdit = true;
            };
            texlab.forwardSearch = {
              executable = "zathura";
              args = [
                "--synctex-forward"
                "%l:%c:%f"
                "%p"
              ];
            };
            texlab.build = {
              auxDirectory = "build";
              logDirectory = "build";
              pdfDirectory = "build";
              forwardSearchAfter = true;
              onSave = true;
              executable = "tectonic";
              args = [
                "-X"
                "compile"
                "--synctex"
                "--keep-logs"
                "--keep-intermediates"
                "--outdir=build"
                "%f"
              ];
            };
          };
        };

        language = [
          {
            name = "verilog";
            language-servers = [ "svls" ];
          }
          {
            name = "html";
            language-servers = [ "vscode-html-language-server" "tailwindcss-ls" ];
          }
          {
            name = "css";
            language-servers = [ "vscode-html-language-server" "tailwindcss-ls" ];
          }
          {
            name = "markdown";
            auto-format = true;
            language-servers = [ "markdown-oxide" ];
            formatter.command = "dprint";
            formatter.args = ["fmt" "--stdin" "md" "--config" "/home/xeovalyte/.config/.dprint.json"];
          }
          {
            name = "typst";
            auto-format = false;
            formatter.command = "${pkgs.typstfmt}/bin/typstfmt";
          }
        ];
      };
  #     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; };
  #       };
  #     };
    };
  };
}
