cmake_minimum_required(VERSION 3.16)
project(TI84Emulator VERSION 0.1.0 LANGUAGES CXX)

# Set C++ standard
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)

# Set build type if not specified
if(NOT CMAKE_BUILD_TYPE)
    set(CMAKE_BUILD_TYPE Release)
endif()

# Compiler-specific options
if(MSVC)
    add_compile_options(/W4)
else()
    add_compile_options(-Wall -Wextra -Wpedantic)
    if(CMAKE_BUILD_TYPE STREQUAL "Debug")
        add_compile_options(-g -O0)
    else()
        add_compile_options(-O3)
    endif()
endif()

# Find required packages
find_package(SDL2 REQUIRED)

# Include directories
include_directories(src)
include_directories(${SDL2_INCLUDE_DIRS})

# Source files
set(CORE_SOURCES
    src/main.cpp
    src/cpu/z80.cpp
    src/cpu/z80_instructions.cpp
    src/memory/memory_manager.cpp
    src/display/lcd_controller.cpp
    src/input/keyboard.cpp
    src/ti84/ti84_emulator.cpp
    src/utils/rom_loader.cpp
)

# Header files
set(CORE_HEADERS
    src/cpu/z80.h
    src/memory/memory_manager.h
    src/display/lcd_controller.h
    src/input/keyboard.h
    src/ti84/ti84_emulator.h
    src/utils/rom_loader.h
    src/common/types.h
)

# Create console executable
add_executable(ti84-emulator ${CORE_SOURCES} ${CORE_HEADERS})

# Create GUI executable
add_executable(ti84-emulator-gui 
    src/main_gui.cpp
    # Use all core sources except the original main.cpp
    src/cpu/z80.cpp
    src/cpu/z80_instructions.cpp
    src/memory/memory_manager.cpp
    src/display/lcd_controller.cpp
    src/input/keyboard.cpp
    src/ti84/ti84_emulator.cpp
    src/utils/rom_loader.cpp
    ${CORE_HEADERS}
)

# Link libraries
target_link_libraries(ti84-emulator ${SDL2_LIBRARIES})
target_link_libraries(ti84-emulator-gui ${SDL2_LIBRARIES})

# On macOS, link additional frameworks
if(APPLE)
    find_library(COCOA_LIBRARY Cocoa)
    find_library(IOKIT_LIBRARY IOKit)
    find_library(COREVIDEO_LIBRARY CoreVideo)
    target_link_libraries(ti84-emulator ${COCOA_LIBRARY} ${IOKIT_LIBRARY} ${COREVIDEO_LIBRARY})
    target_link_libraries(ti84-emulator-gui ${COCOA_LIBRARY} ${IOKIT_LIBRARY} ${COREVIDEO_LIBRARY})
endif()

# Create test executable
enable_testing()
set(TEST_SOURCES
    tests/test_main.cpp
    # Add core sources except main.cpp
    src/cpu/z80.cpp
    src/cpu/z80_instructions.cpp
    src/memory/memory_manager.cpp
    src/display/lcd_controller.cpp
    src/input/keyboard.cpp
    src/ti84/ti84_emulator.cpp
    src/utils/rom_loader.cpp
)

add_executable(ti84-emulator-tests ${TEST_SOURCES})
target_link_libraries(ti84-emulator-tests ${SDL2_LIBRARIES})
if(APPLE)
    target_link_libraries(ti84-emulator-tests ${COCOA_LIBRARY} ${IOKIT_LIBRARY} ${COREVIDEO_LIBRARY})
endif()

add_test(NAME EmulatorTests COMMAND ti84-emulator-tests)

# Install rules
install(TARGETS ti84-emulator DESTINATION bin)

# Package configuration
set(CPACK_PROJECT_NAME ${PROJECT_NAME})
set(CPACK_PROJECT_VERSION ${PROJECT_VERSION})
include(CPack)