{
  lib,
  config,
  pkgs,
  system,
  ...
}:
let
  inherit (lib)
    types
    mkOption
    literalMD
    mkMerge
    mkIf
    mkDefault
    ;
  inherit (lib.snowfall.system) is-linux;

  cfg = config.marleyos.theme;

  colorThemes = lib.types.enum [
    "rose-pine"
  ];

  colorThemeType = types.submodule {
    options = {
      base = mkOption {
        type = colorThemes;
        example = "rose-pine";
        description = literalMD ''
          The color theme to use. This should match the base of the enable
          options provided by the input's module. For instance, the rose-pine
          home-manager module provides the {option}`rose-pine.enable` base
          option and the {option}`programs.gtk.rose-pine.enable` option.
        '';
      };

      flavor = mkOption {
        type = with types; nullOr str;
        default = null;
        example = "moon";
        description = "The theme flavor to use, if applicable.";
      };

      accent = mkOption {
        type = with types; nullOr str;
        default = null;
        example = "rose";
        description = "The theme accent to use, if applicable.";
      };
    };
  };

  mkColorThemeOpt =
    mode: flavor:
    (mkOption {
      type = with types; either str colorThemeType;
      default = {
        base = "rose-pine";
        inherit flavor;
      };
      description = "The color theme to use in ${mode} mode.";
    });

  # https://github.com/nix-community/home-manager/blob/master/modules/misc/gtk.nix
  iconThemeType = types.submodule {
    options = {
      package = mkOption {
        type = with types; nullOr package;
        default = null;
        example = "pkgs.gnome.adwaita-icon-theme";
        description = ''
          Package providing the icon theme. This package will be installed to
          your profile. If `null` then the theme is assumed to already be
          available in your profile.
        '';
      };

      name = mkOption {
        type = with types; str;
        example = "Adwaita";
        description = "The name of the icon theme within the package.";
      };
    };
  };
in
{
  options.marleyos.theme = {
    colors = {
      default = mkOption {
        type = with types; str;
        default = "dark";
        description = "Whether to prefer the light or dark theme.";
      };

      light = mkColorThemeOpt "light" "dawn";
      dark = mkColorThemeOpt "dark" "main";

      base = mkOption {
        type = colorThemes;
      };
      flavor = mkOption {
        type = with types; nullOr str;
      };
      accent = mkOption {
        type = with types; nullOr str;
      };

      isRosePine = mkOption {
        type = with types; bool;
      };
    };

    icons = mkOption {
      type = with types; nullOr iconThemeType;
      default = null;
      description = "The icon theme to use.";
    };

    pinentry = mkOption {
      type = with types; package;
      default = pkgs.pinentry-gtk2;
      description = "The pinentry package to use.";
    };
  };

  config = mkMerge [
    # colors
    {
      marleyos.theme.colors = rec {
        inherit (cfg.colors."${cfg.colors.default}") base;
        inherit (cfg.colors."${cfg.colors.default}") flavor;
        inherit (cfg.colors."${cfg.colors.default}") accent;

        # HACK: Need to come up with a better solution
        isRosePine = base == "rose-pine";
      };
    }

    # icons
    (mkIf (cfg.icons != null) {
      gtk = mkDefault {
        iconTheme = {
          inherit (cfg.icons) name;
          package = mkIf (cfg.icons.package != null) cfg.icons.package;
        };
      };

      services.dunst = mkDefault {
        iconTheme = {
          inherit (cfg.icons) name;
          package = mkIf (cfg.icons.package != null) cfg.icons.package;
        };
      };
    })

    # pinentry
    (mkIf (is-linux system) {
      home.packages = [
        cfg.pinentry
      ];

      programs.rbw = mkDefault {
        settings.pinentry = cfg.pinentry;
      };

      services.gpg-agent = mkDefault {
        pinentryPackage = cfg.pinentry;
      };
    })
  ];
}
