#-----------------------------------------------------------------------------
#
# 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()

configure_file(PdQmlWidgets2.h.in "${CMAKE_CURRENT_BINARY_DIR}/PdQmlWidgets2/PdQmlWidgets2.h")

add_library(${PROJECT_NAME}
    PdQmlWidgets2/LiveSvg.h
    PdQmlWidgets2/ScalarVariant.h
    PdQmlWidgets2/VectorVariant.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}>"
    "$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_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}")
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/PdQmlWidgets2/PdQmlWidgets2.h"
    DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME}"
)

# 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::
)

## bake in git commit hash


if (VERSION_HASH)
    # Hash was given as option, so write it directly
    # useful for OBS packaging
    file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/git_revision_hash.h"
        "#define GIT_REV \"${VERSION_HASH}\"
")
else()
    # recompute hash on every `make` invocation
    # Note: CMake variable definitions (-D) must be before the -P option!
    add_custom_target(GitRevision
        BYPRODUCTS "${CMAKE_CURRENT_BINARY_DIR}/git_revision_hash.h"
        COMMAND ${CMAKE_COMMAND}
            -DSOURCE_DIR="${CMAKE_CURRENT_SOURCE_DIR}"
            -DHASH_MACRO_NAME="GIT_REV"
            -DTARGET_FILE="${CMAKE_CURRENT_BINARY_DIR}/git_revision_hash.h"
            -P ${CMAKE_CURRENT_SOURCE_DIR}/git_revision.cmake
    )
    add_dependencies(${PROJECT_NAME} GitRevision)
endif()


## 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()

configure_file(Doxyfile.in "${CMAKE_CURRENT_SOURCE_DIR}/Doxyfile" @ONLY)
