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

with lib;

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

  themeCfg = config.local.themes."${config.local.theme.name}";

  exchangerate = import ./scripts/exchangerate.nix { inherit themeCfg pkgs; };
  external_ip = import ./scripts/external_ip.nix { inherit themeCfg pkgs; };
in
{
  options.local.window-manager.polybar = with lib; {
    enable = mkEnableOption "polybar";

    wifiDevice = mkOption {
      type = types.str;
      example = "wlp11s0f3u2";
      description = "Set your wifi device";
    };
  };

  config = lib.mkIf cfg.enable {
    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;

          # See: https://github.com/polybar/polybar/issues/478
          fontVerticalOffset = 2;
          mkFont = fontconfig: fontconfig + ";${toString fontVerticalOffset}";
        in
        {
          settings = {
            pseudo-transparency = true;
          };

          "bar/main" = {
            monitor = "\${env:MONITOR:DisplayPort-1}";
            font = map mkFont [
              "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"
            ];
            modules = {
              left = "xmonad";
              center = "date wifi external_ip";
              right = "exchangerate volume battery lang time";
            };
            offset-x = "6px";
            offset-y = "6px";
            width = "100%:-12px";
            height = "26px";
            padding = 1;
            radius = 6.0;
            background = themeCfg.bar.background;
            foreground = themeCfg.bar.mainText;
            enable-ipc = true;
          };

          "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 = themeCfg.highlights.warning;
            };
          };

          "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 = themeCfg.highlights.success;
            };

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

            format.full = {
              inherit padding;
              text = "%{T3}󰁹%{T-} <label-full>";
              foreground = themeCfg.highlights.success;
            };

            format.low = {
              inherit padding;
              text = "%{T3}󰂃%{T-} <label-low>";
              foreground = themeCfg.highlights.critical;
            };

            # 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% %local_ip%";
            format.connected = {
              prefix = "| %{T4}%{T-} ";
              suffix = " |";
            };
          };

          "module/external_ip" = {
            type = "custom/script";
            exec = "${external_ip}/bin/external_ip";
            interval = 60;
            format = {
              inherit padding;
            };
          };

          "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 = "${exchangerate}/bin/exchangerate";
            interval = 60;
            format = {
              inherit padding;
              prefix = "USD: ";
            };
          };

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