{
  lib,
  config,
  pkgs,
  ...
}:
let
  inherit (lib) mkEnableOption mkIf;

  cfg = config.marleyos.programs.wezterm;
  inherit (config.marleyos.theme) colors;

  isGenericLinux = config.targets.genericLinux.enable;
in
{
  options.marleyos.programs.wezterm.enable = mkEnableOption "wezterm";

  config = mkIf cfg.enable {
    programs.wezterm = {
      enable = true;

      # Non-NixOS Linux systems don't have proper GPU integration, so we
      # unfortunately need to use the native package manager version.
      package = mkIf isGenericLinux pkgs.emptyDirectory;

      # TODO: create `local config` & return it seperately, so other modules can
      # insert config in the middle
      extraConfig =
        let
          # TODO: Set this in marleyos.theme
          fonts = config.fonts.fontconfig.defaultFonts.monospace;
        in
        # lua
        ''
          local config = wezterm.config_builder()

          config.enable_tab_bar = false

          config.color_scheme = "${colors.base}"

          config.font = wezterm.font_with_fallback({
            {
              family = "Maple Mono NF",
              -- TODO: Set this in marleyos.theme
              harfbuzz_features = {
                "cv02",
                "ss01",
                "ss02",
                "ss03",
                "ss04",
                "ss05",
              }
            },
            ${toString (map (font: "{ family = \"${font}\" },") fonts)}
            { family = "FairiesevkaTerm Nerd Font Mono" },
            {
              family = "FiraCode Nerd Font",
              harfbuzz_features = {
                "cv02",
                "cv06",
                "ss01",
                "cv14",
                "onum",
                "ss04",
                "cv18",
                "cv31",
                "cv30",
                "cv25",
                "cv26",
                "cv32",
                "ss06",
                "ss07",
              },
            },
            { family = "Apple Color Emoji" },
          })

          -- TODO: on mairley this should be set to 14.0
          config.font_size = 11.0

          return config
        '';
    };
  };
}