#####################################################################
# The main component that will link all necessary modules and plugins
# into AusweisApp2 executable for the specific platform.
#
# This component includes a main entry point and command line
# parser only. Everything else will be included from sub-modules.
#####################################################################

ADD_SUBDIRECTORY(external)
ADD_SUBDIRECTORY(global)
ADD_SUBDIRECTORY(secure_storage)
ADD_SUBDIRECTORY(settings)

ADD_SUBDIRECTORY(file_provider)
ADD_SUBDIRECTORY(configuration)
ADD_SUBDIRECTORY(network)

ADD_SUBDIRECTORY(export)
ADD_SUBDIRECTORY(card)
ADD_SUBDIRECTORY(services)

ADD_SUBDIRECTORY(ui)
ADD_SUBDIRECTORY(activation)
ADD_SUBDIRECTORY(remote_device)
ADD_SUBDIRECTORY(core)
ADD_SUBDIRECTORY(init)

ADD_SUBDIRECTORY(whitelist_client)

FILE(GLOB TRANSLATION_FILES ${RESOURCES_DIR}/translations/*.ts)

FOREACH(filepath ${TRANSLATION_FILES})
	GET_FILENAME_COMPONENT(filename "${filepath}" NAME)
	STRING(REGEX MATCH "_(.*)\.ts$" _unused "${filename}")
	LIST(APPEND USED_TRANSLATIONS ${CMAKE_MATCH_1})
ENDFOREACH()

SET_PROPERTY(SOURCE ${TRANSLATION_FILES} PROPERTY OUTPUT_LOCATION ${CMAKE_CURRENT_BINARY_DIR}/translations)
FOREACH(locale ${USED_TRANSLATIONS})
	FILE(COPY ${QT_TRANSLATIONS_DIR} DESTINATION ${CMAKE_CURRENT_BINARY_DIR} FILES_MATCHING REGEX "qtbase_${locale}")
ENDFOREACH()

OPTION(UPDATE_TRANSLATIONS "Update translations/*.ts files (WARNING: make clean will delete the *.ts files!)")
IF(UPDATE_TRANSLATIONS)
	OPTION(UPDATE_TRANSLATIONS_NO_OBSOLETE "Remove obsolete translations from translations/*.ts files )")

	SET(LUPDATE_OPTIONS -extensions c,cpp,h,ui,m,mm,qml,js -no-ui-lines -locations none)
	IF(UPDATE_TRANSLATIONS_NO_OBSOLETE)
		QT5_CREATE_TRANSLATION(QM_FILES ${SRC_DIR} ${RESOURCES_DIR} ${TRANSLATION_FILES} OPTIONS ${LUPDATE_OPTIONS} -no-obsolete)
	ELSE()
		QT5_CREATE_TRANSLATION(QM_FILES ${SRC_DIR} ${RESOURCES_DIR} ${TRANSLATION_FILES} OPTIONS ${LUPDATE_OPTIONS})
	ENDIF()

	ADD_CUSTOM_TARGET(update.translations DEPENDS ${QM_FILES})
	MESSAGE(WARNING "'make clean' will delete *.ts files!")
ELSE()
	QT5_ADD_TRANSLATION(QM_FILES ${TRANSLATION_FILES})
ENDIF()

CONFIGURE_DEFAULT_FILES(${CMAKE_CURRENT_BINARY_DIR})


IF(IOS)
	SET(MACOSX_BUNDLE_BUNDLE_VERSION ${PROJECT_VERSION})
	SET(MACOSX_BUNDLE_SHORT_VERSION_STRING ${PROJECT_VERSION})
	SET(MACOSX_BUNDLE_LONG_VERSION_STRING ${PROJECT_VERSION})

	LIST(APPEND IOS_RESOURCES ${RESOURCES_DIR}/qml)
	LIST(APPEND IOS_RESOURCES ${RESOURCES_DIR}/packaging/ios/de.lproj)
	LIST(APPEND IOS_RESOURCES ${RESOURCES_DIR}/packaging/ios/launchscreen.storyboard)
	LIST(APPEND IOS_RESOURCES ${CMAKE_CURRENT_BINARY_DIR}/translations)
	LIST(APPEND IOS_RESOURCES ${CMAKE_CURRENT_BINARY_DIR}/config.json)

	# Attention: the file names correspond to values in the Info.plist
	IF(BUILD_PREVIEW)
		MESSAGE(FATAL_ERROR "iOS preview not implemented")
	ELSEIF(IS_DEVELOPER_VERSION)
		SET(IOS_APPICON_PATH "beta/")
	ELSE()
		SET(IOS_APPICON_PATH "")
	ENDIF()

	LIST(APPEND IOS_RESOURCES ${RESOURCES_DIR}/images/iOS/appIcons/${IOS_APPICON_PATH}Images.xcassets)

	LIST(APPEND IOS_RESOURCES ${RCC})
	SET_SOURCE_FILES_PROPERTIES(${RCC} PROPERTIES GENERATED TRUE)
ENDIF()

SET(MAIN_FILE main.cpp)
IF(ANDROID OR INTEGRATED_SDK)
	ADD_LIBRARY(AusweisApp SHARED ${MAIN_FILE} ${QM_FILES})
ELSEIF(IOS)
	ADD_EXECUTABLE(AusweisApp MACOSX_BUNDLE ${MAIN_FILE} ${IOS_RESOURCES} ${QM_FILES})
ELSE()
	ADD_EXECUTABLE(AusweisApp WIN32 ${MAIN_FILE} windows.rc ${QM_FILES})
ENDIF()

ADD_DEPENDENCIES(AusweisApp AusweisAppRcc)

TARGET_LINK_LIBRARIES(AusweisApp AusweisAppInit)
SET_TARGET_PROPERTIES(AusweisApp PROPERTIES OUTPUT_NAME "${PROJECT_NAME}")
SET_TARGET_PROPERTIES(AusweisApp PROPERTIES MACOSX_BUNDLE_BUNDLE_NAME ${PROJECT_NAME})
SET_TARGET_PROPERTIES(AusweisApp PROPERTIES MACOSX_BUNDLE_GUI_IDENTIFIER "${BUNDLE_IDENTIFIER}")
SET_TARGET_PROPERTIES(AusweisApp PROPERTIES MACOSX_BUNDLE_COPYRIGHT "${COPYRIGHT_TEXT}")



IF(IOS)
	TARGET_LINK_LIBRARIES(AusweisApp OpenSSL::SSL) # remove this if iOS uses shared libraries
	TARGET_LINK_LIBRARIES(AusweisApp -L${QT_HOST_PREFIX}/plugins/platforms)
	TARGET_LINK_LIBRARIES(AusweisApp -L${QT_HOST_PREFIX}/plugins/imageformats)
	TARGET_LINK_LIBRARIES(AusweisApp -L${QT_HOST_PREFIX}/lib)
	TARGET_LINK_LIBRARIES(AusweisApp -lQt5Network -lQt5Gui -lQt5Core -lQt5Bluetooth -lQt5Svg -lQt5Quick -lQt5Qml -lQt5QuickTemplates2 -lQt5QuickControls2)
	TARGET_LINK_LIBRARIES(AusweisApp -lqtpcre2 -lqtlibpng -lQt5GraphicsSupport -lQt5FontDatabaseSupport -lQt5ClipboardSupport -lqios -lqsvg -lqjpeg -lqtfreetype)

	TARGET_LINK_LIBRARIES(AusweisApp "-lc++ -lz -lm")
	TARGET_LINK_LIBRARIES(AusweisApp ${IOS_ASSETSLIBRARY} ${IOS_UIKIT} ${IOS_COREBLUETOOTH} ${IOS_COREFOUNDATION} ${IOS_OPENGLES} ${IOS_FOUNDATION} ${IOS_QUARTZCORE} ${IOS_CORETEXT} ${IOS_COREGRAPHICS} ${IOS_SECURITY} ${IOS_MOBILECORESERVICES} ${IOS_AUDIOTOOLBOX} ${IOS_IMAGEIO} ${IOS_CORENFC} ${IOS_MESSAGEUI} ${IOS_STOREKIT})

	TARGET_LINK_LIBRARIES(AusweisApp -Wl,-e,_qt_main_wrapper)

	# Do not delete the comments to avoid searching for the path/filename

	TARGET_LINK_LIBRARIES(AusweisApp -L${QT_HOST_PREFIX}/qml/QtQml/Models.2 -lmodelsplugin)
	TARGET_LINK_LIBRARIES(AusweisApp -L${QT_HOST_PREFIX}/qml/QtQml/StateMachine -lqtqmlstatemachine)
	TARGET_LINK_LIBRARIES(AusweisApp -L${QT_HOST_PREFIX}/qml/QtGraphicalEffects/private -lqtgraphicaleffectsprivate)
	TARGET_LINK_LIBRARIES(AusweisApp -L${QT_HOST_PREFIX}/qml/QtGraphicalEffects -lqtgraphicaleffectsplugin)

	TARGET_LINK_LIBRARIES(AusweisApp -L${QT_HOST_PREFIX}/qml/QtQuick/Controls.2 -lqtquickcontrols2plugin)
#	TARGET_LINK_LIBRARIES(AusweisApp -L${QT_HOST_PREFIX}/qml/QtQuick/Controls.2/Material -lqtquickcontrols2materialstyleplugin)
#	TARGET_LINK_LIBRARIES(AusweisApp -L${QT_HOST_PREFIX}/qml/QtQuick/Controls.2/Universal -lqtquickcontrols2universalstyleplugin)

	TARGET_LINK_LIBRARIES(AusweisApp -L${QT_HOST_PREFIX}/qml/QtQuick/Layouts -lqquicklayoutsplugin)
#	TARGET_LINK_LIBRARIES(AusweisApp -L${QT_HOST_PREFIX}/qml/QtQuick/LocalStorage -lqmllocalstorageplugin)
#	TARGET_LINK_LIBRARIES(AusweisApp -L${QT_HOST_PREFIX}/qml/QtQuick/Particles.2 -lparticlesplugin)
	TARGET_LINK_LIBRARIES(AusweisApp -L${QT_HOST_PREFIX}/qml/QtQuick/Templates.2 -lqtquicktemplates2plugin)
	TARGET_LINK_LIBRARIES(AusweisApp -L${QT_HOST_PREFIX}/qml/QtQuick/Window.2 -lwindowplugin)
	TARGET_LINK_LIBRARIES(AusweisApp -L${QT_HOST_PREFIX}/qml/QtQuick.2 -lqtquick2plugin)

	SET_TARGET_PROPERTIES(AusweisApp PROPERTIES RESOURCE "${IOS_RESOURCES}")
	SET_TARGET_PROPERTIES(AusweisApp PROPERTIES XCODE_ATTRIBUTE_INSTALL_PATH "$(LOCAL_APPS_DIR)")
	SET_TARGET_PROPERTIES(AusweisApp PROPERTIES XCODE_ATTRIBUTE_SKIP_INSTALL "NO")
	SET_TARGET_PROPERTIES(AusweisApp PROPERTIES XCODE_ATTRIBUTE_ASSETCATALOG_COMPILER_APPICON_NAME "AppIcon")
	SET_TARGET_PROPERTIES(AusweisApp PROPERTIES XCODE_ATTRIBUTE_TARGETED_DEVICE_FAMILY "1,2")
	SET_TARGET_PROPERTIES(AusweisApp PROPERTIES XCODE_ATTRIBUTE_CODE_SIGN_ENTITLEMENTS "${PACKAGING_DIR}/ios/AusweisApp2.entitlements")

	IF(USE_DISTRIBUTION_PROFILE)
		SET(PROVISIONING_PROFILE_SPECIFIER "iOS Release (Distribution)")
		SET(EXPORT_METHOD app-store)
		SET_TARGET_PROPERTIES(AusweisApp PROPERTIES XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "iPhone Distribution: Governikus GmbH & Co. KG (G7EQCJU4BR)")
	ELSE()
		SET(PROVISIONING_PROFILE_SPECIFIER "iOS Development")
		SET(EXPORT_METHOD development)
		SET_TARGET_PROPERTIES(AusweisApp PROPERTIES XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "iPhone Developer: Marco von der Puetten (46ZK7WV8QR)")
	ENDIF()
	SET_TARGET_PROPERTIES(AusweisApp PROPERTIES XCODE_ATTRIBUTE_PROVISIONING_PROFILE_SPECIFIER ${PROVISIONING_PROFILE_SPECIFIER})

	# prevent xcode to convert multiple png files to tiff
	SET_TARGET_PROPERTIES(AusweisApp PROPERTIES XCODE_ATTRIBUTE_COMBINE_HIDPI_IMAGES "NO")
	TARGET_LINK_LIBRARIES(AusweisApp AusweisAppActivationCustomScheme)

	CONFIGURE_FILE(${PACKAGING_DIR}/ios/exportOptions.plist.in ${CMAKE_BINARY_DIR}/exportOptions.plist @ONLY)
ENDIF()

IF(MAC)
	TARGET_LINK_LIBRARIES(AusweisApp ${OSX_APPKIT})

	SET(AUTOSTART_HELPER_NAME AutostartHelper)
	SET(FULL_HELPER_NAME ${PROJECT_NAME}${AUTOSTART_HELPER_NAME})
	SET(HELPER_SOURCES autostart_helper/main.mm)
	ADD_EXECUTABLE(${FULL_HELPER_NAME} MACOSX_BUNDLE ${HELPER_SOURCES})
	TARGET_LINK_LIBRARIES(${FULL_HELPER_NAME} ${OSX_APPKIT})
	CONFIGURE_FILE(${PACKAGING_DIR}/macos/autostart_helper/Info.plist.in ${CMAKE_CURRENT_BINARY_DIR}/AutostartHelperInfo.plist @ONLY)
	SET_TARGET_PROPERTIES(${FULL_HELPER_NAME} PROPERTIES MACOSX_BUNDLE_INFO_PLIST ${CMAKE_CURRENT_BINARY_DIR}/AutostartHelperInfo.plist)
ENDIF()

IF(ANDROID)
	TARGET_LINK_LIBRARIES(AusweisApp Qt5::AndroidExtras)
	TARGET_LINK_LIBRARIES(AusweisApp AusweisAppCardNfc)
	IF(NOT INTEGRATED_SDK)
		TARGET_LINK_LIBRARIES(AusweisApp AusweisAppActivationIntent)
	ENDIF()
ENDIF()

IF(IOS)
	TARGET_LINK_LIBRARIES(AusweisApp AusweisAppCardIos)
ENDIF()

IF((ANDROID AND NOT INTEGRATED_SDK) OR IOS)
	TARGET_LINK_LIBRARIES(AusweisApp AusweisAppCardBluetooth)
ELSEIF(LINUX)
	TARGET_LINK_LIBRARIES(AusweisApp debug AusweisAppCardBluetooth)
ENDIF()

IF(WIN32)
	TARGET_LINK_LIBRARIES(AusweisApp ${WIN_DEFAULT_LIBS})
ENDIF()

IF(TARGET Qt5::Qml)
	TARGET_LINK_LIBRARIES(AusweisApp AusweisAppUiQml)
ENDIF()

IF(ANDROID)
	TARGET_LINK_LIBRARIES(AusweisApp AusweisAppUiAidl)
ELSE()
	TARGET_LINK_LIBRARIES(AusweisApp debug AusweisAppUiAidl)
ENDIF()

IF(DESKTOP)
	TARGET_LINK_LIBRARIES(AusweisApp AusweisAppCardPcsc AusweisAppCardDrivers AusweisAppActivationWebservice)
	IF(NOT INTEGRATED_SDK)
		TARGET_LINK_LIBRARIES(AusweisApp AusweisAppUiWidget)
	ENDIF()
ENDIF()

IF(NOT ANDROID AND NOT IOS AND NOT INTEGRATED_SDK)
	TARGET_LINK_LIBRARIES(AusweisApp AusweisAppUiWebsocket)
ENDIF()


INCLUDE(Install)
INCLUDE(FeatureSummary)
FEATURE_SUMMARY(WHAT ALL)
