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

let
  inherit (lib.modules) mkIf;
  inherit (lib.strings) concatStringsSep;
in {
  options.modules.shell.toolset.btop = let inherit (lib.options) mkEnableOption;
  in { enable = mkEnableOption "system-monitor"; };

  config = mkIf config.modules.shell.toolset.btop.enable {
    hm.programs.btop = let inherit (config.modules.themes) active;
    in {
      enable = true;
      settings = {
        force_tty = false;
        vim_keys = true; # Directional keys: "h,j,k,l,g,G"
        update_ms = 1500; # ms (s^{-3})
        temp_scale = "celsius";
        base_10_sizes = false;
        show_cpu_freq = true;
        clock_format = "%H:%M";
        background_update = true;
        disks_filter = "exclude=/boot";

        color_theme = "${active}";
        rounded_corners = true;
        theme_background = false;
        truecolor = true;
        presets = concatStringsSep "," [
          "cpu:1:default"
          "proc:0:default cpu:0:default"
          "mem:0:default"
          "net:0:default cpu:0:block"
          "net:0:tty"
        ];
        graph_symbol = "braille";
        graph_symbol_cpu = "default";
        graph_symbol_mem = "default";
        graph_symbol_net = "default";
        graph_symbol_proc = "default";
        shown_boxes = "proc cpu mem net";

        proc_sorting = "cpu lazy";
        proc_reversed = false;
        proc_tree = false;
        proc_colors = true;
        proc_gradient = true;
        proc_per_core = true;
        proc_mem_bytes = true;
        proc_info_smaps = false;
        proc_left = false;

        cpu_graph_upper = "total";
        cpu_graph_lower = "total";
        cpu_single_graph = false;
        cpu_bottom = false;
        show_uptime = true;
        check_temp = true;
        cpu_sensor = "Auto";
        show_coretemp = true;
        cpu_core_map = "";
        custom_cpu_name = "";

        mem_graphs = true;
        mem_below_net = false;

        show_swap = true;
        swap_disk = true;
        show_disks = true;
        only_physical = true;
        use_fstab = false; # Enable -> disables `only_physical`
        disk_free_priv = false;
        show_io_stat = true;

        io_mode = false;
        io_graph_combined = false;
        io_graph_speeds = "";

        net_download = 100;
        net_upload = 100;
        net_auto = true;
        net_sync = false;
        net_iface = "br0";
        show_battery = true;
        selected_battery = "Auto";
        log_level = "DEBUG";
      };
    };

    create.configFile.btop-theme = let inherit (config.modules.themes) active;
    in mkIf (active != null) {
      target = "btop/themes/${active}.theme";
      text = let inherit (config.modules.themes.colors.main) bright types;
      in ''
        theme[main_bg]="${types.bg}"
        theme[main_fg]="${types.fg}"
        theme[title]="${types.fg}"
        theme[hi_fg]="${types.highlight}"
        theme[selected_bg]="${types.border}"
        theme[selected_fg]="${types.bg}"
        theme[inactive_fg]="${bright.black}"
        theme[graph_text]="${bright.yellow}"
        theme[meter_bg]="${bright.black}"
        theme[proc_misc]="${bright.yellow}"
        theme[cpu_box]="${bright.cyan}"
        theme[mem_box]="${bright.green}"
        theme[net_box]="${bright.magenta}"
        theme[proc_box]="${bright.yellow}"
        theme[div_line]="${bright.black}"
        theme[temp_start]="${bright.yellow}"
        theme[temp_mid]="${types.panelbg}"
        theme[temp_end]="${bright.red}"
        theme[cpu_start]="${bright.cyan}"
        theme[cpu_mid]="${types.border}"
        theme[cpu_end]="${bright.green}"
        theme[free_start]="${bright.green}"
        theme[free_mid]="${bright.green}"
        theme[free_end]="${bright.green}"
        theme[cached_start]="${bright.yellow}"
        theme[cached_mid]="${bright.yellow}"
        theme[cached_end]="${bright.magenta}"
        theme[available_start]="${bright.yellow}"
        theme[available_mid]="${bright.yellow}"
        theme[available_end]="${bright.yellow}"
        theme[used_start]="${types.panelbg}"
        theme[used_mid]="${types.panelbg}"
        theme[used_end]="${bright.red}"
        theme[download_start]="${bright.blue}"
        theme[download_mid]="${bright.blue}"
        theme[download_end]="${bright.magenta}"
        theme[upload_start]="${bright.blue}"
        theme[upload_mid]="${bright.blue}"
        theme[upload_end]="${bright.magenta}"
        theme[process_start]="${bright.cyan}"
        theme[process_mid]="${types.border}"
        theme[process_end]="${bright.green}"
      '';
    };
  };
}
