cmake_minimum_required(VERSION 3.0.0)
project(tfamanager VERSION 1.7.3 LANGUAGES C CXX)

# Automatically create moc files
set(CMAKE_AUTOMOC ON)

# Components PATH
execute_process(
    COMMAND dpkg-architecture -qDEB_HOST_MULTIARCH
    OUTPUT_VARIABLE ARCH_TRIPLET
    OUTPUT_STRIP_TRAILING_WHITESPACE
)

option(CLICK_MODE "Installs to a contained location" ON)

# Standard install paths
include(GNUInstallDirs)

set(APP_NAME             "2FA Manager")
set(APP_VERSION          "${PROJECT_VERSION}")
set(FULL_PROJECT_NAME    "tfamanager.cibersheep")
set(ICON_FILE            "logo.svg")
set(SPLASH_FILE          "splash.svg")

if(CLICK_MODE)
    set(CMAKE_INSTALL_PREFIX /)

    set(APP_HARDCODE     "tfamanager")
    set(QT_IMPORTS_DIR   "lib/${ARCH_TRIPLET}")
    set(DATA_DIR         ".")
    set(ICON             "${DATA_DIR}/assets/${ICON_FILE}")
    set(SPLASH           "${DATA_DIR}/assets/${SPLASH_FILE}")
    set(DESKTOP_DIR      "${DATA_DIR}")
    set(URLS_DIR         "${DATA_DIR}")
    set(CONTENTHUB_DIR   "${DATA_DIR}")
    set(LOCALE_DIR       "${DATA_DIR}/share/locale")
    set(EXEC             "qmlscene %U qml/Main.qml")

    install(FILES ${PROJECT_NAME}.apparmor
            DESTINATION ${DATA_DIR})
    install(FILES ${PROJECT_NAME}-dispatcher.json
            DESTINATION ${URLS_DIR})
    install(FILES ${PROJECT_NAME}-contenthub.json
            DESTINATION ${CONTENTHUB_DIR})

else(CLICK_MODE)
    set(APP_HARDCODE     "lomiri-tfamanager-app")
    set(QT_IMPORTS_DIR   "${CMAKE_INSTALL_FULL_LIBDIR}/qt5/qml")
    set(DATA_DIR         "${CMAKE_INSTALL_FULL_DATADIR}/${APP_HARDCODE}")
    set(ICON             "${DATA_DIR}/assets/${ICON_FILE}")
    set(SPLASH           "${DATA_DIR}/assets/${SPLASH_FILE}")
    set(DESKTOP_DIR      "${CMAKE_INSTALL_FULL_DATADIR}/applications")
    set(URLS_DIR         "${CMAKE_INSTALL_FULL_DATADIR}/lomiri-url-dispatcher/urls")
    set(CONTENTHUB_DIR   "${CMAKE_INSTALL_FULL_DATADIR}/lomiri-content-hub/peers/")
    set(LOCALE_DIR       "${CMAKE_INSTALL_FULL_LOCALEDIR}")
    set(EXEC             "qmlscene %U ${DATA_DIR}/qml/Main.qml")

#    install(FILES ${PROJECT_NAME}.apparmor
#            RENAME ${APP_HARDCODE}.apparmor
#            DESTINATION ${DATA_DIR})
    install(FILES ${PROJECT_NAME}-dispatcher.json
            RENAME ${APP_HARDCODE}
            DESTINATION ${URLS_DIR})
    install(FILES ${PROJECT_NAME}-contenthub.json
            RENAME ${APP_HARDCODE}
            DESTINATION ${CONTENTHUB_DIR})
endif(CLICK_MODE)

set(DESKTOP_FILE_NAME_IN "${PROJECT_NAME}.desktop")
set(DESKTOP_FILE_NAME    "${APP_HARDCODE}.desktop")

# This command figures out the minimum SDK framework for use in the manifest
# file via the environment variable provided by Clickable or sets a default value otherwise.
if(DEFINED ENV{SDK_FRAMEWORK})
    set(CLICK_FRAMEWORK  "$ENV{SDK_FRAMEWORK}")
else()
    set(CLICK_FRAMEWORK  "ubuntu-sdk-20.04")
endif()

# This figures out the target architecture for use in the manifest file.
if(DEFINED ENV{ARCH})
    set(CLICK_ARCH       "$ENV{ARCH}")
else()
    execute_process(
        COMMAND dpkg-architecture -qDEB_HOST_ARCH
        OUTPUT_VARIABLE CLICK_ARCH
        OUTPUT_STRIP_TRAILING_WHITESPACE
    )
endif()

if(CLICK_MODE)
configure_file(manifest.json.in ${CMAKE_CURRENT_BINARY_DIR}/manifest.json)
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/manifest.json DESTINATION ${DATA_DIR})
endif()
configure_file(About.qml.in ${CMAKE_CURRENT_BINARY_DIR}/About.qml)
install(DIRECTORY qml DESTINATION ${DATA_DIR}
   #Exclude the non-minified otpauth lib file
    PATTERN "otpauth.js" EXCLUDE)
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/About.qml DESTINATION ${DATA_DIR}/qml)
install(DIRECTORY assets DESTINATION ${DATA_DIR})

# Replace CMake variables in .desktop.in.in file with proper values.
configure_file(${DESKTOP_FILE_NAME_IN}.in.in ${DESKTOP_FILE_NAME_IN}.in)

# Translations
file(GLOB_RECURSE I18N_SRC_FILES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}/po qml/*.qml qml/*.js About.qml.in)
# We could also remove the js filter from above, but like this might be more clear for other developers
list(REMOVE_ITEM I18N_SRC_FILES PATTERN "otpauth" EXCLUDE)
list(APPEND I18N_SRC_FILES ${DESKTOP_FILE_NAME_IN}.in.h)

find_program(INTLTOOL_MERGE intltool-merge)
if(NOT INTLTOOL_MERGE)
    message(FATAL_ERROR "Could not find intltool-merge, please install the intltool package")
endif()
find_program(INTLTOOL_EXTRACT intltool-extract)
if(NOT INTLTOOL_EXTRACT)
    message(FATAL_ERROR "Could not find intltool-extract, please install the intltool package")
endif()

add_custom_target(${DESKTOP_FILE_NAME} ALL
    COMMENT "Merging translations into ${DESKTOP_FILE_NAME}..."
    COMMAND LC_ALL=C ${INTLTOOL_MERGE} -d -u ${CMAKE_SOURCE_DIR}/po ${CMAKE_CURRENT_BINARY_DIR}/${DESKTOP_FILE_NAME_IN}.in ${DESKTOP_FILE_NAME}
)

install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${DESKTOP_FILE_NAME} DESTINATION ${DESKTOP_DIR})

add_subdirectory(po)

# Make source files visible in qtcreator
file(GLOB_RECURSE PROJECT_SRC_FILES
    RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}
    qml/*.qml
    qml/*.js
    *.json
    *.json.in
    *.apparmor
    *.desktop.in
)

add_custom_target(${APP_HARDCODE}_FILES ALL SOURCES ${PROJECT_SRC_FILES})
