{ config, lib, ... }:
{
  options.stylix.targets.bemenu = {
    enable = config.lib.stylix.mkEnableTarget "bemenu" true;

    fontSize = lib.mkOption {
      description = ''
        Font size used for bemenu.
      '';
      type = with lib.types; nullOr int;
      default = config.stylix.fonts.sizes.popups;
    }; # optional argument

    alternate = lib.mkOption {
      description = ''
        Whether to use alternating colours.
      '';
      type = lib.types.bool;
      default = false;
    };
  };

  config =
    lib.mkIf (config.stylix.enable && config.stylix.targets.bemenu.enable)
      {
        programs.bemenu.settings =
          with config.lib.stylix.colors.withHashtag;
          with config.stylix.fonts;
          with config.stylix.targets.bemenu;
          let
            bemenuOpacity = lib.toHexString (
              ((builtins.ceil (config.stylix.opacity.popups * 100)) * 255) / 100
            );
          in
          {
            tb = "${base01}${bemenuOpacity}"; # Title bg
            nb = "${base01}${bemenuOpacity}"; # Normal bg
            fb = "${base01}${bemenuOpacity}"; # Filter bg
            hb = "${base03}${bemenuOpacity}"; # Highlighted bg
            sb = "${base03}${bemenuOpacity}"; # Selected bg
            scb = "${base01}"; # Scrollbar bg

            hf = "${base0A}"; # Highlighted fg
            sf = "${base0B}"; # Selected fg
            tf = "${base05}"; # Title fg
            ff = "${base05}"; # Filter fg
            nf = "${base05}"; # Normal fg
            scf = "${base03}"; # Scrollbar fg

            ab = "${if alternate then base00 else base01}"; # Alternate bg
            af = "${if alternate then base04 else base05}"; # Alternate fg

            # Font name
            fn = "${sansSerif.name} ${
              lib.optionalString (fontSize != null) (builtins.toString fontSize)
            }";
          };
      };
}
