class ConfigOptionsDocGenerator {

	@VisibleForTesting
	static List<Tuple2<ConfigGroup, String>> generateTablesForClass(Class<?> optionsClass) {
		ConfigGroups configGroups = optionsClass.getAnnotation(ConfigGroups.class);
		List<OptionWithMetaInfo> allOptions = extractConfigOptions(optionsClass);

		if (allOptions.isEmpty()) {
			return Collections.emptyList();
		}

		List<Tuple2<ConfigGroup, String>> tables;
		if (configGroups != null) {
			tables = new ArrayList<>(configGroups.groups().length + 1);
			Tree tree = new Tree(configGroups.groups(), allOptions);

			for (ConfigGroup group : configGroups.groups()) {
				List<OptionWithMetaInfo> configOptions = tree.findConfigOptions(group);
				if (!configOptions.isEmpty()) {
					sortOptions(configOptions);
					tables.add(Tuple2.of(group, toHtmlTable(configOptions)));
				}
			}
			List<OptionWithMetaInfo> configOptions = tree.getDefaultOptions();
			if (!configOptions.isEmpty()) {
				sortOptions(configOptions);
				tables.add(Tuple2.of(null, toHtmlTable(configOptions)));
			}
		} else {
			sortOptions(allOptions);
			tables = Collections.singletonList(Tuple2.of(null, toHtmlTable(allOptions)));
		}
		return tables;
	}

	private  ConfigOptionsDocGenerator();

}