###############################################################################
#
# Description       : CMake build script for libSBML
# Original author(s): Frank Bergmann <fbergman@caltech.edu>
# Organization      : California Institute of Technology
#
# This file is part of libSBML.  Please visit http://sbml.org for more
# information about SBML, and the latest version of libSBML.
#
# Copyright (C) 2013-2018 jointly by the following organizations:
#     1. California Institute of Technology, Pasadena, CA, USA
#     2. EMBL European Bioinformatics Institute (EMBL-EBI), Hinxton, UK
#     3. University of Heidelberg, Heidelberg, Germany
#
# Copyright (C) 2009-2013 jointly by the following organizations:
#     1. California Institute of Technology, Pasadena, CA, USA
#     2. EMBL European Bioinformatics Institute (EMBL-EBI), Hinxton, UK
#
# Copyright (C) 2006-2008 by the California Institute of Technology,
#     Pasadena, CA, USA
#
# Copyright (C) 2002-2005 jointly by the following organizations:
#     1. California Institute of Technology, Pasadena, CA, USA
#     2. Japan Science and Technology Agency, Japan
#
# This library is free software; you can redistribute it and/or modify it
# under the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation.  A copy of the license agreement is provided
# in the file named "LICENSE.txt" included with this software distribution
# and also available online as http://sbml.org/software/libsbml/license.html
#
###############################################################################

if (WITH_DOXYGEN)
find_package(Doxygen)
find_package(PythonInterp)

if (NOT EXISTS "${DOXYGEN_EXECUTABLE}")
		message(FATAL_ERROR "Cannot generate documentation, please install doxygen / specify the DOXYGEN_EXECUTABLE.")
endif()

if (NOT EXISTS "${PYTHON_EXECUTABLE}")
		message(FATAL_ERROR "Cannot generate documentation, please install python / specify the PYTHON_EXECUTABLE.")
endif()

# -----------------------------------------------------------------------------
# 'comp' package
# -----------------------------------------------------------------------------

SET(PACKAGE_COMP_VERSION 1)
SET(PACKAGE_COMP_RELEASE 3)
SET(PACKAGE_COMP_SPEC_URL "http://identifiers.org/combine.specifications/sbml.level-3.version-1.comp.version-1.release-3")
SET(PACKAGE_COMP_ERRATA_URL "https://github.com/sbmlteam/sbml-specifications/issues?q=is%3Aissue+is%3Aopen+label%3A%22L3+Package%3A+comp%22")

# -----------------------------------------------------------------------------
# 'distrib' package
# -----------------------------------------------------------------------------

SET(PACKAGE_DISTRIB_VERSION 1)
SET(PACKAGE_DISTRIB_RELEASE 1)
SET(PACKAGE_DISTRIB_SPEC_URL "http://identifiers.org/combine.specifications/sbml.level-3.version-1.distrib.version-1.release-1")
SET(PACKAGE_DISTRIB_ERRATA_URL "https://github.com/sbmlteam/sbml-specifications/issues?q=is%3Aissue+is%3Aopen+label%3A%22L3+Package%3A+distrib%22")


# -----------------------------------------------------------------------------
# 'fbc' package v1
# -----------------------------------------------------------------------------

SET(PACKAGE_FBC_V1_VERSION 1)
SET(PACKAGE_FBC_V1_RELEASE 1)
SET(PACKAGE_FBC_V1_SPEC_URL "http://identifiers.org/combine.specifications/sbml.level-3.version-1.fbc.version-1.release-1")
SET(PACKAGE_FBC_V1_ERRATA_URL "https://github.com/sbmlteam/sbml-specifications/issues?q=is%3Aissue+is%3Aopen+label%3A%22L3+Package%3A+fbc%22")

# -----------------------------------------------------------------------------
# 'fbc' package v2
# -----------------------------------------------------------------------------

SET(PACKAGE_FBC_V2_VERSION 2)
SET(PACKAGE_FBC_V2_RELEASE 1)
SET(PACKAGE_FBC_V2_SPEC_URL "http://identifiers.org/combine.specifications/sbml.level-3.version-1.fbc.version-2.release-1")
SET(PACKAGE_FBC_V2_ERRATA_URL "https://github.com/sbmlteam/sbml-specifications/issues?q=is%3Aissue+is%3Aopen+label%3A%22L3+Package%3A+fbc%22")

# -----------------------------------------------------------------------------
# 'groups' package v1
# -----------------------------------------------------------------------------

SET(PACKAGE_GROUPS_V1_VERSION 1)
SET(PACKAGE_GROUPS_V1_RELEASE 1)
SET(PACKAGE_GROUPS_V1_SPEC_URL "http://identifiers.org/combine.specifications/sbml.level-3.version-1.groups.version-1.release-1")
SET(PACKAGE_GROUPS_V1_ERRATA_URL "https://github.com/sbmlteam/sbml-specifications/issues?q=is%3Aissue+is%3Aopen+label%3A%22L3+Package%3A+groups%22")

# -----------------------------------------------------------------------------
# 'multi' package v1
# -----------------------------------------------------------------------------

SET(PACKAGE_MULTI_V1_VERSION 1)
SET(PACKAGE_MULTI_V1_RELEASE 1)
SET(PACKAGE_MULTI_V1_SPEC_URL "http://identifiers.org/combine.specifications/sbml.level-3.version-1.multi.version-1.release-1")
SET(PACKAGE_MULTI_V1_ERRATA_URL "https://github.com/sbmlteam/sbml-specifications/issues?q=is%3Aissue+is%3Aopen+label%3A%22L3+Package%3A+multi%22")

# -----------------------------------------------------------------------------
# 'layout' package
# -----------------------------------------------------------------------------

SET(PACKAGE_LAYOUT_VERSION 1)
SET(PACKAGE_LAYOUT_RELEASE 1)
SET(PACKAGE_LAYOUT_SPEC_URL "http://identifiers.org/combine.specifications/sbml.level-3.version-1.layout.version-1.release-1")
SET(PACKAGE_LAYOUT_ERRATA_URL "https://github.com/sbmlteam/sbml-specifications/issues?q=is%3Aissue+is%3Aopen+label%3A%22L3+Package%3A+layout%22")

# -----------------------------------------------------------------------------
# 'render' package
# -----------------------------------------------------------------------------

SET(PACKAGE_RENDER_VERSION 1)
SET(PACKAGE_RENDER_RELEASE 1)
SET(PACKAGE_RENDER_SPEC_URL "http://identifiers.org/combine.specifications/sbml.level-3.version-1.render.version-1.release-1")
SET(PACKAGE_RENDER_ERRATA_URL "https://github.com/sbmlteam/sbml-specifications/issues?q=is%3Aissue+is%3Aopen+label%3A%22L3+Package%3A+render%22")

# -----------------------------------------------------------------------------
# 'qual' package
# -----------------------------------------------------------------------------

SET(PACKAGE_QUAL_VERSION 1)
SET(PACKAGE_QUAL_RELEASE 1)
SET(PACKAGE_QUAL_SPEC_URL "http://identifiers.org/combine.specifications/sbml.level-3.version-1.qual.version-1.release-1")
SET(PACKAGE_QUAL_ERRATA_URL "https://github.com/sbmlteam/sbml-specifications/issues?q=is%3Aissue+is%3Aopen+label%3A%22L3+Package%3A+qual%22")

# -----------------------------------------------------------------------------
# 'spatial' package
# -----------------------------------------------------------------------------

SET(PACKAGE_SPATIAL_VERSION 1)
SET(PACKAGE_SPATIAL_RELEASE 1)
SET(PACKAGE_SPATIAL_SPEC_URL "https://www.degruyter.com/document/doi/10.1515/jib-2022-0054/html")
SET(PACKAGE_SPATIAL_ERRATA_URL "https://github.com/sbmlteam/sbml-specifications/issues?q=is%3Aissue+is%3Aopen+label%3A%22L3+Package%3A+spatial%22")


# determine doxygen version
IF(DOXYGEN_EXECUTABLE)
  EXECUTE_PROCESS(COMMAND ${DOXYGEN_EXECUTABLE} "--version" OUTPUT_VARIABLE DOXYGEN_VERSION OUTPUT_STRIP_TRAILING_WHITESPACE)
ENDIF()

# write specific file
if (DOXYGEN_VERSION VERSION_GREATER 1.7)
file(WRITE ${CMAKE_CURRENT_SOURCE_DIR}/src/doxygen-version-specific.txt "MARKDOWN_SUPPORT = NO")
else()
file(WRITE ${CMAKE_CURRENT_SOURCE_DIR}/src/doxygen-version-specific.txt "")
endif()

# configure java documentation file
configure_file(
	${CMAKE_CURRENT_SOURCE_DIR}/src/java-substitutions/libsbmlConstants.java.in
	${CMAKE_CURRENT_SOURCE_DIR}/src/java-substitutions/libsbmlConstants.java
)

# disable dot if we don't have it
set(HAVE_DOT)
set(DOT_PATH)
if (EXISTS "${DOXYGEN_DOT_PATH}")
	set(HAVE_DOT "YES")
	file(TO_NATIVE_PATH ${DOXYGEN_DOT_PATH} DOT_PATH)
else()
	set(HAVE_DOT "NO")
	set(DOT_PATH "")
endif()

set(PACKAGE_NAME "libSBML")

# replace variables as needed
foreach( lang "common" "c" "cpp" "perl" "python" "csharp")
configure_file(
	${CMAKE_CURRENT_SOURCE_DIR}/src/doxygen-config-${lang}.txt.cmake
	${CMAKE_CURRENT_SOURCE_DIR}/src/doxygen-config-${lang}.txt
	@ONLY
)
endforeach()

file(GLOB HTML_TEMPLATES ${CMAKE_CURRENT_SOURCE_DIR}/src/common-text/*.html.in)
foreach(file ${HTML_TEMPLATES})
	get_filename_component(filename ${file} NAME)
	string(REPLACE ".in" "" filename ${filename})
	configure_file(
		${file}
		${CMAKE_CURRENT_SOURCE_DIR}/src/common-text/${filename}
		@ONLY
	)
endforeach()

# create C-api manuals
macro(createManual lang)
	ADD_CUSTOM_COMMAND(
		OUTPUT ${CMAKE_CURRENT_SOURCE_DIR}/formatted/${lang}-api/index.html

		# call create manual script
		COMMAND "${CMAKE_COMMAND}"
		ARGS -DLANGUAGE="${lang}"
			 -DROOT_DIR=${LIBSBML_ROOT_SOURCE_DIR}
			 -DSRC_DIR=${CMAKE_CURRENT_SOURCE_DIR}
			 -DOUTPUT_DIR=${CMAKE_CURRENT_SOURCE_DIR}/formatted/${lang}-api/
			 -DPYTHON_EXECUTABLE=${PYTHON_EXECUTABLE}
			 -DDOXYGEN_EXECUTABLE=${DOXYGEN_EXECUTABLE}
			 -P "${CMAKE_CURRENT_SOURCE_DIR}/create-manual.cmake"
			
		COMMENT "Generate ${lang}-API Documentation"
		DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/CMakeLists.txt
		        ${CMAKE_CURRENT_SOURCE_DIR}/create-manual.cmake
				${CMAKE_CURRENT_SOURCE_DIR}/index-helper.cmake
				${CMAKE_CURRENT_SOURCE_DIR}/src/doxygen-config-${lang}.txt
				${CMAKE_CURRENT_SOURCE_DIR}/src/doxygen-config-${lang}.txt.cmake

	)


	add_custom_target(api_docs_${lang} ALL DEPENDS
		${CMAKE_CURRENT_SOURCE_DIR}/formatted/${lang}-api/index.html
		${CMAKE_CURRENT_SOURCE_DIR}/CMakeLists.txt)

	if (${lang} STREQUAL "python")
		add_dependencies(api_docs_${lang} api_docs_python_py)
	endif()
	
	install(DIRECTORY ${output_path} DESTINATION ${MISC_PREFIX}docs )

endmacro()

createManual(c)
createManual(cpp)

# create python-api manuals
if (WITH_PYTHON)
	file(GLOB PYTHON_SUBSTITUTIONS ${CMAKE_CURRENT_SOURCE_DIR}/src/python-substitutions/*.py)
	ADD_CUSTOM_COMMAND(
		OUTPUT ${CMAKE_CURRENT_SOURCE_DIR}/src/libsbml.py
		COMMAND ${PYTHON_EXECUTABLE}
		ARGS    ${CMAKE_CURRENT_SOURCE_DIR}/src/utilities/pythondocpreprocessor.py
				${CMAKE_CURRENT_BINARY_DIR}/../src/bindings/python/libsbml-doxygen.py  
				libsbml.py
				${PYTHON_SUBSTITUTIONS}
		WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/src
		COMMENT "Generate libsbml.py"
		DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/CMakeLists.txt
	)	
	add_custom_target(api_docs_python_py ALL DEPENDS
		${CMAKE_CURRENT_SOURCE_DIR}/src/libsbml.py)
	createManual(python)
endif()

# create perl-api manuals
if (WITH_PERL)
	createManual(perl)
endif()

# create C#-api manuals
if (WITH_CSHARP)
	createManual(csharp)
endif()

# create java-api manuals
if (WITH_JAVA)
	# find java doc jar
	if (NOT EXISTS "${Java_JAVADOC_JAR}")
		get_filename_component(JDK_PATH ${Java_JAVA_EXECUTABLE} PATH )
		file(TO_NATIVE_PATH "${JDK_PATH}/../lib/tools.jar" Java_JAVADOC_JAR)
		if (NOT EXISTS "${Java_JAVADOC_JAR}")
			if (UNIX)
				if (APPLE)
					set(Java_JAVADOC_JAR "/System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK/Classes/classes.jar")
				else()
					set(Java_JAVADOC_JAR ${JAVA_INCLUDE_PATH}/../lib/tools.jar)
				endif()
			endif()
		endif()
	endif()
	set(Java_JAVADOC_JAR ${Java_JAVADOC_JAR} CACHE FILEPATH "Location of javadoc jar")

	if (NOT EXISTS "${Java_JAVADOC_JAR}")
		message(FATAL_ERROR "Cannot generate java documentation, please specify the Java_JAVADOC_JAR.")
	endif()

	set(LIBSBML_JAVA_DIR "${CMAKE_CURRENT_BINARY_DIR}/../src/bindings/java/java-files")
	set(LIBSBML_JAVADOC_DOCTITLE "${PACKAGE_NAME} ${PACKAGE_VERSION} Java API Reference")
	set(LIBSBML_JAVADOC_HEADER "<B>${PACKAGE_NAME}<BR>${PACKAGE_VERSION}</B>")
	set(LIBSBML_JAVADOC_WINDOWTITLE "LibSBML Java API")
	file(READ "${CMAKE_CURRENT_SOURCE_DIR}/src/libsbml-java-footer.html"  LIBSBML_JAVADOC_FOOTER)
	string(STRIP 	${LIBSBML_JAVADOC_FOOTER} LIBSBML_JAVADOC_FOOTER)
	string(REGEX REPLACE "\n" "" LIBSBML_JAVADOC_FOOTER "${LIBSBML_JAVADOC_FOOTER}")


	file(TO_NATIVE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/src/doxygen-config-perl.txt api_doc)
	file(TO_NATIVE_PATH ${CMAKE_CURRENT_BINARY_DIR} current_dir)
	file(TO_NATIVE_PATH ${LIBSBML_JAVA_DIR} java_dir)
	file(TO_NATIVE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/formatted/java-api output_dir)
	file(TO_NATIVE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/formatted/java-api/org/sbml/libsbml/ java_output_dir)
	file(TO_NATIVE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/src/common-graphics/* graphics_files)

	file(GLOB graphics_files ${CMAKE_CURRENT_SOURCE_DIR}/src/common-graphics/*.jpg)
	foreach(graphic ${graphics_files})
		file(COPY ${graphic} DESTINATION ${CMAKE_CURRENT_SOURCE_DIR}/formatted/java-api/org/sbml/libsbml/)
	endforeach()


	ADD_CUSTOM_COMMAND(
		OUTPUT ${CMAKE_CURRENT_SOURCE_DIR}/formatted/java-api/index.html
		COMMAND ${Java_JAVAC_EXECUTABLE}
		ARGS -nowarn
			 -cp "${Java_JAVADOC_JAR}"
			 ${CMAKE_CURRENT_SOURCE_DIR}/src/SBMLDoclet.java
			  -d "${current_dir}"
		COMMAND ${Java_JAVA_EXECUTABLE}
		ARGS  -cp "${Java_JAVADOC_JAR}${FILE_SEP}${current_dir}"
		      SBMLDoclet
			  -use -public -version -author -sourcetab 4 -keywords -nohelp
			  -link http://docs.oracle.com/javase/1.6.0/docs/api
			  -tag note:a:"Note:"
			  -tag warning:a:"Warning:"
			  -excludefile java-skip.txt
			  -header "${LIBSBML_JAVADOC_HEADER}"
			  -bottom "${LIBSBML_JAVADOC_FOOTER}"
			  -windowtitle ${LIBSBML_JAVADOC_WINDOWTITLE}
			  -doctitle ${LIBSBML_JAVADOC_DOCTITLE}
			  -overview libsbml-java-fake-overview.html
			  -stylesheetfile css/libsbml-javadoc-stylesheet.css
			  -d ${output_dir}
	          -sourcepath ${java_dir} org.sbml.libsbml
		COMMENT "Generate Java-API Documentation"
		VERBATIM
		WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/src

		COMMAND "${CMAKE_COMMAND}"
		ARGS -E copy
			"${logo_file}"
			"${output_dir}"

		COMMAND "${CMAKE_COMMAND}"
		ARGS -E copy
			"${sbml_js}"
			"${output_dir}"

#		COMMAND "${CMAKE_COMMAND}"
#		ARGS -E copy
#			"${tabs_css}"
#			"${output_dir}"

#		COMMAND "${CMAKE_COMMAND}"
#		ARGS -E copy
#			${logo_file}
#			${java_output_dir}
#
		COMMAND "${CMAKE_COMMAND}"
		ARGS -DPACKAGE_VERSION=\"${PACKAGE_VERSION}\"
			-Djava_manual=${CMAKE_CURRENT_SOURCE_DIR}/formatted/java-api
			-P ${CMAKE_CURRENT_SOURCE_DIR}/process-java-doc.cmake

		DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/CMakeLists.txt
				${CMAKE_CURRENT_SOURCE_DIR}/process-java-doc.cmake

		)

	add_custom_target(api_docs_java ALL DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/formatted/java-api/index.html)

	install(DIRECTORY ${output_dir} DESTINATION ${MISC_PREFIX}docs )

endif()


endif()
