cmake_minimum_required(VERSION 3.26.0 FATAL_ERROR)

set(this_target "polynomSelectService")
set(this_target_name "polynomSelectService")

# Qt
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_AUTOUIC ON)

project(${this_target})

# Build type
set(CMAKE_BUILD_TYPE Debug CACHE STRING "Build type")
set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS Debug Release MinSizeRel RelWithDebInfo)

# Platform
set(PLATFORM "x64" CACHE STRING "Build platform")

set(CMAKE_PREFIX_PATH "$ENV{Qt6};$ENV{PolynomSelectService}")
message(STATUS "${CMAKE_PREFIX_PATH}")
#find_package(PolynomApi REQUIRED)
find_package(Cross.Login REQUIRED)
find_package(Cross.Gui REQUIRED)
find_package(Qt6 COMPONENTS Core Widgets Gui REQUIRED)


# CompileOptions
include(${CMAKE_CURRENT_SOURCE_DIR}/../CMake/CompileOptions.cmake)
set(OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/../Build/${this_target})

set(CMAKE_LIBRARY_OUTPUT_DIRECTORY  ${OUTPUT_DIRECTORY})
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY  ${OUTPUT_DIRECTORY})
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY  ${OUTPUT_DIRECTORY})
set(CMAKE_PDB_OUTPUT_DIRECTORY      ${OUTPUT_DIRECTORY})

# Visual Studio output dir workaround
# https://stackoverflow.com/questions/7747857/in-cmake-how-do-i-work-around-the-debug-and-release-directories-visual-studio-2
foreach(OUTPUTCONFIG ${CMAKE_CONFIGURATION_TYPES})
  string(TOUPPER ${OUTPUTCONFIG} OUTPUTCONFIG)
  set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${OUTPUT_DIRECTORY})
  set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${OUTPUT_DIRECTORY})
  set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${OUTPUT_DIRECTORY})
  set(CMAKE_PDB_OUTPUT_DIRECTORY_${OUTPUTCONFIG}     ${OUTPUT_DIRECTORY})
endforeach(OUTPUTCONFIG CMAKE_CONFIGURATION_TYPES)

# KOMPAS INCLUDE
if (${CMAKE_BUILD_TYPE} STREQUAL "Debug")
  set(KOMPAS_INCLUDE_DIRECTORIES
    "${KOMPAS_OUTPUT_DIR}/LibToolDis/LibToolDis"
    "$ENV{KOMPAS_WRK}/Source/API/KsAPI/KsAPI"
  )

  set(KOMPAS_LINK_DIRECTORIES
    "${KOMPAS_OUTPUT_DIR}"
  )
else()
  set(KOMPAS_OUTPUT_DIR "${KOMPAS_INSTALL_FOLDER}/Bin")
  set(KOMPAS_INCLUDE_DIRECTORIES
    "${KOMPAS_INSTALL_FOLDER}/SDK/KsAPI/Include"
    "$ENV{KOMPAS_SDK}/KsAPI/Include" # ��� ������ �� �������
  )

  set(KOMPAS_LINK_DIRECTORIES
    "${KOMPAS_INSTALL_FOLDER}/SDK/KsAPI/Lib64"
    "${KOMPAS_INSTALL_FOLDER}/Bin"
    "${KOMPAS_INSTALL_FOLDER}/Bin(x64)"
    "$ENV{KOMPAS_SDK}/KsAPI/Lib64" # ��� ������ �� �������
    "$ENV{KOMPAS_BIN}" # ��� ������ �� �������
  )
endif()

# Kompas binary output dir
message(STATUS "Kompas output external dir: ${KOMPAS_OUTPUT_DIR}")

add_library(${this_target} SHARED)

source_group("CMake Generated Files" "CMakeFiles")

source_group("Resource Files" ".*[.]rc|.*[.]xml|.*_rc2[.]h|.*_If[.]h|.*_defs?[.]h|.*_RC_bas[.]h|.*_res[.]cpp")

if (WIN32)
  set(Q_WIN_WIDGET_DIR $ENV{KOMPAS_SDK}/KsAPI/Include/Qt/QtDialog)
endif()

set(ICON_UTIL_DIR $ENV{KOMPAS_SDK}/KsAPI/Include/Qt/IconUtil)

target_sources(${this_target}
  PRIVATE
    # Resources

    # Implementation
    "QtSettingWin.cpp"
    "QtDialog.cpp"
    "MyDialog.cpp"

    # PRIVATE FILE_SET headers TYPE HEADERS BASE_DIRS "${CMAKE_SOURCE_DIR}" FILES
    "ProxyWidget.h"
    "MyDialog.h"

    # PRIVATE FILE_SET cxxmodules TYPE CXX_MODULES FILES
    )

if (WIN32)
  target_sources(${this_target}
    PRIVATE
      "${Q_WIN_WIDGET_DIR}/QWinWidget.h"
      )

  if (WIN32)
    target_precompile_headers(${this_target} PRIVATE
            <QWidget>
            <QPointer>
    )
  endif()
endif()

# Suppress warning in qt moc *.cpp
set_source_files_properties(${CMAKE_CURRENT_BINARY_DIR}/${this_target}_autogen/mocs_compilation.cpp PROPERTIES 
  COMPILE_OPTIONS "$<$<BOOL:${WIN32}>:/wd4464>"
)

set_target_properties(${this_target} PROPERTIES
  OUTPUT_NAME ${this_target_name}
  SUFFIX ".rtw"
)

target_include_directories(${this_target} PRIVATE
  ${COMMON_INCLUDE_DIRECTORIES}
  ${KOMPAS_INCLUDE_DIRECTORIES}
  "$<$<BOOL:${WIN32}>:${Q_WIN_WIDGET_DIR}>"
  ${ICON_UTIL_DIR}
  )

target_link_directories(${this_target} PRIVATE
  ${COMMON_LINK_DIRECTORIES}
  ${KOMPAS_LINK_DIRECTORIES}
)

target_compile_definitions(${this_target} PRIVATE
  ${DEPRECATION_MACROS}
  ${UNICODE_MACROS}
  "$<$<BOOL:${WIN32}>:${WINDOWS_MACROS}>")

# 3rd party libs
target_link_libraries(${this_target} PRIVATE
  Qt6::Core
  Qt6::Widgets
)
if(MSVC)
target_link_libraries(${this_target} PRIVATE delayimp.lib) #delay load
endif()

# Project references
target_link_libraries(${this_target} PRIVATE
  Ascon.Polynom.Cross.Gui
  Ascon.Polynom.Cross.Login
  PolynomApi
)

target_compile_features(${this_target} PRIVATE
  ${CXX_STD_VERSION}
)

target_compile_options(${this_target} PRIVATE
  ${MULTIPROCESSORCOMPILATION}
  ${DEBUG_INFORMATION_FORMAT}
  ${EXCEPTION_HANDLING_MODEL}
  ${COMMON_COMPILE_OPTIONS}
  ${WARNINGS_LEVEL}
  ${WARNINGS_AS_ERRORS}
  ${ADDITIONAL_COMPILE_OPTIONS_CXX}
)
if(MSVC)
target_link_options(${this_target} PRIVATE
  "/DELAYLOAD:Ascon.Polynom.Cross.Gui.dll"
  "/DELAYLOAD:Ascon.Polynom.Cross.Login.dll"
  "/DELAYLOAD:PolynomApi.dll"
  #"/VERBOSE"
)
endif()

if(UNIX)
set_target_properties(${this_target} PROPERTIES 
  INSTALL_RPATH "$ORIGIN/../../../Bin/Client/PolynomGuiApi"
  BUILD_RPATH "$ORIGIN/../../../Bin/Client/PolynomGuiApi"
)
endif()

