cmake_minimum_required(VERSION 3.10)
project(TerraVisor)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

# Find packages using vcpkg
find_package(GLEW CONFIG REQUIRED)
find_package(glfw3 CONFIG REQUIRED)
find_package(glm CONFIG REQUIRED)
find_package(assimp CONFIG REQUIRED)

# Direct linking to FreeImage libraries for now
if (WIN32)
  set(FreeImage_INCLUDE_DIR $ENV{VCPKG_ROOT}/packages/freeimage_x64-windows/include)
  set(FreeImage_LIBRARIES $ENV{VCPKG_ROOT}/packages/freeimage_x64-windows/lib/FreeImage.lib)
elseif (UNIX)
  set(FreeImage_INCLUDE_DIR $ENV{VCPKG_ROOT}/packages/freeimage_x64-linux/include)
  set(FreeImage_LIBRARIES $ENV{VCPKG_ROOT}/packages/freeimage_x64-linux/lib/libFreeImage.a)
endif()

# Set Debug and Release directories
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG "${CMAKE_BINARY_DIR}")
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE "${CMAKE_BINARY_DIR}")

# Add source files
file(GLOB_RECURSE SOURCES "${CMAKE_SOURCE_DIR}/source/*.cpp")
file(GLOB_RECURSE HEADERS "${CMAKE_SOURCE_DIR}/include/*.h")
file(GLOB SHADERS "${CMAKE_SOURCE_DIR}/shaders/*.glsl")
file(GLOB IMGUI_SOURCES
  "${CMAKE_SOURCE_DIR}/imgui/*.cpp"
  "${CMAKE_SOURCE_DIR}/imgui/backends/imgui_impl_glfw.cpp"
  "${CMAKE_SOURCE_DIR}/imgui/backends/imgui_impl_opengl3.cpp"
)

# Add the executable
add_executable(TerraVisor ${SOURCES} ${HEADERS} ${IMGUI_SOURCES})

# Include directories (handled by find_package now)
include_directories(
  ${CMAKE_SOURCE_DIR}/include
  ${CMAKE_SOURCE_DIR}/imgui
  ${CMAKE_SOURCE_DIR}/imgui/backends
  ${FreeImage_INCLUDE_DIR}
)

# Link libraries using vcpkg
target_link_libraries(TerraVisor PRIVATE GLEW::GLEW glfw glm::glm assimp::assimp ${FreeImage_LIBRARIES})

# Custom targets
add_custom_target(copy_shaders ALL
  COMMAND ${CMAKE_COMMAND} -E copy_directory
  ${CMAKE_SOURCE_DIR}/shaders ${CMAKE_BINARY_DIR}/shaders
)
add_custom_target(copy_hgt ALL
  COMMAND ${CMAKE_COMMAND} -E copy_directory
  ${CMAKE_SOURCE_DIR}/hgt ${CMAKE_BINARY_DIR}/hgt
)

# Set subsystem based on build type
if (WIN32)
    if (CMAKE_BUILD_TYPE STREQUAL "Release")
        set_target_properties(TerraVisor PROPERTIES LINK_FLAGS "-Wl,--subsystem,windows")
    else()
        set_target_properties(TerraVisor PROPERTIES LINK_FLAGS "-Wl,--subsystem,console")
    endif()
endif()

# Ensure shaders are copied before building the executable
add_dependencies(TerraVisor copy_shaders copy_hgt)
