{
  lib,
  pkgs,
  ...
}: let
  inherit (lib) mkEnableOption mkOption types;
in {
  options.myOptions.home-manager.theme = {
    gtk = {
      enable = mkEnableOption "GTK theming optionss";
      usePortal = mkEnableOption "native desktop portal use for filepickers";

      theme = {
        name = mkOption {
          type = types.str;
          default = "Tokyonight-Dark";
          description = "The name for the GTK theme package";
        };

        package = mkOption {
          type = types.package;
          description = "The theme package to be used for GTK programs";
          default = pkgs.tokyo-night-gtk;
        };
      };

      iconTheme = {
        name = mkOption {
          type = types.str;
          description = "The name for the icon theme that will be used for GTK programs";
          default = "Papirus-Dark";
        };

        package = mkOption {
          type = types.package;
          description = "The GTK icon theme package to be used";
          default = pkgs.catppuccin-papirus-folders.override {
            accent = "blue";
            flavor = "mocha";
          };
        };
      };

      font = {
        name = mkOption {
          type = types.str;
          description = "The name of the font that will be used for GTK applications";
          default = "Noto Sans"; # Lexend
        };

        size = mkOption {
          type = types.int;
          description = "The size of the font";
          default = 10; # 10
        };
      };
    };

    qt = {
      forceGtk = mkOption {
        type = types.bool;
        default = false;
        description = ''
          Whether to force QT applications to try and use the GTK theme.

          If false, qtct platform theme & Kvantum will be used instead.
        '';
      };

      kvantumTheme = {
        name = mkOption {
          type = types.str;
          default = "Catppuccin-Mocha-Blue";
          description = ''
            The name for the QT kvantum theme.

            This needs to match the directory containing the kvconfig & svg files
            for selected theme. The package should expose these in /share/Kvantum.

            This has no effect if forceGtk is set.
          '';
        };

        package = mkOption {
          type = types.package;
          description = ''
            The theme package to be used for QT kvantum theme.

            This needs to expose a directory in /share/Kvantum with the
            kvconfig & svg files. The name of this directory should match
            the kvantumTheme.name option.

            This has no effect if forceGtk is set.
          '';
          default = pkgs.catppuccin-kvantum.override {
            variant = "Mocha";
            accent = "Blue";
          };
        };
      };

      iconTheme = {
        name = mkOption {
          type = types.str;
          description = ''
            The name for the icon theme that will be used for QT programs.

            This has no effect if forceGtk is set.
          '';
          default = "Papirus-Dark";
        };

        package = mkOption {
          type = types.package;
          description = ''
            The QT icon theme package to be used.

            This has no effect if forceGtk is set.
          '';
          default = pkgs.catppuccin-papirus-folders.override {
            accent = "blue";
            flavor = "mocha";
          };
        };
      };
    };

    cursor = {
      name = mkOption {
        type = types.str;
        default = "BreezeX-RosePine-Linux";
        description = "The name of the cursor inside the package";
      };

      package = mkOption {
        type = types.package;
        default = pkgs.rose-pine-cursor;
        description = "The package providing the cursors";
      };

      size = mkOption {
        type = types.int;
        default = 24;
        description = "The size of the cursor";
      };
    };
  };
}
