# Project
cmake_minimum_required(VERSION 3.14...3.22 FATAL_ERROR)
project(rapidcsv VERSION 1.0 LANGUAGES CXX)
set (CMAKE_CXX_STANDARD 11)
if(MSVC)
  if(CMAKE_CXX_FLAGS MATCHES "/W[0-4]")
    string(REGEX REPLACE "/W[0-4]" "/W4" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
  else()
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W4")
  endif()
  add_compile_options("/utf-8")
else()
  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -Wall -Wextra -Wpedantic -Wshadow -Wpointer-arith \
                       -Wcast-qual -Wno-missing-braces -Wswitch-default -Wcast-align \
                       -Wunreachable-code -Wundef -Wuninitialized -Wold-style-cast \
                       -Wsign-conversion -Weffc++")
endif()

# Build type
set(DEFAULT_BUILD_TYPE "Release")
if((EXISTS "${CMAKE_SOURCE_DIR}/.svn") OR (EXISTS "${CMAKE_SOURCE_DIR}/.git"))
  set(DEFAULT_BUILD_TYPE "Debug")
endif()
if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
  message(STATUS "Using build type '${DEFAULT_BUILD_TYPE}' (default).")
  set(CMAKE_BUILD_TYPE "${DEFAULT_BUILD_TYPE}")
else()
  message(STATUS "Using build type '${CMAKE_BUILD_TYPE}'.")
endif()

# Library
add_library(rapidcsv INTERFACE)
target_include_directories(rapidcsv INTERFACE src)

# Tests
option(RAPIDCSV_BUILD_TESTS "Build tests" OFF)
message(STATUS "Build tests: ${RAPIDCSV_BUILD_TESTS}")
if(RAPIDCSV_BUILD_TESTS)

  # Test init
  include(CTest)
  enable_testing()

  # Ccache
  find_program(CCACHE_PROGRAM ccache)
  if(CCACHE_PROGRAM)
    message(STATUS "Found ccache")
    set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE "${CCACHE_PROGRAM}")
  endif()

  # Enable codecvt tests if supported
  if (CMAKE_CXX_STANDARD VERSION_LESS "17")
    include(CheckIncludeFileCXX)
    check_include_file_cxx(codecvt HAS_CODECVT)
    if(HAS_CODECVT)
      target_compile_definitions(rapidcsv INTERFACE HAS_CODECVT)
    endif()
  else()
    message(STATUS "Skip check for C++ include codecvt - C++${CMAKE_CXX_STANDARD}")
  endif()

  # Test macro add_perf_test
  macro(add_perf_test testname)
    if(CMAKE_BUILD_TYPE MATCHES "Release")
      FILE(GLOB sources tests/${testname}*.cpp)
      add_executable(${testname} ${sources})
      add_test(NAME ${testname} COMMAND "${PROJECT_BINARY_DIR}/${testname}")
      target_link_libraries(${testname} PUBLIC rapidcsv)
    endif()
  endmacro(add_perf_test)

  # Test macro add_unit_test
  macro(add_unit_test testname)
    if(CMAKE_BUILD_TYPE MATCHES "Debug")
      FILE(GLOB sources tests/${testname}*.cpp)
      add_executable(${testname} ${sources})
      add_test(NAME ${testname} COMMAND "${PROJECT_BINARY_DIR}/${testname}")
      target_link_libraries(${testname} PUBLIC rapidcsv)
    endif()
  endmacro(add_unit_test)

  # Unit tests
  add_unit_test(test001)
  add_unit_test(test002)
  add_unit_test(test003)
  add_unit_test(test004)
  add_unit_test(test005)
  add_unit_test(test006)
  add_unit_test(test007)
  add_unit_test(test008)
  add_unit_test(test009)
  add_unit_test(test010)
  add_unit_test(test011)
  add_unit_test(test012)
  add_unit_test(test013)
  add_unit_test(test014)
  add_unit_test(test015)
  add_unit_test(test016)
  add_unit_test(test017)
  add_unit_test(test018)
  add_unit_test(test019)
  add_unit_test(test020)
  add_unit_test(test021)
  add_unit_test(test022)
  add_unit_test(test023)
  add_unit_test(test024)
  add_unit_test(test025)
  add_unit_test(test026)
  add_unit_test(test027)
  add_unit_test(test028)
  add_unit_test(test029)
  add_unit_test(test030)
  add_unit_test(test031)
  add_unit_test(test032)
  add_unit_test(test033)
  add_unit_test(test034)
  add_unit_test(test035)
  add_unit_test(test036)
  add_unit_test(test037)
  add_unit_test(test038)
  add_unit_test(test039)
  add_unit_test(test040)
  add_unit_test(test041)
  add_unit_test(test042)
  add_unit_test(test043)
  add_unit_test(test044)
  add_unit_test(test045)
  add_unit_test(test046)
  add_unit_test(test047)
  add_unit_test(test048)
  add_unit_test(test049)
  add_unit_test(test050)
  add_unit_test(test051)
  add_unit_test(test052)
  add_unit_test(test053)
  add_unit_test(test054)
  add_unit_test(test055)
  add_unit_test(test056)
  if(HAS_CODECVT)
    add_unit_test(test057)
    add_unit_test(test058)
    add_unit_test(test059)
    add_unit_test(test060)
  endif()
  add_unit_test(test061)
  add_unit_test(test062)
  add_unit_test(test063)
  add_unit_test(test064)
  add_unit_test(test065)
  add_unit_test(test066)
  add_unit_test(test067)
  add_unit_test(test068)
  add_unit_test(test069)
  add_unit_test(test070)
  add_unit_test(test071)
  add_unit_test(test072)
  add_unit_test(test073)
  add_unit_test(test074)
  add_unit_test(test075)
  add_unit_test(test076)
  add_unit_test(test077)
  add_unit_test(test078)
  add_unit_test(test079)
  add_unit_test(test080)
  add_unit_test(test081)
  add_unit_test(test082)
  add_unit_test(test083)
  add_unit_test(test084)
  if(HAS_CODECVT)
    add_unit_test(test085)
  endif()
  add_unit_test(test086)
  add_unit_test(test087)
  add_unit_test(test088)
  add_unit_test(test089)
  add_unit_test(test090)
  add_unit_test(test091)
  add_unit_test(test092)
  add_unit_test(test093)
  add_unit_test(test094)
  add_unit_test(test095)
  add_unit_test(test096)
  add_unit_test(test097)
  add_unit_test(test098)

  # perf tests
  add_perf_test(ptest001)
  add_perf_test(ptest002)

  # Examples
  # Test macro add_example
  macro(add_example testname)
    if(CMAKE_BUILD_TYPE MATCHES "Debug")
      add_executable(${testname} examples/${testname}.cpp)
      target_link_libraries(${testname} PUBLIC rapidcsv)
    endif()
  endmacro(add_example)

  add_example(ex001 examples/ex001.cpp)
  add_example(ex002 examples/ex002.cpp)
  add_example(ex003 examples/ex003.cpp)
  add_example(ex004 examples/ex004.cpp)
  add_example(ex005 examples/ex005.cpp)
  add_example(ex006 examples/ex006.cpp)
  add_example(ex007 examples/ex007.cpp)
  add_example(ex008 examples/ex008.cpp)
  add_example(ex009 examples/ex009.cpp)

endif()

# Install / Uninstall targets for standalone rapidcsv build
if(CMAKE_SOURCE_DIR STREQUAL PROJECT_SOURCE_DIR)
  message(STATUS "Install/uninstall targets enabled.")

  # Install
  install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/src/rapidcsv.h DESTINATION include)

  # Uninstall
  add_custom_target(uninstall COMMAND "${CMAKE_COMMAND}" -E remove "${CMAKE_INSTALL_PREFIX}/include/rapidcsv.h"
)
else()
  message(STATUS "Install/uninstall targets disabled.")
endif()
