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 1)
set(PRJ_VERSION   ${PRJ_VER_MAJOR}.${PRJ_VER_MINOR}.${PRJ_VER_PATCH})

set(LTRAPI_MIN_VERSION 1.31.1)

option(LTRMANAGER_BUILD_WITH_QT5 "Build with Qt5 libraries rather Qt4" OFF)

if(LTRMANAGER_BUILD_WITH_QT5)
    cmake_minimum_required(VERSION 2.8.11)
else(LTRMANAGER_BUILD_WITH_QT5)
    cmake_minimum_required(VERSION 2.6)
endif(LTRMANAGER_BUILD_WITH_QT5)



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 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(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(SOURCES 
        src/main.cpp
        src/MainWindow.cpp
        src/LtrManagerEnv.cpp
        src/Crates/ConfigDialog/CrateConfigDialog.cpp
        src/Crates/ConfigDialog/ConfigPasswordDialog.cpp
        src/Crates/SyncCtl/CrateSyncCtlDialog.cpp
        src/Crates/SyncCtl/CratePluginSyncCtl.cpp
        src/Crates/CEU/CratePluginCEU.cpp
        src/Crates/EU/CratePluginEU.cpp
        src/Crates/EU/CrateFirmeareUpdateEU.cpp

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


set(HEADERS
        src/StatisticPanel/statistic_params.h

        src/Crates/CEU/ltrceu_defs.h
)

set(QT_HEADERS
        src/MainWindow.h
        src/LtrManagerEnv.h
        src/ActionPlugin.h
        src/Crates/ConfigDialog/CrateConfigDialog.h
        src/Crates/ConfigDialog/ConfigPasswordDialog.h
        src/Crates/SyncCtl/CrateSyncCtlDialog.h
        src/Crates/SyncCtl/CratePluginSyncCtl.h
        src/Crates/CEU/CratePluginCEU.h
        src/Crates/EU/CratePluginEU.h
        src/Crates/EU/CrateFirmeareUpdateEU.h


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

set(QT_UI_FILES
        src/MainWindow.ui
        src/AddLtrdConnectionDialog/AddLtrdConnectionDialog.ui
        src/LtrdConnectionSettings/LtrdConnectionSettings.ui
        src/IpEntriesPanel/AddIpEntryDialog.ui

        src/Crates/ConfigDialog/CrateConfigDialog.ui
        src/Crates/ConfigDialog/ConfigPasswordDialog.ui
        src/Crates/SyncCtl/CrateSyncCtlDialog.ui
       )

set(RESOURCES
        icons/icons.qrc)



#файлы из QtSolutions
set(SOURCES ${SOURCES}
        src/QtSingleApplication/qtlocalpeer.cpp
        src/QtSingleApplication/qtlockedfile.cpp
        src/QtSingleApplication/qtsingleapplication.cpp
        src/QtSingleApplication/qtsinglecoreapplication.cpp
    )

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

set(QT_HEADERS ${QT_HEADERS}
        src/QtSingleApplication/qtlocalpeer.h
        src/QtSingleApplication/qtsingleapplication.h
        src/QtSingleApplication/qtsinglecoreapplication.h
    )

set(HEADERS ${HEADERS}
            src/QtSingleApplication/qtlockedfile.h)







include_directories(src)
include_directories(${CMAKE_CURRENT_BINARY_DIR})

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



#обработка файлов переводов
set(LANGUAGE_TS_FILES)
foreach(LANGUAGE ${LANGUAGES})
    set(TS_FILE "${CMAKE_CURRENT_SOURCE_DIR}/translations/ltrmanager_${LANGUAGE}.ts")
    set_source_files_properties(${TS_FILE} PROPERTIES OUTPUT_LOCATION ${CMAKE_CURRENT_BINARY_DIR}/translations)
    set(LANGUAGE_TS_FILES ${LANGUAGE_TS_FILES} ${TS_FILE})
endforeach(LANGUAGE ${LANGUAGES})



if(LTRMANAGER_BUILD_WITH_QT5)
    find_package(Qt5Widgets)
    find_package(Qt5Network)
    find_package(Qt5LinguistTools)

    qt5_wrap_cpp(MOC_SOURCES ${QT_HEADERS})
    qt5_wrap_ui(QT_UI_HEADERS ${QT_UI_FILES})
    qt5_add_resources(QRC_SOURCES ${RESOURCES})

    qt5_create_translation(QM_FILES ${QT_UI_HEADERS} ${LANGUAGE_TS_FILES} ${HEADERS} ${QT_HEADERS} ${SOURCES} ${MOC_SOURCES})

    set(LIBS ${LIBS} Qt5::Widgets Qt5::Network)
    set(LBOOT_DIALOG_BUILD_WITH_QT5 ON)
else()
    find_package(Qt4 REQUIRED QtGui QtCore QtNetwork)
    include(${QT_USE_FILE})
    qt4_wrap_cpp(MOC_SOURCES ${QT_HEADERS})
    qt4_wrap_ui(QT_UI_HEADERS ${QT_UI_FILES})
    qt4_add_resources(QRC_SOURCES ${RESOURCES})
    qt4_create_translation(QM_FILES ${QT_UI_HEADERS} ${LANGUAGE_TS_FILES} ${HEADERS} ${QT_HEADERS} ${SOURCES} ${MOC_SOURCES})

    set(LIBS ${LIBS} ${QT_LIBRARIES} ${QT_QTMAIN_LIBRARY})
endif()





set(LBOOT_DIALOG_DIR ${CMAKE_CURRENT_SOURCE_DIR}/src/QtLbootDialog)
include_directories(${LBOOT_DIALOG_DIR})
include(${LBOOT_DIALOG_DIR}/QtLbootDialog.cmake)


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



add_executable(${PROJECT} WIN32 ${HEADERS} ${QT_HEADERS} ${SOURCES} ${MOC_SOURCES}
               ${QRC_SOURCES} ${TRANSLATIONS} ${MOC_SOURCES} ${QT_UI_HEADERS} ${QM_FILES}
               ${LBOOT_DIALOG_FILES})

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



if(UNIX)
    install(TARGETS ${PROJECT} DESTINATION bin)
    install(FILES icons/ltr.png icons/ltr.xpm DESTINATION share/pixmaps)
    install(FILES ${QM_FILES} ${LBOOT_DIALOG_QM_FILES} 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)


    if(LTRMANAGER_BUILD_WITH_QT5)
        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 "/" "\\\\" UCRT_REDISTR ${UCRT_REDISTR})


        set(QT_INSTALL_VER qt5)
    else(LTRMANAGER_BUILD_WITH_QT5)
        string(REGEX REPLACE "/" "\\\\" QT_BINARY_DIR ${QT_BINARY_DIR})
        set(QT_INSTALL_VER qt4)
    endif(LTRMANAGER_BUILD_WITH_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 "/" "\\\\" MSVC_RT_REDISTR_DIR ${MSVC_RT_REDISTR_DIR})


    set(INSTALLER_NAME ${PROJECT}_${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}" sign /v /ac "${SIGN_CERT}" /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)
