cmake_minimum_required(VERSION 3.16)
project(RISCB C)

set(CMAKE_C_STANDARD 23)

find_package(PkgConfig REQUIRED)

# Allow setting the target platform manually
if (NOT DEFINED TARGET_PLATFORM)
    if (WIN32)
        set(TARGET_PLATFORM windows)
    elseif (UNIX)
        set(TARGET_PLATFORM linux)
    else ()
        message(FATAL_ERROR "Unsupported platform. Please set TARGET_PLATFORM manually.")
    endif ()
endif ()

message(STATUS "Target platform: ${TARGET_PLATFORM}")

# Detect build type and configure SDL2 paths accordingly
if (TARGET_PLATFORM STREQUAL "windows")
    find_package(SDL2 REQUIRED)
    find_package(SDL2_ttf REQUIRED)
    include_directories(${SDL2_INCLUDE_DIRS})
    link_directories(${SDL2_LIBRARY_DIRS})
    add_definitions(${SDL2_CFLAGS_OTHER})

elseif (TARGET_PLATFORM STREQUAL "windows-static")
    # Cross-compile static Windows build using MinGW
    set(CMAKE_C_COMPILER x86_64-w64-mingw32-gcc)
    set(CMAKE_RC_COMPILER x86_64-w64-mingw32-windres)
    set(CMAKE_FIND_ROOT_PATH /usr/local/x86_64-w64-mingw32)

    # Ensure static linking
    set(CMAKE_EXE_LINKER_FLAGS "-static -static-libgcc -static-libstdc++ -mwindows")

    include_directories(
            /usr/local/x86_64-w64-mingw32/include
            /usr/local/x86_64-w64-mingw32/include/SDL2
    )
    link_directories(
            /usr/local/x86_64-w64-mingw32/lib
    )

    add_definitions(-DSDL_MAIN_HANDLED)

elseif (TARGET_PLATFORM STREQUAL "mingw")
    # Cross-compile dynamically linked Windows build
    set(CMAKE_C_COMPILER x86_64-w64-mingw32-gcc)
    set(CMAKE_RC_COMPILER x86_64-w64-mingw32-windres)
    find_package(SDL2 REQUIRED)
    find_package(SDL2_ttf REQUIRED)
    include_directories(${SDL2_INCLUDE_DIRS})
    link_directories(${SDL2_LIBRARY_DIRS})
    add_definitions(${SDL2_CFLAGS_OTHER})

elseif (TARGET_PLATFORM STREQUAL "linux")
    pkg_check_modules(SDL2 REQUIRED sdl2)
    pkg_check_modules(SDL2_TTF REQUIRED SDL2_ttf)
    include_directories(${SDL2_INCLUDE_DIRS})
    add_definitions(${SDL2_CFLAGS_OTHER})

else ()
    message(FATAL_ERROR "Unsupported TARGET_PLATFORM: ${TARGET_PLATFORM}")
endif ()

# Define source files
set(SOURCE_FILES
        main.c
        util/font.c util/font.h
        assembler/assembler.c assembler/assembler.h
        cpu/memory.c cpu/memory.h
        cpu/core.c cpu/core.h
        util/texteditor.c util/texteditor.h
        util/hexdump.c util/hexdump.h
        util/cpustatusui.c util/cpustatusui.h
        peripherals/audio.c
        peripherals/audio.h
        peripherals/peripheraldata.c
        peripherals/peripheraldata.h
        peripherals/sevenseg.c
        peripherals/sevenseg.h
        peripherals/switches.c
        peripherals/switches.h
)

# Build the target executable
add_executable(RISCB ${SOURCE_FILES})

# Link libraries
if (TARGET_PLATFORM STREQUAL "windows-static")
    target_link_libraries(RISCB mingw32 SDL2main SDL2 SDL2_ttf freetype -static)
else ()
    target_link_libraries(RISCB SDL2 SDL2_ttf m)
endif ()

# Cross-compile Windows executable on Unix
if (UNIX AND TARGET_PLATFORM STREQUAL "windows-static")
    add_executable(RISCB_WIN32 ${SOURCE_FILES})
    set_target_properties(RISCB_WIN32 PROPERTIES COMPILE_FLAGS "-mwindows")
    add_definitions(-DSDL_MAIN_HANDLED)
    target_link_libraries(RISCB mingw32 /usr/local/x86_64-w64-mingw32/lib/libSDL2main.a /usr/local/x86_64-w64-mingw32/lib/libSDL2.a /usr/local/x86_64-w64-mingw32/lib/libSDL2_ttf.dll.a /usr/local/x86_64-w64-mingw32/lib/libfreetype.a /usr/local/x86_64-w64-mingw32/lib/libSDL2_test.a -static setupapi rpcrt4 imm32 oleaut32 version ole32 winmm )
endif ()