if(NOT LTR_SDK_SUFFIX)
    include(cmake/ltrnames/ltrnames.cmake)
endif(NOT LTR_SDK_SUFFIX)
set(PROJECT_SRC_NAME  ltrmanager)
set(PROJECT ${LTR_SDK_SUFFIX}manager)
set(PRJ_APP_TITLE "${LTR_CRATE_NAME} Manager")
set(LTR_SERVICE_NAME ${LTR_SDK_SUFFIX}d)


project(${PROJECT})
set(PRJ_VER_MAJOR 1)
set(PRJ_VER_MINOR 5)
set(PRJ_VER_PATCH 6)
set(PRJ_VERSION   ${PRJ_VER_MAJOR}.${PRJ_VER_MINOR}.${PRJ_VER_PATCH})

set(LTRAPI_MIN_VERSION 1.32.7)

cmake_minimum_required(VERSION 2.8.12)



set(PRJ_DESCR_EN "Tool for monitoring and control ${LTR_CRATE_NAME} crates")
set(PRJ_DESCR_RU "Утилита для управления крейтами ${LTR_CRATE_NAME}")

SET(LANGUAGES ru)

if(NOT ${CMAKE_VERSION}  VERSION_LESS "3.0.0")
    string(TIMESTAMP CURRENT_YEAR "%Y")
endif()


if(NOT PRJ_TRANSLATIONS_DIR)
    if(WIN32)
        set(PRJ_TRANSLATIONS_DIR "translations")
    else(WIN32)
        set(PRJ_TRANSLATIONS_DIR "${CMAKE_INSTALL_PREFIX}/share/ltrmanager/translations")
    endif(WIN32)
endif(NOT PRJ_TRANSLATIONS_DIR)


add_definitions(-DPRJ_NAME="${PROJECT}")
add_definitions(-DPRJ_VERION_STR="${PRJ_VERSION}")
add_definitions(-DPRJ_APP_TITLE="${PRJ_APP_TITLE}")
add_definitions(-DPRJ_TRANSLATIONS_DIR="${PRJ_TRANSLATIONS_DIR}")
add_definitions(-DLTR_VENDOR_NAME="${LTR_VENDOR_NAME}")
add_definitions(-DLTR_VENDOR_URL="${LTR_VENDOR_URL}")
add_definitions(-DLTR_CRATE_NAME="${LTR_CRATE_NAME}")
add_definitions(-DLTR_MODULE_NAME="${LTR_MODULE_NAME}")
add_definitions(-DLTR_SERVICE_NAME="${LTR_SERVICE_NAME}")



if(FORCE_CXX_STANDARD)
  if (CMAKE_VERSION VERSION_LESS "3.1")
    if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
      set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++${FORCE_CXX_STANDARD}")
    endif ()
  else ()
    set (CMAKE_CXX_STANDARD ${FORCE_CXX_STANDARD})
  endif ()
endif(FORCE_CXX_STANDARD)

if(MSVC)
    SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /SUBSYSTEM:WINDOWS,5.01")

    add_definitions(-D_CRT_SECURE_NO_WARNINGS)
    foreach(flag_var
            CMAKE_C_FLAGS CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE
            CMAKE_C_FLAGS_MINSIZEREL CMAKE_C_FLAGS_RELWITHDEBINFO)
       if(${flag_var} MATCHES "/MD")
          string(REGEX REPLACE "/MD" "/MT" ${flag_var} "${${flag_var}}")
       endif(${flag_var} MATCHES "/MD")
    endforeach(flag_var)
endif(MSVC)


set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTORCC ON)

set(SOURCES 
        src/main.cpp
        src/LtrManagerEnv.h
        src/MainWindow.h
        src/MainWindow.cpp
        src/MainWindow.ui
        src/LtrManagerEnv.cpp
        src/ActionPlugin.h
        src/Crates/ConfigDialog/CrateConfigDialog.h
        src/Crates/ConfigDialog/CrateConfigDialog.cpp
        src/Crates/ConfigDialog/CrateConfigDialog.ui
        src/Crates/ConfigDialog/ConfigPasswordDialog.h
        src/Crates/ConfigDialog/ConfigPasswordDialog.cpp
        src/Crates/ConfigDialog/ConfigPasswordDialog.ui
        src/Crates/SyncCtl/CrateSyncCtlDialog.h
        src/Crates/SyncCtl/CrateSyncCtlDialog.cpp
        src/Crates/SyncCtl/CrateSyncCtlDialog.ui
        src/Crates/SyncCtl/CratePluginSyncCtl.h
        src/Crates/SyncCtl/CratePluginSyncCtl.cpp
        src/Crates/CEU/ltrceu_defs.h
        src/Crates/CEU/CratePluginCEU.h
        src/Crates/CEU/CratePluginCEU.cpp
        src/Crates/EU/CratePluginEU.h
        src/Crates/EU/CratePluginEU.cpp
        src/Crates/EU/CrateFirmeareUpdateEU.h
        src/Crates/EU/CrateFirmeareUpdateEU.cpp

        src/LtrdConnection.h
        src/LtrdConnection.cpp
        src/LtrCratesModel.h
        src/LtrCratesModel.cpp
        src/LtrCrateInfo.h
        src/LtrCrateInfo.cpp        
        src/SizeHintWidget.h
        src/SizeHintWidget.cpp
        src/AddLtrdConnectionDialog/AddLtrdConnectionDialog.h
        src/AddLtrdConnectionDialog/AddLtrdConnectionDialog.cpp
        src/AddLtrdConnectionDialog/AddLtrdConnectionDialog.ui
        src/LtrdConnectionSettings/LtrdConnectionSettings.h
        src/LtrdConnectionSettings/LtrdConnectionSettings.cpp
        src/LtrdConnectionSettings/LtrdConnectionSettings.ui
        src/IpEntriesPanel/CheckBoxItemDelegate.h
        src/IpEntriesPanel/CheckBoxItemDelegate.cpp
        src/IpEntriesPanel/IpEntriesPanel.h
        src/IpEntriesPanel/IpEntriesPanel.cpp
        src/IpEntriesPanel/LtrIpEntriesModel.h
        src/IpEntriesPanel/LtrIpEntriesModel.cpp
        src/IpEntriesPanel/AddIpEntryDialog.h
        src/IpEntriesPanel/AddIpEntryDialog.cpp
        src/IpEntriesPanel/AddIpEntryDialog.ui
        src/StatisticPanel/statistic_params.h
        src/StatisticPanel/StatisticPanel.h
        src/StatisticPanel/StatisticPanel.cpp
        src/StatisticPanel/StatisticModel.h
        src/StatisticPanel/StatisticModel.cpp
        src/Log/LtrdLogPanel.h
        src/Log/LtrdLogPanel.cpp
        src/Log/LtrdLogModel.h
        src/Log/LtrdLogModel.cpp
        src/LQTableWidget/LQTableWidget.h
        src/LQTableWidget/LQTableWidget.cpp
        src/LQTableWidget/LQTableCopyAction.h
        src/LQTableWidget/LQTableCopyAction.cpp

        subs/LQError/LQError.h
        subs/LQError/LQError.cpp
        subs/QStringVersion/QStringVersion.h
        subs/QStringVersion/QStringVersion.cpp
        icons/icons.qrc

        src/QtSingleApplication/qtlocalpeer.h
        src/QtSingleApplication/qtlocalpeer.cpp
        src/QtSingleApplication/qtlockedfile.cpp
        src/QtSingleApplication/qtsingleapplication.h
        src/QtSingleApplication/qtsingleapplication.cpp
        src/QtSingleApplication/qtsinglecoreapplication.h
        src/QtSingleApplication/qtsinglecoreapplication.cpp
        src/QtSingleApplication/qtlockedfile.h
    )

if(WIN32)
    set(SOURCES ${SOURCES} src/QtSingleApplication/qtlockedfile_win.cpp)
else()
    set(SOURCES ${SOURCES} src/QtSingleApplication/qtlockedfile_unix.cpp)
endif()


include_directories(src subs/LQError subs/QStringVersion)
include_directories(${CMAKE_CURRENT_BINARY_DIR})

if(WIN32)
    configure_file(${PROJECT_SRC_NAME}.rc.in ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT}.rc)
    set(PRJ_GENFILES ${PRJ_GENFILES} ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT}.rc)
endif(WIN32)








find_package(Qt5Widgets)
find_package(Qt5Network)
find_package(Qt5LinguistTools)


set(LIBS ${LIBS} Qt5::Widgets Qt5::Network)


set(LBOOT_DIALOG_DIR ${CMAKE_CURRENT_SOURCE_DIR}/src/QtLbootDialog)
include_directories(${LBOOT_DIALOG_DIR})
include(${LBOOT_DIALOG_DIR}/qlbootdialog.cmake)
set(ADDITIONAL_SOURCES ${ADDITIONAL_SOURCES} ${QLBOOT_DIALOG_SOURCES})
set(PRJ_GENFILES ${PRJ_GENFILES} ${QLBOOT_DIALOG_GENFILES})


#обработка файлов переводов
set(PRJ_TS_BASENAME ltrmanager)
qtranslation_generate(PRJ_TRANSLATION_FILES translations ${PRJ_TS_BASENAME} ${SOURCES})
set(PRJ_GENFILES ${PRJ_GENFILES}  ${PRJ_TRANSLATION_FILES})



include_directories(${LTRAPI_INCLUDE_DIR})
link_directories(${LTRAPI_LIBRARIES_DIR})



add_executable(${PROJECT} WIN32 ${SOURCES} ${ADDITIONAL_SOURCES} ${PRJ_GENFILES})

target_link_libraries(${PROJECT} ${LIBS} ltrapi ltr030api ltrlogapi)


source_group(TREE  ${PROJECT_BINARY_DIR} PREFIX "Genfiles" FILES ${PRJ_GENFILES} )
source_group(TREE  ${PROJECT_SOURCE_DIR} PREFIX "Sources" FILES ${SOURCES} ${ADDITIONAL_SOURCES} )

if(UNIX)
    install(TARGETS ${PROJECT} DESTINATION bin)
    install(FILES icons/ltr.png icons/ltr.xpm DESTINATION share/pixmaps)
    install(FILES ${PRJ_TRANSLATION_FILES} ${QLBOOT_DIALOG_GENFILES} DESTINATION ${PRJ_TRANSLATIONS_DIR})

    configure_file(${PROJECT_SRC_NAME}.desktop.in ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT}.desktop)
    install( PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT}.desktop DESTINATION share/applications )
elseif(WIN32)
    install(TARGETS ${PROJECT} DESTINATION ltr)
endif(UNIX)


#цели для сборки пакетов
if(LTR_CMAKE_PACKAGES)
    set(PACKAGE_NAME     ${PROJECT})
    set(PACKAGE_VERSION  ${PRJ_VERSION})
    set(PACKAGE_ARCH_INSTALL_FILE ${PACKAGE_NAME}.install)
    include(${LTR_CMAKE_PACKAGES})
endif(LTR_CMAKE_PACKAGES)


#создание установщика под Windows
if(WIN32 AND LTR_BUILD_WIN_INSTALLERS)
    set(LTRAPI_BINARY_DIR ${LTR_SDK_BINARY_DIR}/ltrapi/install32/ltr/lib)



    get_target_property(QtCoreLibrary Qt5::Core LOCATION)
    get_target_property(QtGuiLibrary Qt5::Gui LOCATION)
    get_target_property(QtWidgetsLibrary Qt5::Widgets LOCATION)
    get_target_property(QtNetworkLibrary Qt5::Network LOCATION)
    get_target_property(QtWindowsLibrary Qt5::QWindowsIntegrationPlugin LOCATION)

    get_target_property (QT_QMAKE_EXECUTABLE Qt5::qmake IMPORTED_LOCATION)
    execute_process(COMMAND ${QT_QMAKE_EXECUTABLE} -query QT_INSTALL_TRANSLATIONS
                    OUTPUT_VARIABLE QT_TRANSLATIONS_DIR
                    )

    string(REGEX REPLACE "/" "\\\\" QtCoreLibrary    ${QtCoreLibrary})
    string(REGEX REPLACE "/" "\\\\" QtGuiLibrary     ${QtGuiLibrary})
    string(REGEX REPLACE "/" "\\\\" QtWidgetsLibrary ${QtWidgetsLibrary})
    string(REGEX REPLACE "/" "\\\\" QtNetworkLibrary ${QtNetworkLibrary})
    string(REGEX REPLACE "/" "\\\\" QtWindowsLibrary ${QtWindowsLibrary})

    string(STRIP ${QT_TRANSLATIONS_DIR} QT_TRANSLATIONS_DIR)

    string(REGEX REPLACE "/" "\\\\" WIN_UCRT_REDISTR_DIR ${WIN_UCRT_REDISTR_DIR})


    set(QT_INSTALL_VER qt5)

    string(REGEX REPLACE "/" "\\\\" QT_TRANSLATIONS_DIR ${QT_TRANSLATIONS_DIR})
    string(REGEX REPLACE "/" "\\\\" LTRAPI_BINARY_DIR ${LTRAPI_BINARY_DIR})
    string(REGEX REPLACE "/" "\\\\" LBOOT_EXEC ${LBOOT_EXEC})
    string(REGEX REPLACE "/" "\\\\" LBOOT_BIN_DIR ${LBOOT_BIN_DIR})
    string(REGEX REPLACE "/" "\\\\" MSVC_CRT_REDISTR_DIR ${MSVC_CRT_REDISTR_DIR})


    set(INSTALLER_NAME ${PROJECT}_setup_${PRJ_VERSION}.exe)

    if (MSVC14)
        set(MSVC_REDIST_VER "msvc2015")
    elseif (MSVC90)
        set(MSVC_REDIST_VER "msvc2008")
    else()
        message(FATAL "unsupported msvc redistr version")
    endif()

    configure_file(win_installer/${PROJECT_SRC_NAME}.nsi.in
                   ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT}.nsi @ONLY)

    #собираем сам установщик
    add_custom_command(OUTPUT ${INSTALLER_NAME}
        #по nsi файлу создаем установщик
        COMMAND ${NSIS_EXEC} ${PROJECT}.nsi
        DEPENDS ${PROJECT}
        DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT}.nsi
        #DEPENDS api32
        WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
    )

    add_custom_target(ltrmanager-installer
                      DEPENDS ${INSTALLER_NAME})

    if(NOT WIN_INSTALLER_NOSIGN)
        #подписываем установщик при неободимости
        add_custom_command(TARGET ltrmanager-installer POST_BUILD
            COMMAND "${SIGNTOOL_EXEC}" sign /v /n "${SIGN_COMPANY_NAME}" /t ${CERT_TIMESTAMP_URL} ${INSTALLER_NAME}
            WORKING_DIRECTORY ${PROJECT_BINARY_DIR}
        )
    endif(NOT WIN_INSTALLER_NOSIGN)

endif(WIN32 AND LTR_BUILD_WIN_INSTALLERS)
