project( yabause-qt )

yab_port_start()

find_package(Qt6 COMPONENTS Widgets QUIET)
find_package(Qt6 COMPONENTS Test QUIET)
find_package(Qt6 COMPONENTS Network QUIET)

# FetchContentモジュールのインクルード
include(FetchContent)

# ICUのバイナリダウンロードと解凍設定
FetchContent_Declare(
    icu
    URL https://github.com/unicode-org/icu/releases/download/release-76-1/icu4c-76_1-Win64-MSVC2022.zip
    URL_HASH SHA256=bedba77dd1feca09e9ae9922109a285c0ecf46d09c80b65eae6eae63a4e155dc
    DOWNLOAD_EXTRACT_TIMESTAMP TRUE  # タイムスタンプを解凍時のものに設定
)

# ICUの解凍とインクルード設定
FetchContent_GetProperties(icu)
if(NOT icu_POPULATED)
    FetchContent_Populate(icu)
endif()

# ICUのインクルードパスとライブラリパスを設定
set(ICU_INCLUDE_DIR "${icu_SOURCE_DIR}/include")
set(ICU_LIBRARY_DIR "${icu_SOURCE_DIR}/lib64")
set(ICU_BIN_DIR "${icu_SOURCE_DIR}/bin64")


if (YAB_WANT_VULKAN)
	include_directories( ${VULKAN_INCLUDE_DIRS} )
endif()

if( YAB_WANT_OPENGL )
	Find_package(Qt6OpenGL)
	Find_package(Qt6OpenGLWidgets)
	include_directories(${Qt6OpenGLWidgets_INCLUDE_DIRS})
	include_directories(${Qt6OpenGL_INCLUDE_DIRS})
endif()

include_directories(${Qt6Widgets_INCLUDE_DIRS})
add_definitions(${Qt6Widgets_DEFINITIONS}) 

if (WIN32)
	find_package(Qt6Core)
endif()

find_package(Qt6Multimedia REQUIRED)
add_definitions(-DHAVE_QT_MULTIMEDIA=1)

#find_package(Qt5WebEngineWidgets REQUIRED)
#include_directories(${Qt5WebEngineWidgets_INCLUDE_DIRS})
#add_definitions(${Qt5WebEngineWidgets_DEFINITIONS}) 


# Since Qt5's cmake script doesn't set it, we will have to
set(_qt6Core_install_prefix "${Qt6_DIR}/../../../") 
SET(QT_BINARY_DIR "${_qt6Core_install_prefix}/bin")
if (MSYS2_BUILD)
	SET(QT_PLUGINS_DIR "${_qt6Core_install_prefix}/share/qt6/plugins")
else()
	SET(QT_PLUGINS_DIR "${_qt6Core_install_prefix}/plugins")
endif()


# qt resources file
set( yabause_qt_RESOURCES resources/resources.qrc )

if ( WIN32 )
	# Windows port libraries
	set( yabause_qt_windows_LIBRARIES
		vfw32 legacy_stdio_definitions.lib
		advapi32 ws2_32 crypt32  Psapi Iphlpapi Userenv
		dbghelp bcrypt
		)

	# resources
	set ( yabause_qt_windows_RESOURCES
		resources/icons/yabause.rc )
endif ( WIN32 )

if(APPLE)
    find_library(AUDIO_LIBRARY AudioUnit)
    set(yabause_qt_macosx_LIBRARIES ${AUDIO_LIBRARY})
endif()

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

# qt forms
set( yabause_qt_FORMS
	ui/UIYabause.ui
	ui/UISettings.ui
	ui/UIAbout.ui
	ui/UICheats.ui
	ui/UICheatAR.ui
	ui/UICheatRaw.ui
	ui/UICheatSearch.ui
	ui/UIBackupRam.ui
	ui/UIPortManager.ui
	ui/UIPadSetting.ui 
	ui/UI3DControlPadSetting.ui 
    ui/UIWheelSetting.ui 
    ui/UIMissionStickSetting.ui 
    ui/UIDoubleMissionStickSetting.ui 
	ui/UIGunSetting.ui
	ui/UIMouseSetting.ui 
    ui/UIDebugCPU.ui
    ui/UIDebugSCSP.ui
    ui/UIDebugSCSPDSP.ui
    ui/UIDebugVDP1.ui
    ui/UIDebugVDP2.ui
    ui/UIDebugVDP2Viewer.ui
    ui/UIHexInput.ui
    ui/UIMemoryTransfer.ui 
    ui/UIMemoryEditor.ui 
	ui/UIMemorySearch.ui
	ui/WebLoginWindow.ui
	ui/UIReportList.ui )

# pure C headers
set( yabause_qt_HEADERS
	QtYabause.h
	CommonDialogs.h
	PerQt.h
	Arguments.h )

# C headers needing moc
set( yabause_qt_MOC_HEADERS
	ui/UIYabause.h
	ui/UISettings.h
	ui/UIAbout.h
	ui/UICheats.h
	ui/UICheatAR.h
	ui/UICheatRaw.h
	ui/UICheatSearch.h
	ui/UIBackupRam.h
	ui/UIPortManager.h
	ui/UIControllerSetting.h
	ui/UIPadSetting.h
	ui/UI3DControlPadSetting.h
    ui/UIWheelSetting.h
    ui/UIMissionStickSetting.h
    ui/UIDoubleMissionStickSetting.h
	ui/UIGunSetting.h
	ui/UIMouseSetting.h
	ui/UIShortcutManager.h
    ui/UIDebugCPU.h
    ui/UIDebugM68K.h
    ui/UIDebugSCSP.h
    ui/UIDebugSCSPChan.h
    ui/UIDebugSCSPDSP.h
    ui/UIDebugSCSPGraph.h
    ui/UIDebugSCUDSP.h
    ui/UIDebugSH2.h
    ui/UIDebugVDP1.h
    ui/UIDebugVDP2.h
    ui/UIDebugVDP2Viewer.h
    ui/UIDisasm.h
    ui/UIHexInput.h
    ui/UIMemoryTransfer.h
    ui/UIHexEditor.h
    ui/UIMemoryEditor.h
	ui/UIMemorySearch.h
	ui/WebLoginWindow.h
	ui/UIReportList.h
	YabauseGL.h
	VolatileSettings.h
	Settings.h
	YabauseThread.h
	QGameInfo.h
	GameInfoCache.h
#	GameItemDelegate.h
	filesearchwidget.h
	filesearchworker.h
	qprogressindicator.h
	GameTableView.h
	ImageLoader.h
	models/ReportListModel.h
	services/FirestoreService.h
	services/FirestoreServiceImpl.h
	services/StorageService.h
	services/StorageServiceImpl.h
	services/ReproductionManager.h
	services/ReproductionManagerImpl.h
	services/PreferenceManager.h
	services/ImageCacheManager.h
	widgets/ReportListItemDelegate.h
	widgets/ToastNotification.h
	)

# C sources
set( yabause_qt_SOURCES
	main.cpp
	QtYabause.cpp
	CommonDialogs.cpp
	PerQt.c
	GetPin.cpp
	ui/UIYabause.cpp
	ui/UISettings.cpp
	ui/UIAbout.cpp
	ui/UICheats.cpp
	ui/UICheatAR.cpp
	ui/UICheatRaw.cpp
	ui/UICheatSearch.cpp
	ui/UIBackupRam.cpp
	ui/UIPortManager.cpp
	ui/UIControllerSetting.cpp
	ui/UIPadSetting.cpp
	ui/UI3DControlPadSetting.cpp
    ui/UIWheelSetting.cpp
    ui/UIMissionStickSetting.cpp
    ui/UIDoubleMissionStickSetting.cpp
	ui/UIGunSetting.cpp
	ui/UIMouseSetting.cpp
	ui/UIShortcutManager.cpp
    ui/UIDebugCPU.cpp
    ui/UIDebugM68K.cpp
    ui/UIDebugSCSP.cpp
    ui/UIDebugSCSPChan.cpp
    ui/UIDebugSCSPDSP.cpp
    ui/UIDebugSCSPGraph.cpp
    ui/UIDebugSCUDSP.cpp
    ui/UIDebugSH2.cpp
    ui/UIDebugVDP1.cpp
    ui/UIDebugVDP2.cpp
    ui/UIDebugVDP2Viewer.cpp
    ui/UIDisasm.cpp
    ui/UIHexInput.cpp
    ui/UIMemoryTransfer.cpp
    ui/UIHexEditor.cpp
    ui/UIMemoryEditor.cpp
	ui/UIMemorySearch.cpp
	ui/WebLoginWindow.cpp
    filesearchwidget.cpp
    filesearchworker.cpp
    qprogressindicator.cpp
	Settings.cpp
	VolatileSettings.cpp
	YabauseThread.cpp
	QGameInfo.cpp
	GameInfoCache.cpp
#	GameItemDelegate.cpp
	Arguments.cpp
	GameTableView.cpp
	ImageLoader.cpp
	models/ReportData.cpp
	models/AttachmentMetadata.cpp
	models/ReproductionSession.cpp
	models/ReportListModel.cpp
	services/FirestoreService.cpp
	services/FirestoreServiceImpl.cpp
	services/StorageService.cpp
	services/StorageServiceImpl.cpp
	services/ReproductionManager.cpp
	services/ReproductionManagerImpl.cpp
	services/PreferenceManager.cpp
	services/ImageCacheManager.cpp
	ui/UIReportList.cpp
	widgets/ReportListItemDelegate.cpp
	widgets/ToastNotification.cpp
	)

if( OPENGL_FOUND )
	set( yabause_qt_SOURCES ${yabause_qt_SOURCES} YabauseGL.cpp )
else()
	set( yabause_qt_SOURCES ${yabause_qt_SOURCES} YabauseSoftGL.cpp )
endif()

if (YAB_WANT_VULKAN)
#set( yabause_qt_SOURCES ${yabause_qt_SOURCES} ../vulkan/Window_glfw.cpp )
set( yabause_qt_SOURCES ${yabause_qt_SOURCES} QYabVulkanWidget.cpp QYabVulkanWidget.h )
endif()

QT6_ADD_RESOURCES( yabause_qt_RCC_RESOURCES ${yabause_qt_RESOURCES} )
QT6_WRAP_UI( yabause_qt_UI_FORMS ${yabause_qt_FORMS} )
QT6_WRAP_CPP( yabause_qt_MOC_SOURCES ${yabause_qt_MOC_HEADERS} )

set( yabause_qt_SOURCES ${yabause_qt_SOURCES} resources/icons/yabause.icns )
set_source_files_properties( resources/icons/yabause.icns PROPERTIES MACOSX_PACKAGE_LOCATION Resources )

add_executable( yabause-qt WIN32
	${yabause_qt_windows_SOURCES}
	${yabause_qt_windows_RESOURCES}
	${yabause_qt_RCC_RESOURCES}
	${yabause_qt_HEADERS}
	${yabause_qt_MOC_HEADERS}
	${yabause_qt_SOURCES}
	${yabause_qt_UI_FORMS}
	${yabause_qt_MOC_SOURCES} )


include_directories(
	.
	${CMAKE_CURRENT_BINARY_DIR}
	${CMAKE_CURRENT_SOURCE_DIR}/ui
	${Qt6Widgets_INCLUDE_DIRS}
	${Qt6OpenGL_INCLUDE_DIRS} 
	${Qt6Multimedia_INCLUDE_DIRS} )

if ("${CMAKE_SYSTEM_NAME}" STREQUAL "Linux")
  # git clone https://github.com/firebase/firebase-cpp-sdk.git -b v6.11.0 yabause/src/qt/firebase-cpp-sdk
	add_subdirectory( firebase-cpp-sdk )
	set( FIREBASE_TARGETS firebase_app firebase_auth firebase_storage firebase_database firebase_firestore)
else()
  # SET var=%cd%
	# bitsadmin.exe /TRANSFER htmlget https://dl.google.com/firebase/sdk/cpp/firebase_cpp_sdk_6.11.0.zip %var%\a.zip
	# tar -v -xf a.zip -C yabause\src\qt\
	#set(MSVC_RUNTIME_MODE MT)
	set(MSVC_RUNTIME_MODE MD)
	add_subdirectory( firebase_cpp_sdk )
	set( FIREBASE_TARGETS firebase_app firebase_auth firebase_storage firebase_database firebase_firestore)
	include_directories(${zlib_INCLUDE_DIR})
endif()

# RetroAchievements support
option(HAVE_RETROACHIEVEMENTS "Enable RetroAchievements support" ON)
if(HAVE_RETROACHIEVEMENTS)
    add_subdirectory(../retroachievements retroachievements)
endif()

# APPLE // not necessary mac os x, but i don't care ;)
if (APPLE)
	set_target_properties( yabause-qt PROPERTIES MACOSX_BUNDLE true )
	set_target_properties( yabause-qt PROPERTIES MACOSX_BUNDLE_ICON_FILE yabause.icns )
	set_target_properties( yabause-qt PROPERTIES MACOSX_BUNDLE_LONG_VERSION_STRING "${YAB_VERSION}" )
	set_target_properties( yabause-qt PROPERTIES MACOSX_BUNDLE_BUNDLE_NAME Yabause )
	set_target_properties( yabause-qt PROPERTIES MACOSX_BUNDLE_SHORT_VERSION_STRING "${YAB_VERSION}" )
	set_target_properties( yabause-qt PROPERTIES MACOSX_BUNDLE_COPYRIGHT "(c) Yabause Team" )
endif (APPLE)

# Add RetroAchievements dependencies
if(HAVE_RETROACHIEVEMENTS)
    add_dependencies( yabause-qt yabause_retroachievements rcheevos)
	target_sources( yabause-qt PRIVATE $<TARGET_OBJECTS:yabause_retroachievements> $<TARGET_OBJECTS:rcheevos>)	
endif()


target_link_libraries( yabause-qt yabause )
target_link_libraries( yabause-qt ${YABAUSE_LIBRARIES} )
target_link_libraries( yabause-qt ${PORT_LIBRARIES} )
target_link_libraries( yabause-qt ${yabause_qt_windows_LIBRARIES} )
target_link_libraries( yabause-qt ${yabause_qt_macosx_LIBRARIES} )
target_link_libraries( yabause-qt ${LIBCHDR_LIBRARIES} )
# zlib is already included in YABAUSE_LIBRARIES via find_package(ZLIB)
# target_link_libraries( yabause-qt ${zlib_STATIC_LIBRARIES} )

include_directories(${ICU_INCLUDE_DIR})

target_link_libraries(yabause-qt ${ICU_LIBRARY_DIR}/icuuc.lib ${ICU_LIBRARY_DIR}/icuin.lib ${ICU_LIBRARY_DIR}/icudt.lib)

# OpenSSL for https
if(WIN32) 

include_directories( ${CMAKE_CURRENT_SOURCE_DIR}/include )

# 64bit
if(CMAKE_SIZEOF_VOID_P EQUAL 8)
	target_link_libraries( yabause-qt ${CMAKE_CURRENT_SOURCE_DIR}/lib/x64/libssl.lib)
	target_link_libraries( yabause-qt ${CMAKE_CURRENT_SOURCE_DIR}/lib/x64/libcrypto.lib)
else()
	target_link_libraries( yabause-qt ${CMAKE_CURRENT_SOURCE_DIR}/lib/x86/libssl-1_1.lib)
	target_link_libraries( yabause-qt ${CMAKE_CURRENT_SOURCE_DIR}/lib/x86/libcrypto-1_1.lib)
endif()

# WinSparkle
include_directories( ${CMAKE_CURRENT_SOURCE_DIR}/winsparkle/include )

if(CMAKE_SIZEOF_VOID_P EQUAL 8)
	target_link_libraries( yabause-qt ${CMAKE_CURRENT_SOURCE_DIR}/winsparkle/x64/Release/WinSparkle.lib)
else()
	target_link_libraries( yabause-qt ${CMAKE_CURRENT_SOURCE_DIR}/winsparkle/Release/WinSparkle.lib)
endif()



else()
	
  find_package(OpenSSL REQUIRED) 
	if( OpenSSL_FOUND )
		include_directories(${OPENSSL_INCLUDE_DIRS})
		link_directories(${OPENSSL_LIBRARIES})
		message(STATUS "Using OpenSSL ${OPENSSL_VERSION}")
		target_link_libraries(yabause-qt ${OPENSSL_LIBRARIES})
  endif()

endif()

target_link_libraries( yabause-qt
	${Qt6Widgets_LIBRARIES}
	${Qt6OpenGL_LIBRARIES}
	${Qt6OpenGLWidgets_LIBRARIES}
	${Qt6Core_QTMAIN_LIBRARIES}
	${Qt6Multimedia_LIBRARIES}
	${Qt6Network_LIBRARIES})

target_link_libraries( yabause-qt ${FIREBASE_TARGETS} )

if (YAB_WANT_VULKAN)
	target_link_libraries( yabause-qt ${GLFW_LIBRARIES} ${LIBVULKAN} ${SHADERC_LIBRARIES} )
endif()

yab_port_success(yabause-qt)

# copy need files for running
if(WIN32)


add_custom_command(
	TARGET yabause-qt
	POST_BUILD
	COMMAND ${QT_BINARY_DIR}/windeployqt.exe ${CMAKE_CURRENT_BINARY_DIR}/$<CONFIGURATION>/${YAB_PORT_NAME}.exe
)

endif()

configure_file(yabause.desktop.in ${YAB_PORT_NAME}.desktop)

if (WIN32)
	install(TARGETS yabause-qt DESTINATION ".")

	install(FILES ${ICU_BIN_DIR}/icuuc76.dll DESTINATION ".")
	install(FILES ${ICU_BIN_DIR}/icuin76.dll DESTINATION ".")
	install(FILES ${ICU_BIN_DIR}/icudt76.dll DESTINATION ".")

	if(CMAKE_SIZEOF_VOID_P EQUAL 8)
		install( FILES ${CMAKE_CURRENT_SOURCE_DIR}/winsparkle/x64/Release/WinSparkle.dll DESTINATION ".")
	else()
		install( FILES ${CMAKE_CURRENT_SOURCE_DIR}/winsparkle/Release/WinSparkle.dll DESTINATION ".")
	endif()

	set_property(INSTALL $<TARGET_FILE_NAME:yabause-qt>
		PROPERTY CPACK_START_MENU_SHORTCUTS "Yaba Sanshiro"
	)
#	if (GLUT_FOUND)
#		install(FILES ${GLUT_INCLUDE_DIR}/../freeglut.dll DESTINATION ".")
#	endif ()
	if (SDL_FOUND)
		get_filename_component(SDL_BINARY_DIR ${SDL_LIBRARY} PATH)
		install(DIRECTORY ${SDL_BINARY_DIR}/
			DESTINATION "."
			FILES_MATCHING PATTERN "SDL.dll")
	endif ()
	if (SDL2_FOUND)
		if (NOT MSYS2_BUILD)
			get_filename_component(SDL2_BINARY_DIR ${SDL2_LIBRARY} PATH)
			install(DIRECTORY ${SDL2_BINARY_DIR}/
				DESTINATION "."
				FILES_MATCHING PATTERN "SDL2.dll")
		else ()
			install(FILES ${QT_BINARY_DIR}/SDL2.dll DESTINATION ".")
		endif ()
	endif ()
	install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/$<CONFIGURATION>/ DESTINATION "." )

	#install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/../../AUTHORS    DESTINATION "." RENAME AUTHORS.txt)
	#install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/../../ChangeLog  DESTINATION "." RENAME ChangeLog.txt)
	install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/../../COPYING.txt    DESTINATION "." RENAME COPYING.txt)
	install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/../../../win_template/readme.txt     DESTINATION "." RENAME README.txt)
	install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/settings.ini     DESTINATION "." RENAME settings.ini)
	#install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/../../README.WIN DESTINATION "." RENAME README.WIN.txt)
	#install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/donate.png DESTINATION "." )
	#install(FILES c:/bin/libeay32.dll DESTINATION "." )
	#install(FILES c:/bin/ssleay32.dll DESTINATION "." )
	
	if (MINGW)
		get_filename_component( Mingw_Path ${CMAKE_CXX_COMPILER} PATH )
		if("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "x86_64" OR "${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "AMD64")
			install(DIRECTORY ${Mingw_Path}/
				DESTINATION "."
				FILES_MATCHING PATTERN "libgcc_s_*.dll" PATTERN "libstdc++-*.dll" PATTERN "libwinpthread-*.dll")
		else()
			install(DIRECTORY ${Mingw_Path}/
				DESTINATION "."
				FILES_MATCHING PATTERN "libgcc_s_*.dll" PATTERN "mingwm10.dll")
		endif()
	endif ()

	if (YAB_USE_SSF AND ZLIB_FOUND)
		if (NOT MSYS2_BUILD)
			install(FILES ${ZLIB_INCLUDE_DIRS}/../zlib1.dll DESTINATION ".")
		else()
			install(FILES ${QT_BINARY_DIR}/zlib1.dll DESTINATION ".")
		endif()
	endif()
	
    if (MSVC)    
      set (CMAKE_EXE_LINKER_FLAGS /SAFESEH:NO )
    endif (MSVC)
	
else ()
	install(TARGETS yabause-qt DESTINATION "bin")
	install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${YAB_PORT_NAME}.desktop DESTINATION "share/applications")
	#install(FILES "doc/yabause.1" DESTINATION "${YAB_MAN_DIR}/man1" RENAME "${YAB_PORT_NAME}.1")
	install(FILES "resources/icons/yabasanshiro.png" DESTINATION "share/pixmaps/")
endif ()


