include_guard ()

find_package (
	Doxygen
	COMPONENTS dot
	OPTIONAL_COMPONENTS mscgen dia
)

set (
	DOXYGEN_FOUND
	${DOXYGEN_FOUND}
	PARENT_SCOPE
)

set (IHTA_CMAKE_COMMON_DOCSTYLE_LANDED ${CMAKE_CURRENT_LIST_DIR}/resources/landed.css)
set (IHTA_CMAKE_COMMON_DOCSTYLE_RWTH ${CMAKE_CURRENT_LIST_DIR}/resources/rwth.css)
set (IHTA_CMAKE_COMMON_DOC_LOGO ${CMAKE_CURRENT_LIST_DIR}/resources/ihta.svg)

set (
	IHTA_CMAKE_COMMON_DOCSTYLE_LANDED
	${IHTA_CMAKE_COMMON_DOCSTYLE_LANDED}
	PARENT_SCOPE
)
set (
	IHTA_CMAKE_COMMON_DOCSTYLE_RWTH
	${IHTA_CMAKE_COMMON_DOCSTYLE_RWTH}
	PARENT_SCOPE
)
set (
	IHTA_CMAKE_COMMON_DOC_LOGO
	${IHTA_CMAKE_COMMON_DOC_LOGO}
	PARENT_SCOPE
)

#[=======================================================================[.rst:
..command:: build_doc

	Macro to generate doxygen documentation with custom logo and style sheet.

	::

		build_doc(
			NAME genDocTarget
			SOURCES <documentation-folder...>
			[README_MAINPAGE <readme-file-for-main-page>]
			[COLOR_STYLE <css-style-sheet>]
			[LOGO <logo-file>]
			[ADD_DEV_SECTION]
			[SIDEBAR_ONLY]
		)

	.. variables:: NAME

		Target name for building the documentation.
		Default is `build_doc`

	.. variable:: SOURCES

		List of folders or files to be included in the doxygen documentation

	.. variable:: README_MAINPAGE

		Specify a specific README markdown file as the mainpage for the documentation.

	.. variable:: COLOR_STYLE

		``css`` style sheet with a custom color style.
		The definition must follow the `doxygen-awesome-css <https://github.com/jothepro/doxygen-awesome-css>`_ definition.
		Default is the included `landed` style.

	.. variable:: LOGO

		Logo file for the documentation.
		Used in the header as well as the icon in the tab.
		Default is the included IHTA logo.

	.. variable:: ADD_DEV_SECTION

		If true, the `DEV` section will be enabled in doxygen.
		If the documentation is set up correctly, parts of the documentation can be hidden with this.
		This means, adding a `\cond DEV` in the file scope documentation comment.

	.. variable:: SIDEBAR_ONLY

		Specifies, that the `doxygen-awesome-css` sidebar ony style should be used.


#]=======================================================================]
macro (build_doc)
	set (options SIDEBAR_ONLY)
	set (oneValueArgs README_MAINPAGE COLOR_STYLE LOGO ADD_DEV_SECTION NAME)
	set (multiValueArgs SOURCES)
	cmake_parse_arguments (DOXY "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})

	if (NOT DOXY_NAME)
		set (DOXY_NAME build_doc)
	endif ()

	if (DOXYGEN_FOUND)
		CPMAddPackage (
			NAME doxygen-awesome
			GITHUB_REPOSITORY jothepro/doxygen-awesome-css
			VERSION 2.1.0
			DOWNLOAD_ONLY YES
		)

		execute_process (
			COMMAND ${DOXYGEN_EXECUTABLE} -w html ${CMAKE_BINARY_DIR}/header ${CMAKE_BINARY_DIR}/footer
					${CMAKE_BINARY_DIR}/style
		)
		file (READ ${CMAKE_BINARY_DIR}/header doc_header_tmp)
		string (
			REPLACE
				"</head>"
				[[<script type="text/javascript" src="$relpath^doxygen-awesome-darkmode-toggle.js"></script>
<script type="text/javascript" src="$relpath^doxygen-awesome-paragraph-link.js"></script>
<script type="text/javascript">
	DoxygenAwesomeDarkModeToggle.init()
	DoxygenAwesomeParagraphLink.init()
</script>
<!--BEGIN PROJECT_LOGO-->
<link rel="shortcut icon" href="$relpath^$projectlogo" type="image/x-icon" />
<!--END PROJECT_LOGO-->
</head>]]
				doc_header_tmp
				${doc_header_tmp}
		)

		file (WRITE ${CMAKE_BINARY_DIR}/header ${doc_header_tmp})
		unset (doc_header_tmp)

		set (DOXYGEN_GENERATE_TREEVIEW YES)
		set (DOXYGEN_HTML_EXTRA_STYLESHEET ${doxygen-awesome_SOURCE_DIR}/doxygen-awesome.css)

		if (DOXY_SIDEBAR_ONLY)
			list (APPEND DOXYGEN_HTML_EXTRA_STYLESHEET ${doxygen-awesome_SOURCE_DIR}/doxygen-awesome-sidebar-only.css
				  ${doxygen-awesome_SOURCE_DIR}/doxygen-awesome-sidebar-only-darkmode-toggle.css
			)
		endif ()

		if (DEFINED DOXY_COLOR_STYLE)
			list (APPEND DOXYGEN_HTML_EXTRA_STYLESHEET ${DOXY_COLOR_STYLE})
		else ()
			list (APPEND DOXYGEN_HTML_EXTRA_STYLESHEET ${IHTA_CMAKE_COMMON_DOCSTYLE_LANDED})
		endif ()

		set (DOXYGEN_HTML_COLORSTYLE_HUE 209)
		set (DOXYGEN_HTML_COLORSTYLE_SAT 255)
		set (DOXYGEN_HTML_COLORSTYLE_GAMMA 113)
		set (DOXYGEN_DOT_IMAGE_FORMAT svg)
		set (DOXYGEN_DOT_TRANSPARENT YES)
		set (DOXYGEN_INTERACTIVE_SVG YES)

		if (DEFINED DOXY_README_MAINPAGE)
			set (DOXYGEN_USE_MDFILE_AS_MAINPAGE ${DOXY_README_MAINPAGE})
			list (APPEND DOXY_SOURCES ${DOXY_README_MAINPAGE})
		endif ()

		set (DOXYGEN_HTML_HEADER ${CMAKE_BINARY_DIR}/header)
		set (DOXYGEN_HTML_EXTRA_FILES ${doxygen-awesome_SOURCE_DIR}/doxygen-awesome-darkmode-toggle.js
									  ${doxygen-awesome_SOURCE_DIR}/doxygen-awesome-paragraph-link.js
		)

		if (DEFINED DOXY_LOGO)
			set (DOXYGEN_PROJECT_LOGO ${DOXY_LOGO})
			list (APPEND DOXYGEN_HTML_EXTRA_FILES ${DOXY_LOGO})
		else ()
			set (DOXY_LOGO ${IHTA_CMAKE_COMMON_DOC_LOGO})
			set (DOXYGEN_PROJECT_LOGO ${DOXY_LOGO})
			list (APPEND DOXYGEN_HTML_EXTRA_FILES ${DOXY_LOGO})
		endif ()

		if (DOXY_ADD_DEV_SECTION)
			set (DOXYGEN_ENABLED_SECTIONS DEV)
			set (DOXYGEN_EXTRACT_PRIVATE YES)
		endif ()

		doxygen_add_docs (${DOXY_NAME} ${DOXY_SOURCES} ALL)

		set_property (TARGET ${DOXY_NAME} PROPERTY FOLDER "utils")

	endif ()

endmacro ()