# SPDX-License-Identifier: BSD-3-Clause
# SPDX-FileCopyrightText: Copyright (c) 2018, Kenneth Troldal Balslev
#
#    ____                               ____      ___ ____       ____  ____      ___
#   6MMMMb                              `MM(      )M' `MM'      6MMMMb\`MM(      )M'
#  8P    Y8                              `MM.     d'   MM      6M'    ` `MM.     d'
# 6M      Mb __ ____     ____  ___  __    `MM.   d'    MM      MM        `MM.   d'
# MM      MM `M6MMMMb   6MMMMb `MM 6MMb    `MM. d'     MM      YM.        `MM. d'
# MM      MM  MM'  `Mb 6M'  `Mb MMM9 `Mb    `MMd       MM       YMMMMb     `MMd
# MM      MM  MM    MM MM    MM MM'   MM     dMM.      MM           `Mb     dMM.
# MM      MM  MM    MM MMMMMMMM MM    MM    d'`MM.     MM            MM    d'`MM.
# YM      M9  MM    MM MM       MM    MM   d'  `MM.    MM            MM   d'  `MM.
#  8b    d8   MM.  ,M9 YM    d9 MM    MM  d'    `MM.   MM    / L    ,M9  d'    `MM.
#   YMMMM9    MMYMMM9   YMMMM9 _MM_  _MM_M(_    _)MM_ _MMMMMMM MYMMMM9 _M(_    _)MM_
#             MM
#             MM
#            _MM_
#
#   Copyright (c) 2018, Kenneth Troldal Balslev
#
#   All rights reserved.
#
#   Redistribution and use in source and binary forms, with or without
#   modification, are permitted provided that the following conditions are met:
#   - Redistributions of source code must retain the above copyright
#     notice, this list of conditions and the following disclaimer.
#   - Redistributions in binary form must reproduce the above copyright
#     notice, this list of conditions and the following disclaimer in the
#     documentation and/or other materials provided with the distribution.
#   - Neither the name of the author nor the
#     names of any contributors may be used to endorse or promote products
#     derived from this software without specific prior written permission.
#
#   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
#   ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
#   WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
#   DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
#   DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
#   (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
#   LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
#   ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
#   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
#   SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#
#

#=======================================================================================================================
# Preamble
#=======================================================================================================================
cmake_minimum_required(VERSION 3.15 FATAL_ERROR)
project(OpenXLSX.Examples)
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")


#=======================================================================================================================
# Build Rules for example program executables
#=======================================================================================================================
if(OPENXLSX_BUILD_SAMPLES)
    #=======================================================================================================================
    # Define Demo1 target
    #=======================================================================================================================
    add_executable(Demo1 Demo1.cpp)
    # NOTE: Linking against OpenXLSX-bundled does not yet work
    # if(${OPENXLSX_BUNDLED_STATIC_LIB})
    #     # target_include_directories(Demo1
    #     #             PUBLIC
    #     #             $<BUILD_INTERFACE:${CMAKE_SOURCE_DIR}/OpenXLSX>
    #     #             $<BUILD_INTERFACE:${CMAKE_SOURCE_DIR}/OpenXLSX/headers>
    #     #             # ${Boost_INCLUDE_DIR}    # just in case
    #     #             # ${NOWIDE_INCLUDE_DIR}   # includes {Boost_INCLUDE_DIR}/boost
    #     #             $<BUILD_INTERFACE:${CMAKE_BINARY_DIR}/OpenXLSX>)     # For export header
    #     target_link_libraries(Demo1 PRIVATE OpenXLSX-bundled)
    # else()
        target_link_libraries(Demo1 PRIVATE OpenXLSX::OpenXLSX)
    # endif()


    #=======================================================================================================================
    # Define Demo1A target
    #=======================================================================================================================
    if(${OPENXLSX_ENABLE_LIBZIP_EXAMPLE})
        find_package(LIBZIP MODULE REQUIRED)
        add_executable(Demo1A Demo1A.cpp)
        target_link_libraries(Demo1A PRIVATE OpenXLSX::OpenXLSX libzip::zip)
        if (${OPENXLSX_ENABLE_NOWIDE})
            target_compile_definitions(Demo1A PRIVATE ENABLE_NOWIDE)
            target_include_directories(Demo1A PRIVATE ${EXAMPLES_NOWIDE_INCLUDE})
            target_link_libraries(Demo1A PRIVATE ${NOWIDE_ALIAS})
        endif()
    endif()

    #=======================================================================================================================
    # Define Demo2 target
    #=======================================================================================================================
    add_executable(Demo2 Demo2.cpp)
    target_link_libraries(Demo2 PRIVATE OpenXLSX::OpenXLSX)

    #=======================================================================================================================
    # Define Demo3 target
    #=======================================================================================================================
    add_executable(Demo3 Demo3.cpp)
    target_link_libraries(Demo3 PRIVATE OpenXLSX::OpenXLSX)

    #=======================================================================================================================
    # Define Demo4 target
    #=======================================================================================================================
    add_executable(Demo4 Demo4.cpp)
    target_link_libraries(Demo4 PRIVATE OpenXLSX::OpenXLSX)
    if (${OPENXLSX_ENABLE_NOWIDE})
        target_compile_definitions(Demo4 PRIVATE ENABLE_NOWIDE)
        target_include_directories(Demo4 PRIVATE ${EXAMPLES_NOWIDE_INCLUDE})
        target_link_libraries(Demo4 PRIVATE ${NOWIDE_ALIAS})
    endif()

    #=======================================================================================================================
    # Define Demo9 target
    #=======================================================================================================================
    add_executable(Demo5 Demo5.cpp)
    target_link_libraries(Demo5 PRIVATE OpenXLSX::OpenXLSX)

    #=======================================================================================================================
    # Define Demo6 target
    #=======================================================================================================================
    add_executable(Demo6 Demo6.cpp)
    target_link_libraries(Demo6 PRIVATE OpenXLSX::OpenXLSX)

    #=======================================================================================================================
    # Define Demo7 target
    #=======================================================================================================================
    add_executable(Demo7 Demo7.cpp)
    target_link_libraries(Demo7 PRIVATE OpenXLSX::OpenXLSX)

    #=======================================================================================================================
    # Define Demo8 target
    #=======================================================================================================================
    add_executable(Demo8 Demo8.cpp)
    target_link_libraries(Demo8 PRIVATE OpenXLSX::OpenXLSX)

    #=======================================================================================================================
    # Define Demo9 target
    #=======================================================================================================================
    add_executable(Demo9 Demo9.cpp)
    target_link_libraries(Demo9 PRIVATE OpenXLSX::OpenXLSX)
    if (${OPENXLSX_ENABLE_NOWIDE})
        target_compile_definitions(Demo9 PRIVATE ENABLE_NOWIDE)
        target_link_libraries(Demo9 PRIVATE ${NOWIDE_ALIAS})
    endif()

    #=======================================================================================================================
    # Define Demo10 target
    #=======================================================================================================================
    add_executable(Demo10 Demo10.cpp)
    target_link_libraries(Demo10 PRIVATE OpenXLSX::OpenXLSX)
endif()


#=======================================================================================================================
# Installation Rules for example program sources
#=======================================================================================================================
if(OPENXLSX_INSTALL_SAMPLE_SOURCES)
    # install cmake configuration for examples
    install(
        FILES "${CMAKE_CURRENT_SOURCE_DIR}/templates/CMakeLists.txt.examples"
        DESTINATION share/doc/OpenXLSX/examples
        RENAME CMakeLists.txt
    )

    # For gnu make, determine whether pkg-config --static flag is needed based on BUILD_SHARED_LIBS
    if(BUILD_SHARED_LIBS)
        set(PKG_CONFIG_STATIC_FLAG "")
    else()
        set(PKG_CONFIG_STATIC_FLAG "--static")
    endif()

    # Process the gnu Makefile template
    configure_file(
        "${CMAKE_CURRENT_SOURCE_DIR}/templates/Makefile.examples.in"
        "${CMAKE_CURRENT_BINARY_DIR}/Makefile.examples"
        @ONLY
    )
    # install gnu make configuration for examples
    install(
        # FILES "${CMAKE_CURRENT_SOURCE_DIR}/templates/Makefile.examples"
        FILES "${CMAKE_CURRENT_BINARY_DIR}/Makefile.examples"
        DESTINATION share/doc/OpenXLSX/examples
        RENAME Makefile
    )

    # install all the example source files
    install(
        FILES Demo1.cpp Demo1A.cpp Demo2.cpp Demo3.cpp Demo4.cpp Demo5.cpp Demo6.cpp Demo7.cpp Demo8.cpp Demo9.cpp Demo10.cpp
        DESTINATION share/doc/OpenXLSX/examples
    )

    # install Demo1A additional files
    install(
        FILES ${CMAKE_CURRENT_SOURCE_DIR}/cmake/FindLIBZIP.cmake
        DESTINATION share/doc/OpenXLSX/examples/cmake
    )
    install(
        FILES ${CMAKE_CURRENT_SOURCE_DIR}/external/CustomZip/CustomZip.hpp
        DESTINATION share/doc/OpenXLSX/examples/external/CustomZip
    )
endif()
