set_property(GLOBAL PROPERTY USE_FOLDERS On)
#cmake_minimum_required(VERSION 3.20)
# limited by ubuntu 10 to 3.10
cmake_minimum_required(VERSION 3.10)


project (sack_gui)

if( CMAKE_HOST_SYSTEM_NAME STREQUAL "Android" )
	SET( __ANDROID__ ON )
endif( CMAKE_HOST_SYSTEM_NAME STREQUAL "Android" )

## Compute node version...
string(REPLACE "." ";" VERSION_LIST ${NODE_RUNTIMEVERSION})
list(GET VERSION_LIST 0 NODE_VERSION_MAJOR)
list(GET VERSION_LIST 1 NODE_VERSION_MINOR)
list(GET VERSION_LIST 2 NODE_VERSION_PATCH)
########

if( CMAKE_CXX_COMPILER_ID STREQUAL "Clang" )
	add_definitions( -Wno-unused-result -Wno-address-of-packed-member -Wno-parentheses -Wno-empty-body -Wno-switch -Wno-null-conversion -Wno-unused-parameter )
	add_definitions( -Wno-deprecated-volatile)
endif (CMAKE_CXX_COMPILER_ID STREQUAL "Clang")

include( GNUInstallDirs )

ADD_DEFINITIONS( -DBUILD_NODE_ADDON )

if( WIN32 AND (MSVC OR ( CMAKE_CXX_COMPILER_ID STREQUAL "Clang" ) ) )
#message( "----------------------------------------")

  #add_definitions( -D_CRT_SECURE_NO_WARNINGS -wd4995 -wd4996 )
  #add_definitions( -wd4996 )

  SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /MP8")
  if( ${NODE_VERSION_MAJOR}  GREATER_EQUAL 22 )
	  SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /std:c++20")
  elseif( ${NODE_VERSION_MAJOR}  GREATER_EQUAL 19 )
	  SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /std:c++17")
  else( )
	  SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /std:c++14")
  endif(  )

  SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /MP8")
  SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /MP8")

  SET( CMAKE_CXX_FLAGS_RELEASE  "${CMAKE_CXX_FLAGS_RELEASE}  /GS-" )
  SET( CMAKE_CXX_FLAGS_RELWITHDEBINFO  "${CMAKE_CXX_FLAGS_RELWITHDEBINFO}  /GS-" )
  SET( CMAKE_C_FLAGS_RELEASE  "${CMAKE_C_FLAGS_RELEASE}  /GS-" )
  SET( CMAKE_C_FLAGS_RELWITHDEBINFO  "${CMAKE_C_FLAGS_RELWITHDEBINFO} /GS-" )

  string( REPLACE "/RTC1" "" CMAKE_C_FLAGS_RELWITHDEBINFO ${CMAKE_C_FLAGS_RELWITHDEBINFO} )
  string( REPLACE "/RTC1" "" CMAKE_CXX_FLAGS_RELWITHDEBINFO ${CMAKE_CXX_FLAGS_RELWITHDEBINFO} )

  string( REPLACE "/Ob1" "/Ob2" CMAKE_CXX_FLAGS_RELWITHDEBINFO ${CMAKE_CXX_FLAGS_RELWITHDEBINFO} )
  string( REPLACE "/Ob1" "/Ob2" CMAKE_C_FLAGS_RELWITHDEBINFO ${CMAKE_C_FLAGS_RELWITHDEBINFO} )


#message( "DEBUG: ${CMAKE_C_FLAGS_DEBUG}   RELEASE:${CMAKE_C_FLAGS_RELEASE}  RELWITH:${CMAKE_C_FLAGS_RELWITHDEBINFO}" )


endif( )

if( CMAKE_COMPILER_IS_GNUCC )
  if( ${NODE_VERSION_MAJOR}  GREATER_EQUAL 22 )
	  SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++20")
  elseif( ${NODE_VERSION_MAJOR}  GREATER_EQUAL 19 )
	  SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++17")
  else()
      SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14")
  endif( )
endif( CMAKE_COMPILER_IS_GNUCC )


if( NOT WIN32 )
    ADD_DEFINITIONS( -D__LINUX__ )
else( NOT WIN32 )
    ADD_DEFINITIONS( -D_CRT_NONSTDC_NO_DEPRECATE )
endif( NOT WIN32 )

if( CMAKE_SIZEOF_VOID_P EQUAL 8 )
    SET( __64__ 1 )
    ADD_DEFINITIONS( -D__64__ )
endif( CMAKE_SIZEOF_VOID_P EQUAL 8 )

SET(CMAKE_SKIP_BUILD_RPATH  TRUE)
SET(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE)
SET(CMAKE_INSTALL_RPATH "\$ORIGIN/lib")

if( CMAKE_COMPILER_IS_GNUCC )
    SET( CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-Bsymbolic -Wl,--warn-unresolved-symbols" )
    SET( CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,-Bsymbolic -Wl,--warn-unresolved-symbols" )
endif( CMAKE_COMPILER_IS_GNUCC )

#ADD_DEFINITIONS( -DNO_OPEN_MACRO )

if( ${CMAKE_BUILD_TYPE} MATCHES "[dD][eE][bB][uU][gG]"
   OR ${CMAKE_BUILD_TYPE} MATCHES "[rR][eE][lL][wW][iI].*" )
   ADD_DEFINITIONS( -D_DEBUG )
endif( ${CMAKE_BUILD_TYPE} MATCHES "[dD][eE][bB][uU][gG]"
   OR ${CMAKE_BUILD_TYPE} MATCHES "[rR][eE][lL][wW][iI].*" )

# visual studio headers change with _DEBUG defined... so it can't be release with _DEBUG defined
if( NOT CMAKE_CXX_FLAGS_RELWITHDEBINFO MATCHES "-D_DEBUG_INFO" )
	set(  CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_DEBUG} -D_DEBUG_INFO" )
endif( NOT CMAKE_CXX_FLAGS_RELWITHDEBINFO MATCHES "-D_DEBUG_INFO" )

# visual studio headers change with _DEBUG defined... so it can't be release with _DEBUG defined
if( NOT CMAKE_C_FLAGS_RELWITHDEBINFO MATCHES "-D_DEBUG_INFO" )
	set(  CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_DEBUG} -D_DEBUG_INFO" )
endif( NOT CMAKE_C_FLAGS_RELWITHDEBINFO MATCHES "-D_DEBUG_INFO" )

if( __ANDROID__ )
	ADD_DEFINITIONS( -D__ANDROID__ )
	ADD_DEFINITIONS( -D"TARGET_INSTALL_PREFIX=\"${CMAKE_CURRENT_SOURCE_DIR}/build/${CMAKE_BUILD_TYPE}\"" )

endif( __ANDROID__ )


# SACK defaults this to ON because it doesn't expose it.
# so the gui can set this here?

include( ExternalProject )

if( WIN32 )
       set( GIT_REPO file://m:/sack )
else( WIN32 )
       set( GIT_REPO file:///home/git/sack )
endif( WIN32 )

if( NOT EXISTS GIT_REPO )
	set( GIT_REPO https://github.com/d3x0r/sack )
endif( NOT EXISTS GIT_REPO )


if( EXISTS NEED_LIBRESSL AND NOT NEED_LIBRESSL )
  SET( SACK_EXTRA_DEFS ${SACK_EXTRA_DEFS} -DNEED_LIBRESSL=0 )
else( EXISTS NEED_LIBRESSL AND NOT NEED_LIBRESSL )
  SET( SACK_EXTRA_DEFS ${SACK_EXTRA_DEFS} -DNEED_LIBRESSL=1 )
endif( EXISTS NEED_LIBRESSL AND NOT NEED_LIBRESSL )

if( EXISTS NEED_ZLIB AND NOT NEED_ZLIB )
  SET( SACK_EXTRA_DEFS ${SACK_EXTRA_DEFS} -DNEED_ZLIB=0 )
else(  EXISTS NEED_ZLIB AND NOT NEED_ZLIB )
  SET( SACK_EXTRA_DEFS ${SACK_EXTRA_DEFS} -DNEED_ZLIB=1 )
endif(  EXISTS NEED_ZLIB AND NOT NEED_ZLIB )

if( EXISTS NEED_JPEG AND NOT NEED_JPEG )
  SET( SACK_EXTRA_DEFS ${SACK_EXTRA_DEFS} -DNEED_JPEG=0 )
else(  EXISTS NEED_JPEG AND NOT NEED_JPEG )
  SET( SACK_EXTRA_DEFS ${SACK_EXTRA_DEFS} -DNEED_JPEG=1 )
endif(  EXISTS NEED_JPEG AND NOT NEED_JPEG )

if( EXISTS NEED_FREETYPE AND NOT NEED_FREETYPE )
  SET( SACK_EXTRA_DEFS ${SACK_EXTRA_DEFS} -DNEED_FREETYPE=0 )
else(  EXISTS NEED_FREETYPE AND NOT NEED_FREETYPE )
  SET( SACK_EXTRA_DEFS ${SACK_EXTRA_DEFS} -DNEED_FREETYPE=1 )
endif(  EXISTS NEED_FREETYPE AND NOT NEED_FREETYPE )


ExternalProject_Add( sack
		BUILD_ALWAYS ON
        PREFIX sack-src
	GIT_REPOSITORY ${GIT_REPO}
	GIT_SHALLOW 1
	INSTALL_DIR ${CMAKE_BINARY_DIR}/${CMAKE_BUILD_TYPE}
	CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${CMAKE_BINARY_DIR}/${CMAKE_BUILD_TYPE}
		-DNEED_PNG=1
		-DSACK_LIBRARY_ONLY=1 -DUSE_SYSLOG_STDOUT_DEFAULT=ON
		-DCMAKE_BINARY_DIR:PATH=${CMAKE_BINARY_DIR} 
		-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
		-DINCLUDE_EXTRAS=1 -DINCLUDE_VULKAN=0
     -DLIBRESSL_SKIP_INSTALL=0
     -DLIBRESSL_APPS=0
     -DLIBRESSL_TESTS=0
      ${SACK_EXTRA_DEFS}
)


if( EXISTS ${CMAKE_BINARY_DIR}/sack-src/src/sack/src/InterShell.stable )

ExternalProject_Add( intershell
        PREFIX sack-src
		BUILD_ALWAYS ON
	DEPENDS sack
	SOURCE_DIR ${CMAKE_BINARY_DIR}/sack-src/src/sack/src/InterShell.stable
	INSTALL_DIR ${CMAKE_BINARY_DIR}/${CMAKE_BUILD_TYPE}
	CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${CMAKE_BINARY_DIR}/${CMAKE_BUILD_TYPE}
		-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
		-DCMAKE_BINARY_DIR:PATH=${CMAKE_BINARY_DIR} 
		-DSACK_SDK_ROOT_PATH=${CMAKE_BINARY_DIR}/${CMAKE_BUILD_TYPE}
		-DBUILD_INTO_SACK_INSTALL=1

)

ExternalProject_Add( dekware
        PREFIX sack-src
		BUILD_ALWAYS ON
	DEPENDS sack intershell
	SOURCE_DIR ${CMAKE_BINARY_DIR}/sack-src/src/sack/src/games/dekware
	INSTALL_DIR ${CMAKE_BINARY_DIR}/${CMAKE_BUILD_TYPE}
	CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${CMAKE_BINARY_DIR}/${CMAKE_BUILD_TYPE}
		-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
		-DCMAKE_BINARY_DIR:PATH=${CMAKE_BINARY_DIR} 
		-DSACK_SDK_ROOT_PATH=${CMAKE_BINARY_DIR}/${CMAKE_BUILD_TYPE}
		-DINTERSHELL_SDK_ROOT_PATH=${CMAKE_BINARY_DIR}/${CMAKE_BUILD_TYPE}
		-DBUILD_INTO_SACK_INSTALL=1

)

LINK_DIRECTORIES( ${CMAKE_BINARY_DIR}/${CMAKE_BUILD_TYPE}/${CMAKE_INSTALL_LIBDIR} )
message( "Using libs ${CMAKE_BINARY_DIR}/${CMAKE_BUILD_TYPE}/${CMAKE_INSTALL_LIBDIR}" )
message( "Using libs ${SACK_LIBRARY_DIR}" )

set( DEFINITIONS   USE_SQLITE USE_SQLITE_INTERFACE NO_FILEOP_ALIAS NO_OPEN_MACRO
                _CRT_SECURE_NO_WARNINGS  NEED_SHLAPI NEED_SHLOBJ 
		"SQLITE_ENABLE_LOCKING_STYLE=0" SACK_CORE INCLUDE_GUI
                 )

foreach( DEF ${DEFINITIONS} )
   ADD_DEFINITIONS( -D${DEF} )
ENDFOREACH()


include_directories(${CMAKE_BINARY_DIR}/${CMAKE_BUILD_TYPE}/include/SACK )
include_directories(${CMAKE_BINARY_DIR}/${CMAKE_BUILD_TYPE}/include/SACK/InterShell )
include_directories(${CMAKE_JS_INC} )

if( WIN32 )
	set( MORE_MODULE_SOURCES 
		src/hid_module.cc
		src/reg_access.cc
		src/playSound_module.cc
		src/win32/commandline.cc
		src/win32/window_shell.cc
		src/win32/wifiInterface.cc
		src/gui/sack_systray.cc
		)
elseif( UNIX )
	set( MORE_MODULE_SOURCES 
		src/linux/commandline.cc
	)
endif( WIN32 )



set( GUI_SOURCES src/gui/sack_psi_module.cc
	src/gui/sack_systray.cc
	src/gui/sack_image_module.cc
	src/gui/sack_render_module.cc
	src/gui/sack_intershell_module.cc 
	src/gui/sack_vulkan_module.cc 
)

source_group( "Source Files\\GUI" FILES ${GUI_SOURCES} ) #REGULAR_EXPRESSION  src/gui/.*)

set( PROJECT sack_gui )
add_library(${PROJECT} SHARED
	src/com_interface.cc
	src/fileMonitor_module.cc
	src/jsonParse.cc
	src/jsoxParse.cc
	src/playSound_module.cc 
	src/network_module.cc
	src/objStore_module.cc
	src/sql_module.cc
	src/srg_module.cc
	src/system_module.cc
	src/task_module.cc
	src/text_object.cc
	src/thread_module.cc
	src/tls_interface.cc
	src/websocket_module.cc
	src/vfs_module.cc
	src/system_module.cc
	src/text_object.cc
	src/config_module.cc
	src/ssh2_module.cc
	${MORE_MODULE_SOURCES}
	${GUI_SOURCES}	
        )


set_target_properties(${PROJECT} PROPERTIES PREFIX "" SUFFIX ".node")

if( CMAKE_COMPILER_IS_GNUCC )
   set_target_properties(${PROJECT} PROPERTIES COMPILE_FLAGS "-Wno-unused-result")
endif( CMAKE_COMPILER_IS_GNUCC )

set_target_properties(${PROJECT} PROPERTIES COMPILE_DEFINITIONS "BUILDING_NODE_EXTENSION;TARGETNAME=\"${PROJECT}.node\";${MOREDEFS}" )
add_dependencies( ${PROJECT} sack intershell dekware )

if( UNIX )
  target_link_libraries( ${PROJECT} tls ssl crypto )
	set( VFSLIB sack_vfs.pp )
	set( EXTRACOPY 
   			COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_BINARY_DIR}/sack-${CMAKE_BUILD_TYPE}/${CMAKE_INSTALL_LIBDIR} ${CMAKE_BINARY_DIR}/${CMAKE_BUILD_TYPE}
	)
else( UNIX )
  #target_link_libraries( ${PROJECT} tls ssl crypto )
  target_link_libraries( ${PROJECT} tls ssl crypto bcrypt )
	set( VFSLIB sack_vfs.pp )
endif( UNIX )


target_link_libraries(${PROJECT} bag++ bag.externals bag.psi++ ${VFSLIB} ${CMAKE_JS_LIB} )

if( WIN32 )
  add_custom_target( finalTarget ALL #TARGET ${PROJECT} POST_BUILD
			#COMMAND cmake -E echo ${AMALG_COMMAND}
   			COMMAND ${CMAKE_COMMAND} -E echo Updating deps....
   			#COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_BINARY_DIR}/sack-${CMAKE_BUILD_TYPE}/share ${CMAKE_BINARY_DIR}/${CMAKE_BUILD_TYPE}
   			#COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_BINARY_DIR}/sack-${CMAKE_BUILD_TYPE}/lib ${CMAKE_BINARY_DIR}/${CMAKE_BUILD_TYPE}
   			#COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_BINARY_DIR}/sack-${CMAKE_BUILD_TYPE}/bin ${CMAKE_BINARY_DIR}/${CMAKE_BUILD_TYPE}
			#${EXTRACOPY}
		COMMENT "Updating Dependancies to build target"
                   #DEPENDS ${PROJECT}
  )
  add_dependencies( finalTarget ${PROJECT} )
endif( WIN32 )



if( WIN32 )
  set_property(TARGET ${PROJECT} PROPERTY
      MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>DLL")
   target_link_libraries(${PROJECT} winmm ws2_32 rpcrt4 iphlpapi odbc32 psapi ntdll )
endif( WIN32 )

if( UNIX )
   target_link_libraries( ${PROJECT} uuid )
endif( UNIX )

endif( EXISTS ${CMAKE_BINARY_DIR}/sack-src/src/sack/src/InterShell.stable )


message( "${CMAKE_C_FLAGS_DEBUG}  ${CMAKE_C_FLAGS_RELEASE}  ${CMAKE_C_FLAGS_RELWITHDEBINFO}" )
