# project(libSBML)
## Where will SBML be installed
SET(LIBSBML_BINARY_DIR ${CMAKE_BINARY_DIR}/3rdparty )
make_directory( ${LIBSBML_BINARY_DIR}/lib )
make_directory( ${LIBSBML_BINARY_DIR}/include )
## Base dir for download, inflate and build
SET(LIBSBML_BASE_DIR ${CMAKE_CURRENT_BINARY_DIR})
## Build directory
SET(LIBSBML_BUILD_DIR ${LIBSBML_BASE_DIR}/build)

SET(LIBSBML_STATIC TRUE)
#SET(CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_STATIC_LIBRARY_SUFFIX} )
# Prefind all required libraries for dependency propagation
find_package(LibXml2 REQUIRED)
find_package(ZLIB REQUIRED)
find_package(BZip2 QUIET)

SET(sbml_cmake_args 
	-DLIBSBML_SKIP_SHARED_LIBRARY=TRUE 
	-DWITH_JAVA=FALSE 
	-DWITH_PYTHON=OFF 
	-DWITH_SWIG=OFF 
	-DWITH_LIBXML=TRUE 
	-DENABLE_COMP=TRUE 
	-DCMAKE_INSTALL_PREFIX=${LIBSBML_BINARY_DIR}
	-DWITH_CPP_NAMESPACE=TRUE 
	-DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}
	-DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}
	-D "CMAKE_CXX_FLAGS=-fpermissive -std=c++17"
	-G "${CMAKE_GENERATOR}")
	
SET(sbml_cache_args 
	-DLIBXML_LIBRARY:STRING=${LIBXML2_LIBRARIES} 
	-DLIBXML_INCLUDE_DIR:STRING=${LIBXML2_INCLUDE_DIR} 
	-DLIBZ_LIBRARY:STRING=${ZLIB_LIBRARY}
	-DLIBZ_INCLUDE_DIR:STRING=${ZLIB_INCLUDE_DIR})
	
IF (APPLE) 
	LIST(APPEND sbml_cache_args -DCMAKE_OSX_DEPLOYMENT_TARGET:STRING=${CMAKE_OSX_DEPLOYMENT_TARGET})
ENDIF(APPLE)


IF(${BZIP2_FOUND})
	LIST(APPEND sbml_cmake_args -DWITH_BZIP2=TRUE)
	if (NOT BZIP2_INCLUDE_DIRS)
		SET(BZIP2_INCLUDE_DIRS "/usr/include")
	endif()
	LIST(APPEND sbml_cache_args -DLIBBZ_INCLUDE_DIR:STRING=${BZIP2_INCLUDE_DIRS} -DLIBBZ_LIBRARY:STRING=${BZIP2_LIBRARIES})
ELSE()
	LIST(APPEND sbml_cmake_args -DWITH_BZIP2=FALSE)
ENDIF()

MESSAGE(STATUS "LibSBML cache configuratiqon ${sbml_cache_args}") 
MESSAGE(STATUS "LibSBML cmake configuration ${sbml_cmake_args}")

## Predict where the static library will finally reside
include(GNUInstallDirs)
SET(LIBSBML_LIB_PATH ${LIBSBML_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR})

SET(LIBSBML_STATIC_LIBRARY 
    ${LIBSBML_LIB_PATH}/${CMAKE_STATIC_LIBRARY_PREFIX}sbml-static${CMAKE_STATIC_LIBRARY_SUFFIX} )

include(ExternalProject)
if (WIN32)
ExternalProject_Add( libSBML
  # URL "https://imc.zih.tu-dresden.de/morpheus/packages/source/libSBML-5.20.2-src.tar.gz"
  GIT_REPOSITORY "https://github.com/sbmlteam/libsbml.git"
  GIT_TAG "v5.20.2"
  GIT_SHALLOW TRUE
  GIT_PROGRESS TRUE
  DOWNLOAD_DIR "${LIBSBML_BASE_DIR}/download"
  SOURCE_DIR "${LIBSBML_BASE_DIR}/src"
  BINARY_DIR "${LIBSBML_BASE_DIR}/build"
  TEST_COMMAND      ""
  #Configuration parameters
  CMAKE_ARGS ${sbml_cmake_args}
  #Import depenency definitions into project cache
  CMAKE_CACHE_ARGS ${sbml_cache_args}
  BUILD_BYPRODUCTS ${LIBSBML_STATIC_LIBRARY}
  INSTALL_COMMAND ${CMAKE_MAKE_PROGRAM} install
  #  EXCLUDE_FROM_ALL TRUE
)
else()
ExternalProject_Add( libSBML
  # URL "https://imc.zih.tu-dresden.de/morpheus/packages/source/libSBML-5.20.2-src.tar.gz"
  GIT_REPOSITORY "https://github.com/sbmlteam/libsbml.git"
  GIT_TAG "v5.20.2"
  GIT_SHALLOW TRUE
  GIT_PROGRESS TRUE
  DOWNLOAD_DIR "${LIBSBML_BASE_DIR}/download"
  SOURCE_DIR "${LIBSBML_BASE_DIR}/src"
  BINARY_DIR "${LIBSBML_BASE_DIR}/build"
  TEST_COMMAND      ""
  #Configuration parameters
  CMAKE_ARGS ${sbml_cmake_args}
  #Import depenency definitions into project cache
  CMAKE_CACHE_ARGS ${sbml_cache_args}
  BUILD_BYPRODUCTS ${LIBSBML_STATIC_LIBRARY}
  INSTALL_COMMAND DESTDIR= ${CMAKE_MAKE_PROGRAM} install
  #  EXCLUDE_FROM_ALL TRUE
)
endif()

    
SET(LIBSBML_STATIC_DEPENDENCY_LIBRARIES ${LIBXML2_LIBRARIES} ${ZLIB_LIBRARY})
IF(BZIP2_FOUND)
    LIST(APPEND LIBSBML_STATIC_DEPENDENCY_LIBRARIES ${BZIP2_LIBRARIES})
ENDIF()

IF (WIN32)
	set(STD_LIB_SUFFIX ${CMAKE_FIND_LIBRARY_SUFFIXES})
	set(CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_STATIC_LIBRARY_SUFFIX})
	find_library(LIBICONV_LIBRARY iconv)
	find_library(LIBCHARSET_LIBRARY charset charset-static)
	FIND_PACKAGE(LibLZMA REQUIRED)
	set(CMAKE_FIND_LIBRARY_SUFFIXES ${STD_LIB_SUFFIX})
	LIST(APPEND LIBSBML_STATIC_DEPENDENCY_LIBRARIES ${LIBICONV_LIBRARY} ${LIBCHARSET_LIBRARY} ${LIBLZMA_LIBRARIES})
ENDIF()

IF( LIBSBML_STATIC ) 
	# the best way would be to create a libSBMLConfig.cmake script that can be used by FindPackage()
	# here we create a GLOBAL target 
	SET(LIBSBML_LIBRARY ${LIBSBML_STATIC_LIBRARY} CACHE STRING "libSBML library" FORCE)
	SET(LIBSBML_INCLUDE_DIR "${LIBSBML_BINARY_DIR}/include" CACHE PATH "libSBML include directory" FORCE)
    
	ADD_LIBRARY(SBML::SBML STATIC IMPORTED GLOBAL)
	## Let SBML::SBML depend on the custom target building SBML
	## No dependency tracking wrt the sources in place, thus always assumed outdated
	add_dependencies(SBML::SBML libSBML)
	set_target_properties(SBML::SBML PROPERTIES 
		IMPORTED_LOCATION ${LIBSBML_STATIC_LIBRARY}
		INTERFACE_INCLUDE_DIRECTORIES "${LIBSBML_BINARY_DIR}/include"
		INTERFACE_COMPILE_DEFINITIONS "LIBSBML_STATIC;HAVE_SBML=1"
		INTERFACE_LINK_LIBRARIES "${LIBSBML_STATIC_DEPENDENCY_LIBRARIES}"
		)
	message(STATUS "Imported SBML target from ${LIBSBML_STATIC_LIBRARY}")
    SET(LIBSBML_FOUND TRUE PARENT_SCOPE)
ENDIF()

