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

with lib;
let
  cfg = config.my.theming;
in
{
  imports = [
    ./dracula.nix
    ./catppuccin-frappe.nix
    ./catppuccin-latte.nix
    ./catppuccin-macchiato.nix
    ./catppuccin-mocha.nix
  ];

  options.my.theming = {
    enable = mkEnableOption "theming";
    scheme = mkOption {
      type = types.enum [
        "dracula"
        "catppuccin-latte"
        "catppuccin-frappe"
        "catppuccin-macchiato"
        "catppuccin-mocha"
      ];
    };
  };

  config = mkIf cfg.enable {
    my.programs.tofi.settings = {
      font-size = "20";
      font =
        let
          fontBasePath = pkgs.nerdfonts.override {
            fonts = [ "FiraCode" ];
          };
        in
        "${fontBasePath}/share/fonts/truetype/NerdFonts/FiraCodeNerdFont-Regular.ttf";
      height = "360";
      width = "720";
      outline-width = "0";
      border-width = "0";
    };
    home-manager.users.moritz = {
      services.polybar = {
        config = {
          "bar/bottom" = {
            # position
            monitor = "\${env:MONITOR}";
            bottom = true;
            width = "100%";
            height = 15;

            border-size = 2;

            separator = " ";

            font-0 = "FiraCode Nerd Font:size=8;0";
            font-1 = "FiraCode Nerd Font:size=8;1";
            font-2 = "FiraCode Nerd Font:size=8;2";

            modules-left = "cpu memory network battery";
            modules-center = "bspwm";
            modules-right = "pulseaudio date time";

            tray-position = "right";
            tray-padding = 2;

            wm-restack = "bspwm";

            cursor-click = "pointer";
            cursor-scroll = "ns-resize";
          };
          "module/battery" = {
            type = "internal/battery";
            battery = "BATT";
            adapter = "ACAD";
            time-format = "%H:%M";

            format-charging = "<animation-charging> <label-charging>";
            format-charging-padding = 1;
            format-discharging = "<animation-discharging> <label-discharging>";
            format-discharging-padding = 1;
            format-full = " <label-full>";
            format-full-padding = 1;

            label-charging = "%percentage%% %time% remaining";
            label-discharging = "%percentage%% %time% remaining";
            label-full = "Fully charged";

            animation-charging-0 = " ";
            animation-charging-1 = " ";
            animation-charging-2 = " ";
            animation-charging-3 = " ";
            animation-charging-4 = " ";
            animation-charging-framerate = 500;

            animation-discharging-0 = " ";
            animation-discharging-1 = " ";
            animation-discharging-2 = " ";
            animation-discharging-3 = " ";
            animation-discharging-4 = " ";
            animation-discharging-framerate = 500;
          };
          "module/bspwm" = {
            type = "internal/bspwm";

            label-focused = "";
            label-focused-padding = 1;

            label-occupied = "";
            label-occupied-padding = 1;

            label-urgent = "";
            label-urgent-padding = 1;

            label-empty = "";
            label-empty-padding = 1;

            label-separator = " ";
            label-separator-padding = 1;

            pin-workspaces = true;
          };
          "module/cpu" = {
            type = "internal/cpu";
            interval = 2;

            format = "<ramp-load><label>";
            format-padding = 1;
            format-font = 3;

            ramp-load-0 = " ";
            ramp-load-1 = " ";
            ramp-load-2 = " ";
            ramp-load-3 = " ";

            label = "%percentage:2%%";
          };
          "module/time" = {
            type = "internal/date";
            interval = 1;

            time = "%H:%M";
            time-alt = "%H:%M:%S";

            label = "%time%";
            format-prefix = " ";
            format-prefix-font = 2;
            format-padding = 1;
            label-font = 3;
          };
          "module/date" = {
            type = "internal/date";
            interval = 5;

            format = "<label>";
            format-prefix = " ";
            format-prefix-font = 2;
            format-padding = 1;
            format-font = 3;

            date = "%A";
            date-alt = "%Y-%m-%d";

            label = "%date%";
            label-font = 3;
          };
          "module/memory" = {
            type = "internal/memory";
            interval = 2;

            format = "<label>";
            format-prefix = " ";
            format-padding = 1;
            format-font = 2;

            label = "%gb_used%";
            label-font = 3;
          };
          "module/pulseaudio" = {
            type = "internal/pulseaudio";

            format-volume = "<ramp-volume> <label-volume>";
            label-volume = "%percentage%%";

            format-volume-padding = 1;
            format-volume-font = 2;

            format-muted-padding = 1;
            format-muted-font = 2;
            ramp-volume-0 = "奄";
            ramp-volume-1 = "奄";
            ramp-volume-2 = "奔";
            ramp-volume-3 = "墳";
            ramp-volume-4 = "墳";

            click-middle = "${pkgs.pavucontrol}/bin/pavucontrol";
          };
          "module/network" = {
            type = "internal/network";
            interface =
              builtins.head (builtins.attrNames config.networking.interfaces);
            interval = 3;
            format-connected = "<label-connected>";
            label-connected = "%{T2}祝%{T3} %upspeed% %{T2}%{T3} %downspeed%";

            format-connected-padding = 1;
            format-connected-font = 3;
          };
        };
      };
    };
  };
}