cmake_minimum_required(VERSION 3.16)
project(PonysayCPP LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/output")
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/output")
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/output")
set(CPACK_OUTPUT_FILE_PREFIX "${CMAKE_BINARY_DIR}/output")


# =======================
# Source and include folders
# =======================
include_directories(${CMAKE_SOURCE_DIR}/include)
file(GLOB_RECURSE HEADERS
	"${CMAKE_SOURCE_DIR}/include/*.hpp"
	"${CMAKE_SOURCE_DIR}/include/*.hxx")
file(GLOB SRC_FILES
	"${CMAKE_SOURCE_DIR}/src/*.cpp"
	"${CMAKE_SOURCE_DIR}/src/*.cxx")
file(GLOB SRC_FILES_PONYSAY
	"${CMAKE_SOURCE_DIR}/src/ponysay/*.cpp"
	"${CMAKE_SOURCE_DIR}/src/ponysay/*.cxx")
file(GLOB SRC_FILES_PONYSAY_CONVERT
	"${CMAKE_SOURCE_DIR}/src/ponysay-converter/*.cpp"
	"${CMAKE_SOURCE_DIR}/src/ponysay-converter/*.cxx")

set(PROJECT_NAME_CONVERT ${PROJECT_NAME}Converter)
set(PROJECT_NAME_LIB ${PROJECT_NAME}Lib)


# =======================
# Targets
# =======================
add_executable(${PROJECT_NAME} ${SRC_FILES_PONYSAY})
target_link_libraries(${PROJECT_NAME} PRIVATE ${PROJECT_NAME_LIB})
set_target_properties(${PROJECT_NAME} PROPERTIES OUTPUT_NAME "ponysay")

add_executable(${PROJECT_NAME_CONVERT} ${SRC_FILES_PONYSAY_CONVERT})
target_link_libraries(${PROJECT_NAME_CONVERT} PRIVATE ${PROJECT_NAME_LIB})
set_target_properties(${PROJECT_NAME_CONVERT} PROPERTIES OUTPUT_NAME "ponysay-converter")


# Build shared code as a static library
add_library(${PROJECT_NAME_LIB} STATIC ${HEADERS} ${SRC_FILES})
add_dependencies(${PROJECT_NAME} ${PROJECT_NAME_LIB})
add_dependencies(${PROJECT_NAME_CONVERT} ${PROJECT_NAME_LIB})


# =======================
# Platform-specific definitions
# =======================
if(CMAKE_BUILD_TYPE STREQUAL "Debug")
	message(STATUS "Building in Debug mode")
endif()
set(TARGETS ${PROJECT_NAME} ${PROJECT_NAME_CONVERT} ${PROJECT_NAME_LIB})
foreach(tgt IN LISTS TARGETS)
  if(WIN32)
    target_compile_definitions(${tgt} PRIVATE WINDOWS)
  elseif(UNIX)
    target_compile_definitions(${tgt} PRIVATE LINUX)
  else()
    message(FATAL_ERROR "Unsupported platform")
  endif()
	if(CMAKE_BUILD_TYPE STREQUAL "Debug")
    target_compile_definitions(${tgt} PRIVATE _DEBUG=1)
	endif()
endforeach()

# =======================
# Install rules (needed for packaging and normal installs)
# =======================
install(TARGETS ${PROJECT_NAME} ${PROJECT_NAME_CONVERT}
	RUNTIME DESTINATION bin
)

if(WIN32)
	install(DIRECTORY ${CMAKE_SOURCE_DIR}/resources/output/
		DESTINATION resources)
elseif(UNIX)
	install(DIRECTORY ${CMAKE_SOURCE_DIR}/resources/output/
		DESTINATION share/ponysaycpp)
endif()

include(CPack)

set(CPACK_PACKAGE_NAME "ponysaycpp")
set(CPACK_PACKAGE_VERSION "1.0.0")
set(CPACK_PACKAGE_CONTACT "arcane@arcanes-spoteh.com")
set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "A C++ program inspired by ponysay")
set(CPACK_PACKAGE_VENDOR "Arcane&Rosie")
set(CPACK_RESOURCE_FILE_README "${CMAKE_SOURCE_DIR}/README.md")


# Install prefix — typical for system packages
if(WIN32)
	set(CMAKE_INSTALL_PREFIX "$ENV{ProgramFiles}/${PROJECT_NAME}")
	set(CPACK_GENERATOR "WIX")
	
	
	string(RANDOM LENGTH 32 UUID_SEED)
	set(UPGRADE_GUID "152f361c-c9d2-42fc-960d-952a07ade1af")
	string(UUID PRODUCT_UUID TYPE MD5
    NAMESPACE "${UPGRADE_GUID}" NAME "${UUID_SEED}")
	message(STATUS "Generated Product GUID: ${PRODUCT_UUID}")
	set(CPACK_WIX_PRODUCT_GUID "${PRODUCT_UUID}")
	set(CPACK_WIX_UPGRADE_GUID "${UPGRADE_GUID}")
elseif(UNIX)
	set(CMAKE_INSTALL_PREFIX "/usr")
	set(CPACK_GENERATOR "TGZ;DEB;RPM")
	set(CPACK_DEBIAN_PACKAGE_MAINTAINER "Arcane Blackwood <arcane@arcanes-spoteh.com>")
	set(CPACK_DEBIAN_PACKAGE_DEPENDS "libc6 (>= 2.17)")
	set(CPACK_RPM_PACKAGE_LICENSE "GPLv3")
endif()

message(STATUS "CPack configured for ${CPACK_PACKAGE_NAME} ${CPACK_PACKAGE_VERSION}")