SET(AGUILA_BUILD 1)
SET(PCRTREE2_BUILD 1)

if(NOT WIN32)
    # Due to removal of XSD dependency files need to be regenerated
    # Just check on Unices if the source file changed,
    file(SHA1 ${CMAKE_CURRENT_SOURCE_DIR}/unitTest.xsd unitTestSha)
    file(SHA1 ${CMAKE_CURRENT_SOURCE_DIR}/../xmlschema/Aguila.xsd AguilaSha)
    file(SHA1 ${CMAKE_CURRENT_SOURCE_DIR}/../xmlschema/commonTypes.xsd commonTypesSha)
    file(SHA1 ${CMAKE_CURRENT_SOURCE_DIR}/../xmlschema/PCRaster.xsd PCRasterSha)

    if(    (NOT ${unitTestSha} STREQUAL "04e8b685fcf34373a25ee3c40d49abc9ac3769dd")
        OR (NOT ${AguilaSha} STREQUAL "e200b1d5ad6f3481ce7d479f4ff44cfe0228340e")
        OR (NOT ${commonTypesSha} STREQUAL "912d3bd97dc04a904e395e6cf50b8a3cb4b1f56c")
        OR (NOT ${PCRasterSha} STREQUAL "49ceaca15c7cabc54108e485c5ba6264319c48e3")
      )
          message(FATAL_ERROR "One of the files generated by XSD is older than its dependency. Update the generated files first; or contact the PCRaster Research and Development team in case you don't know how to proceed.")
    endif()
endif()

set(_FILES_TO_COPY
  commonTypesXSD.cc
  commonTypesXSD.h
  unitTestXSD.cc
  unitTestXSD.h
  AguilaXSD.cc
  AguilaXSD.h
  compiled_Aguila.h
  compiled_PCRaster.h
  PCRasterXSD.cc
  PCRasterXSD.h
)

foreach(FILENAME IN LISTS _FILES_TO_COPY)
    configure_file(generated/${FILENAME}
        ${CMAKE_CURRENT_BINARY_DIR}/${FILENAME}
        COPYONLY
    )
endforeach()

configure_file(${CMAKE_CURRENT_SOURCE_DIR}/../xmlschema/Aguila.xsd
    ${CMAKE_CURRENT_BINARY_DIR}/Aguila.xsd
    COPYONLY
)

configure_file(${CMAKE_CURRENT_SOURCE_DIR}/../xmlschema/PCRaster.xsd
    ${CMAKE_CURRENT_BINARY_DIR}/PCRaster.xsd
    COPYONLY
)

# ------------------------------------------------------------------------------

MACRO(TEXT_TO_CHARACTER_ARRAY TEXT_FILE IDENTIFIER)
    ADD_CUSTOM_COMMAND(
        OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${IDENTIFIER}.h
        WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
        DEPENDS ${TEXT_FILE}
        COMMENT Generating ${IDENTIFIER}.h
        COMMAND ${Python3_EXECUTABLE}
            ${CMAKE_CURRENT_SOURCE_DIR}/text2CharArray.py ${TEXT_FILE}
            ${IDENTIFIER}
    )
ENDMACRO(TEXT_TO_CHARACTER_ARRAY)

SET(XSD_SRC_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../xmlschema)
SET(XSD_EPILOGUE ${CMAKE_CURRENT_SOURCE_DIR}/xsdEpilogue.txt)
SET(XSD_OPTIONS cxx-tree
    --std c++11
    --generate-serialization
    --generate-ostream
    --hxx-suffix XSD.h
    --cxx-suffix XSD.cc
)

# ------------------------------------------------------------------------------

SET(SOURCES
    pcrxsd_dominput.cc
    pcrxsd_StringDomInput.cc
    pcrxsd_library.cc
    pcrxsd_supportedschema.cc
    pcrxsd_utils.cc
    ${CMAKE_CURRENT_BINARY_DIR}/compiled_commonTypes.h
    ${CMAKE_CURRENT_BINARY_DIR}/commonTypesXSD.cc
)
SET(_SUPPORTED_SCHEMAS
    ${CMAKE_CURRENT_BINARY_DIR}/compiled_commonTypes.h
)
TEXT_TO_CHARACTER_ARRAY(
    ${XSD_SRC_DIR}/commonTypes.xsd
    compiled_commonTypes
)

# OLS: this is still required in case we need to regenerate files
# ADD_CUSTOM_COMMAND(
#     OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/commonTypesXSD.cc
#     DEPENDS ${XSD_SRC_DIR}/commonTypes.xsd ${XSD_EPILOGUE}
#     WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
#     COMMENT Generating ${CMAKE_CURRENT_BINARY_DIR}/commonTypesXSD.cc
#     COMMAND ${XSD_EXECUTABLE} ${XSD_OPTIONS}
#         --hxx-epilogue "#include \"commonTypesUtilEpilogue.h\""
#         --cxx-epilogue "#include \"commonTypesUtilEpilogueImpl.h\""
#         ${XSD_SRC_DIR}/commonTypes.xsd
#     VERBATIM
# )
# OLS

IF(AGUILA_BUILD)
    SET(SOURCES
        ${SOURCES}
        ${CMAKE_CURRENT_BINARY_DIR}/compiled_Aguila.h
        ${CMAKE_CURRENT_BINARY_DIR}/AguilaXSD.cc
    )
    SET(_SUPPORTED_SCHEMAS
        ${_SUPPORTED_SCHEMAS}
        ${CMAKE_CURRENT_BINARY_DIR}/compiled_Aguila.h
    )
    SET(_COMPILE_FLAGS "${_COMPILE_FLAGS} -DAGUILA_BUILD")
    SET(AGUILA_RES
        --root-element aguila --root-element aguilaCursor
        --root-element aguilaCursorValues)

    set(_AGUILA_XSD ${XSD_SRC_DIR}/Aguila.xsd)


# OLS: this is still required in case we need to regenerate files
#     ADD_CUSTOM_COMMAND(
#         OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/AguilaXSD.cc
#         DEPENDS ${_AGUILA_XSD} ${XSD_EPILOGUE}
#         WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
#         COMMENT Generating ${CMAKE_CURRENT_BINARY_DIR}/AguilaXSD.cc
#         COMMAND ${CMAKE_COMMAND} -E copy ${_AGUILA_XSD} ${CMAKE_CURRENT_BINARY_DIR}
#         COMMAND ${CMAKE_COMMAND} -E copy ${XSD_SRC_DIR}/commonTypes.xsd
#             ${CMAKE_CURRENT_BINARY_DIR}
#         COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/xsdEpilogue.txt
#             ${CMAKE_CURRENT_BINARY_DIR}
#         COMMAND ${XSD_EXECUTABLE} ${XSD_OPTIONS} ${AGUILA_RES}
#             --hxx-epilogue-file xsdEpilogue.txt Aguila.xsd
#     )
# OLS

    TEXT_TO_CHARACTER_ARRAY(
        ${_AGUILA_XSD}
        compiled_Aguila
    )
ENDIF()

IF(PCRTREE2_BUILD)
    SET(SOURCES
        ${SOURCES}
        ${CMAKE_CURRENT_BINARY_DIR}/compiled_PCRaster.h
        ${CMAKE_CURRENT_BINARY_DIR}/PCRasterXSD.cc
    )
    SET(_SUPPORTED_SCHEMAS
        ${_SUPPORTED_SCHEMAS}
        ${CMAKE_CURRENT_BINARY_DIR}/compiled_PCRaster.h
    )
    SET(_COMPILE_FLAGS "${_COMPILE_FLAGS} -DPCRTREE2_BUILD")
    set(_PCRASTER_XSD ${XSD_SRC_DIR}/PCRaster.xsd)

# OLS: this is still required in case we need to regenerate files
#     ADD_CUSTOM_COMMAND(
#         OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/PCRasterXSD.cc
#         DEPENDS ${_PCRASTER_XSD} ${XSD_EPILOGUE}
#         WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
#         COMMENT Generating ${CMAKE_CURRENT_BINARY_DIR}/PCRasterXSD.cc
#         COMMAND ${CMAKE_COMMAND} -E copy ${_PCRASTER_XSD} ${CMAKE_CURRENT_BINARY_DIR}
#         COMMAND ${CMAKE_COMMAND} -E copy ${XSD_SRC_DIR}/commonTypes.xsd
#             ${CMAKE_CURRENT_BINARY_DIR}
#         COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/xsdEpilogue.txt
#             ${CMAKE_CURRENT_BINARY_DIR}
#         COMMAND ${XSD_EXECUTABLE} ${XSD_OPTIONS} --root-element-all
#             --cxx-suffix XSD.cc --hxx-epilogue-file xsdEpilogue.txt PCRaster.xsd
#     )
# OLS

    TEXT_TO_CHARACTER_ARRAY(
        ${_PCRASTER_XSD}
        compiled_PCRaster
    )
ENDIF()

SET_SOURCE_FILES_PROPERTIES(pcrxsd_supportedschema.cc
    PROPERTIES
    OBJECT_DEPENDS "${_SUPPORTED_SCHEMAS}"
    COMPILE_FLAGS "${_COMPILE_FLAGS}"
)

ADD_LIBRARY(pcraster_xsd STATIC
    ${SOURCES}
)

if(CMAKE_CXX_COMPILER_ID MATCHES "Clang")
  target_compile_definitions(pcraster_xsd
    INTERFACE XSD_CXX11 XSD_CXX11_NULLPTR XSD_CXX11_TEMPLATE_ALIAS
    PUBLIC XSD_CXX11 XSD_CXX11_NULLPTR XSD_CXX11_TEMPLATE_ALIAS
  )
endif()

add_library(pcraster::xsd ALIAS pcraster_xsd)

target_include_directories(pcraster_xsd
    PUBLIC
        $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}>
        $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
        $<BUILD_INTERFACE:${CMAKE_BINARY_DIR}/_deps/xsd-src/libxsd>
)

target_include_directories(pcraster_xsd SYSTEM
    PRIVATE
        Boost::headers
)

target_link_libraries(pcraster_xsd
    PUBLIC
        pcraster::utils
        XercesC::XercesC
)

# ------------------------------------------------------------------------------
IF(PCRTREE2_BUILD)
    if(PCRASTER_BUILD_TEST)
        # TODO allmost all test depend on PCRasterXSD they have to
        # be rewritten...................

# OLS: this is still required in case we need to regenerate files
#         ADD_CUSTOM_COMMAND(
#           OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/unitTestXSD.cc
#           DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/unitTest.xsd ${XSD_EPILOGUE}
#           WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
#           COMMAND ${XSD_EXECUTABLE} ${XSD_OPTIONS}
#               ${CMAKE_CURRENT_SOURCE_DIR}/unitTest.xsd
#         )
# OLS
        add_unit_tests(
            SCOPE pcraster_xsd
            NAMES
                pcrxsd_commontypestest.cc
                pcrxsd_dominputtest.cc
                pcrxsd_DomAlgorithmTest.cc
                pcrxsd_utilstest.cc
                pcrxsd_xsdtest.cc
            SUPPORT_NAMES
                ${CMAKE_CURRENT_BINARY_DIR}/unitTestXSD.cc
            LINK_LIBRARIES
                pcraster::xsd
            DEPENDENCIES
                pcraster_xsd_test_run_epilog
        )
        add_custom_target(pcraster_xsd_test_run_epilog
            COMMAND ${CMAKE_COMMAND} -E copy_directory
                ${CMAKE_CURRENT_SOURCE_DIR}/testdata
                ${CMAKE_CURRENT_BINARY_DIR}
            COMMAND ${CMAKE_COMMAND} -E copy
                ${CMAKE_CURRENT_SOURCE_DIR}/unitTest.xsd
                ${CMAKE_CURRENT_BINARY_DIR}
            COMMAND ${CMAKE_COMMAND} -E copy
                ${CMAKE_CURRENT_SOURCE_DIR}/../xmlschema/commonTypes.xsd
                ${CMAKE_CURRENT_BINARY_DIR}
        )
    endif()
ENDIF()
