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

with lib;

let
  cfg = config.local.polybar;
  inherit (config.services.polybar) package;

  # TODO: create a theme
  colors = {
    orange = "#ee9a00";
    red = "#ff5555";
    green = "#50fa7b";
  };
in
{
  options.local.polybar = with lib; {
    wifiDevice = mkOption {
      type = types.str;
      example = "wlp11s0f3u2";
      description = "Set your wifi device";
    };
  };

  config = {
    systemd.user.services.polybar = {
      # Add additional /usr/bin to run custom scripts
      Service.Environment = mkForce "PATH=${package}/bin:/run/current-system/sw/bin";
    };

    services.polybar = {
      enable = true;
      script = "MONITOR=$(xrandr | grep \"connected primary\" | awk '{print $1;}') polybar &";
      settings =
        let padding = 1; in
        {
          "bar/main" = {
            monitor = "\${env:MONITOR:DisplayPort-1}";
            width = "100%";
            height = "20px";
            font = [
              "Fira Code:size=9:antialias=true"
              "Fira Code:bold:size=9:antialias=true"
              "FiraCode Nerd Font Mono:size=9:antialias=true"
              "FiraCode Nerd Font Mono:size=14:antialias=true"
            ];
            radius = 0;
            modules = {
              left = "xmonad";
              center = "date wifi";
              right = "exchangerate volume battery lang time";
            };
          };

          "module/date" = {
            type = "internal/date";
            interval = 10;
            date = "%a %d %b %Y";
            label = "%date%";
            format = { inherit padding; };
          };

          "module/time" = {
            type = "internal/date";
            time = "%H:%M:%S";
            label = {
              text = "%time%";
              font = 2;
              foreground = colors.orange;
            };
          };

          "module/lang" = {
            type = "internal/xkeyboard";
            format = {
              inherit padding;
              text = "<label-layout>";
            };
            label.layout.font = 2;
          };

          "module/volume" = {
            type = "custom/script";
            exec = "~/scripts/get_volume.sh";
            interval = 1;
            format = {
              inherit padding;
              prefix = "%{T4}%{T-} ";
            };
          };

          "module/battery" = {
            type = "internal/battery";
            full-at = 99;
            low-at = 10;
            battery = "BAT0";
            adapter = "AC0";

            format.charging = {
              inherit padding;
              text = "%{T3}%{T-} <label-charging>";
              foreground = colors.green;
            };

            format.discharging = {
              inherit padding;
              text = "%{T3}<ramp-capacity>%{T-} <label-discharging>";
              foreground = colors.orange;
            };

            format.full = {
              inherit padding;
              text = "%{T3}%{T-} <label-full>";
              foreground = colors.green;
            };

            format.low = {
              inherit padding;
              text = "%{T3}%{T-} <label-low>";
              foreground = colors.red;
            };

            # Only applies if <ramp-capacity> is used
            ramp.capacity = [ "" "" "" "" "" ];
          };

          "module/wifi" = {
            type = "internal/network";
            interval = 3;
            interface = {
              type = "wireless";
              text = cfg.wifiDevice;
            };
            label.connected = "%essid% %signal%";
            format.connected = {
              prefix = "| %{T4}%{T-} ";
              suffix = "%";
            };
          };

          "module/xmonad" = mkIf config.xsession.windowManager.xmonad.enable {
            type = "custom/script";
            exec = "${pkgs.xmonad-log}/bin/xmonad-log";
            tail = true;
          };

          "module/exchangerate" = {
            type = "custom/script";
            exec = "~/scripts/exchangerate.sh";
            interval = 60;
            format = {
              inherit padding;
              prefix = "USD: ";
            };
          };

          "global/wm" = {
            margin = {
              bottom = 0;
              top = 0;
            };
          };
        }
      ;
    };
  };
}
