#-----------------------------------------------------------------------------
#
# Copyright (C) 2022 Bjarne von Horn <vh@igh.de>
#
# This file is part of the PdQmlWidgets library.
#
# The PdQmlWidgets 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, either version 3 of the License,
# or (at your option) any later version.
#
# The PdQmlWidgets library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser
# General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public License
# along with the PdQmlWidgets Library. If not, see
# <http://www.gnu.org/licenses/>.
#
#-----------------------------------------------------------------------------

cmake_minimum_required(VERSION 3.10)

project(PdQmlWidgets2 VERSION 2.0.0)

include(CMakePackageConfigHelpers)
include(GNUInstallDirs)

option(BUILD_SHARED_LIBS "Build using shared libraries" ON)
option(BUILD_EXAMPLE "Build and install example" OFF)

set(PUBLIC_QT_COMPONENTS Core Quick)

set(PRIVATE_QT_COMPONENTS Qml Svg Xml)
find_package(QtPdCom1 REQUIRED)
find_package(Qt5 REQUIRED
    COMPONENTS ${PUBLIC_QT_COMPONENTS} ${PRIVATE_QT_COMPONENTS}
)

find_package(Qt5
    OPTIONAL_COMPONENTS QuickCompiler
)

set(QRC_FILES
    qml/de/igh/pd/de_igh_pdQmlWidgets.qrc
)

set(USED_QTQUICK_COMPILER 0)

# compile qml files if possible, else add them to rc file as they are.
if(COMMAND qtquick_compiler_add_resources)
    qtquick_compiler_add_resources(RCC_SOURCES ${QRC_FILES})
    set(USED_QTQUICK_COMPILER 1)
else()
    qt5_add_resources(RCC_SOURCES ${QRC_FILES})
endif()

add_library(${PROJECT_NAME}
    PdQmlWidgets2/LiveSvg.h
    PdQmlWidgets2/ScalarVariant.h
    PdQmlWidgets2/VectorVariant.h
    PdQmlWidgets2/PdQmlWidgets2.h

    src/LiveSvg.cpp
    src/PdQmlWidgets2.cpp
    src/ScalarVariant.cpp
    src/VectorVariant.cpp

    ${RCC_SOURCES}
)

target_include_directories(${PROJECT_NAME} PUBLIC
    "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>"
    "$<INSTALL_INTERFACE:include>"
)

target_link_libraries(${PROJECT_NAME}
    PUBLIC
        EtherLab::QtPdCom1
        Qt5::Core
        Qt5::Quick
    PRIVATE
        Qt5::Qml
        Qt5::Svg
        Qt5::Xml
)

if (USED_QTQUICK_COMPILER)
    # Q_INIT_RESOURCE needs to know the qrc name
    # which changes when QtQuick Compiler is used
    target_compile_definitions(${PROJECT_NAME} PRIVATE "USED_QTQUICK_COMPILER")
endif()

set_target_properties(${PROJECT_NAME} PROPERTIES
    AUTOMOC 1
    AUTORCC 1
    VISIBILITY_INLINES_HIDDEN 1
    CXX_VISIBILITY_PRESET "hidden"
    VERSION ${PROJECT_VERSION}
    SOVERSION 2
)

# and install it
install(TARGETS ${PROJECT_NAME}
    EXPORT ${PROJECT_NAME}Targets
    ARCHIVE DESTINATION       "${CMAKE_INSTALL_LIBDIR}"
    LIBRARY DESTINATION       "${CMAKE_INSTALL_LIBDIR}"
    RUNTIME DESTINATION       "${CMAKE_INSTALL_BINDIR}"
)

install(DIRECTORY ${PROJECT_NAME} DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}")

# and export it

set(ConfigPackageLocation "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}")
configure_package_config_file(Config.cmake.in
        "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}/${PROJECT_NAME}Config.cmake"
    INSTALL_DESTINATION ${ConfigPackageLocation}
)
write_basic_package_version_file(
        "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}/${PROJECT_NAME}ConfigVersion.cmake"
    COMPATIBILITY SameMajorVersion
)
install(FILES
        "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}/${PROJECT_NAME}Config.cmake"
        "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}/${PROJECT_NAME}ConfigVersion.cmake"
    DESTINATION ${ConfigPackageLocation}
)

install(EXPORT ${PROJECT_NAME}Targets
    NAMESPACE EtherLab::
    FILE ${PROJECT_NAME}Targets.cmake
    DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}
)

export(EXPORT ${PROJECT_NAME}Targets
    FILE "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}/${PROJECT_NAME}Targets.cmake"
    NAMESPACE EtherLab::
)

## Install qml files

add_subdirectory(qml/de/igh/pd)

## Build example (optionally)

if (BUILD_EXAMPLE)
    add_library(EtherLab::PdQmlWidgets2 ALIAS PdQmlWidgets2)
    add_subdirectory(qml_test)
endif()
