cmake_minimum_required(VERSION 3.20)
project(RenpyThiefInjector LANGUAGES CXX RC)

set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

# Qt auto-processing
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTORCC ON)

# Qt5 path — override in CLion: File > Settings > Build > CMake > CMake options
#   -DCMAKE_PREFIX_PATH=C:/Qt/5.15.2/msvc2019_64   (for x64)
#   -DCMAKE_PREFIX_PATH=C:/Qt/5.15.2/msvc2019      (for x86)
if(NOT DEFINED CMAKE_PREFIX_PATH)
    if(CMAKE_SIZEOF_VOID_P EQUAL 8)
        set(CMAKE_PREFIX_PATH "C:/Qt/5.15.2/msvc2019_64")
    else()
        set(CMAKE_PREFIX_PATH "C:/Qt/5.15.2/msvc2019")
    endif()
endif()

find_package(Qt5 REQUIRED COMPONENTS Core Gui Widgets Network)

set(SOURCES
    main.cpp
    RenpyThiefInjector.cpp
    HookResultWindow.cpp
    InjectorDialog.cpp
    TextFinder.cpp
    AppMessageBox.cpp
    extension.cpp
    hookcode.cpp
    host.cpp
    texthost.cpp
    textthread.cpp
    dllmain.cpp
    pch.cpp
)

set(HEADERS
    RenpyThiefInjector.h
    HookResultWindow.h
    InjectorDialog.h
    TextFinder.h
    AppMessageBox.h
    common.h
    const.h
    defs.h
    extension.h
    hookcode.h
    host.h
    module.h
    pch.h
    resource.h
    texthook.h
    texthost.h
    textthread.h
    types.h
)

set(UI_FILES
    RenpyThiefInjector.ui
    HookResultWindow.ui
    InjectorDialog.ui
    TextFinder.ui
)

set(QRC_FILES
    RenpyThiefInjector.qrc
    InjectorDialog.qrc
    TextFinder.qrc
)

add_executable(RenpyThiefInjector WIN32
    ${SOURCES}
    ${HEADERS}
    ${UI_FILES}
    ${QRC_FILES}
    RenpyThiefInjector.rc
)

target_include_directories(RenpyThiefInjector PRIVATE
    ${CMAKE_CURRENT_SOURCE_DIR}
)

target_link_libraries(RenpyThiefInjector PRIVATE
    Qt5::Core
    Qt5::Gui
    Qt5::Widgets
    Qt5::Network
    psapi
    user32
    kernel32
)

target_compile_definitions(RenpyThiefInjector PRIVATE
    UNICODE
    _UNICODE
)

# /utf-8: treat source and output as UTF-8 (required for Chinese/Unicode string literals in MSVC)
if(MSVC)
    target_compile_options(RenpyThiefInjector PRIVATE /utf-8)
endif()

# Static CRT: /MT (Release) / /MTd (Debug) — prevents "flash and close" on machines without VC++ Redist
set_target_properties(RenpyThiefInjector PROPERTIES
    MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>"
)

# UAC: require administrator privileges
if(MSVC)
    target_link_options(RenpyThiefInjector PRIVATE
        "/MANIFESTUAC:level='requireAdministrator' uiAccess='false'"
    )
endif()

if(CMAKE_SIZEOF_VOID_P EQUAL 8)
    set_target_properties(RenpyThiefInjector PROPERTIES OUTPUT_NAME "RenpyInjector-x64")
else()
    set_target_properties(RenpyThiefInjector PROPERTIES OUTPUT_NAME "RenpyInjector-x86")
endif()