cmake_minimum_required(VERSION 3.16)
project(arasan-gui-qt CXX)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

if(NOT CMAKE_BUILD_TYPE)
  set(CMAKE_BUILD_TYPE Release)
endif()

set(ARASAN_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../26_1 CACHE PATH "Arasan source tree")
get_filename_component(ARASAN_DIR ${ARASAN_DIR} ABSOLUTE)
set(ENGINE_SRC ${ARASAN_DIR}/src)

add_library(arasan_chess STATIC
  ${ENGINE_SRC}/attacks.cpp
  ${ENGINE_SRC}/bhash.cpp
  ${ENGINE_SRC}/bitutil.cpp
  ${ENGINE_SRC}/board.cpp
  ${ENGINE_SRC}/boardio.cpp
  ${ENGINE_SRC}/chess.cpp
  ${ENGINE_SRC}/chessio.cpp
  ${ENGINE_SRC}/eco.cpp
  ${ENGINE_SRC}/epdrec.cpp
  ${ENGINE_SRC}/legal.cpp
  ${ENGINE_SRC}/material.cpp
  ${ENGINE_SRC}/movearr.cpp
  ${ENGINE_SRC}/movegen.cpp
  ${ENGINE_SRC}/notation.cpp
  ${ENGINE_SRC}/searchc.cpp
  ${ENGINE_SRC}/see.cpp
  core/engineglue.cpp
)
target_include_directories(arasan_chess PUBLIC ${ENGINE_SRC} ${ENGINE_SRC}/nnue)
target_compile_definitions(arasan_chess PUBLIC ARASAN_VERSION=26.1 _64BIT USE_INTRINSICS)
if(CMAKE_SYSTEM_PROCESSOR MATCHES "86|AMD64")
  target_compile_definitions(arasan_chess PUBLIC SIMD SSE2)
  target_compile_options(arasan_chess PUBLIC -msse2)
endif()

add_library(arasan_gui_core STATIC
  core/clock.cpp
  core/disphint.cpp
  core/enginelink.cpp
  core/game.cpp
  core/guiopts.cpp
  core/searchop.cpp
  core/timectrl.cpp
)
target_include_directories(arasan_gui_core PUBLIC core)
target_link_libraries(arasan_gui_core PUBLIC arasan_chess)

add_executable(core_test tests/core_test.cpp)
target_link_libraries(core_test PRIVATE arasan_gui_core)

find_package(Qt6 REQUIRED COMPONENTS Core Gui Widgets Svg Test)

set(GUI_DIR ${ARASAN_DIR}/gui)
file(GLOB PIECE_FILES ${GUI_DIR}/pieces/*/*.svg)

add_library(arasan_gui_qt STATIC
  app/appearancedialog.cpp
  app/boardcolorsdialog.cpp
  app/boardwidget.cpp
  app/engineprocess.cpp
  app/infopanel.cpp
  app/mainwindow.cpp
  app/pieceset.cpp
  app/preferencesdialog.cpp
  app/searchlimitsdialog.cpp
)
set_target_properties(arasan_gui_qt PROPERTIES AUTOMOC ON)
target_include_directories(arasan_gui_qt PUBLIC app)
target_link_libraries(arasan_gui_qt PUBLIC arasan_gui_core Qt6::Core Qt6::Gui Qt6::Widgets Qt6::Svg)

add_executable(arasan-gui app/main.cpp)
target_link_libraries(arasan-gui PRIVATE arasan_gui_qt)
qt_add_resources(arasan-gui pieces PREFIX / BASE ${GUI_DIR} FILES ${PIECE_FILES})

add_executable(engine_test tests/engine_test.cpp)
target_link_libraries(engine_test PRIVATE arasan_gui_qt)

add_executable(view_test tests/view_test.cpp)
target_link_libraries(view_test PRIVATE arasan_gui_qt)
qt_add_resources(view_test pieces_test PREFIX / BASE ${GUI_DIR} FILES ${PIECE_FILES})

add_executable(play_test tests/play_test.cpp)
target_link_libraries(play_test PRIVATE arasan_gui_qt Qt6::Test)
qt_add_resources(play_test pieces_play PREFIX / BASE ${GUI_DIR} FILES ${PIECE_FILES})
