cmake_minimum_required(VERSION 3.26)

# Project definition
project(digftp
	VERSION 1.0.0
	DESCRIPTION "A modern FTP server with plugin support"
	LANGUAGES C CXX
)

# Global settings
set(APPNAME "digFTP")
include(GNUInstallDirs)

list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")

# C++ standard requirements
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)

# Build type configuration
if(NOT CMAKE_BUILD_TYPE)
	set(CMAKE_BUILD_TYPE "RelWithDebInfo" CACHE STRING "Choose the type of build" FORCE)
endif()

# Version handling
if(NOT CMAKE_BUILD_TYPE MATCHES "Release")
	if(NOT BUILD_VERSION)
		find_package(Git QUIET)
		if(GIT_FOUND AND EXISTS "${PROJECT_SOURCE_DIR}/.git")
			execute_process(
				COMMAND ${GIT_EXECUTABLE} rev-parse --short HEAD
				WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}"
				OUTPUT_VARIABLE BUILD_VERSION
				ERROR_QUIET
				OUTPUT_STRIP_TRAILING_WHITESPACE
			)
		else()
			set(BUILD_VERSION "unknown")
		endif()
	endif()
	set(VERSION "${BUILD_VERSION}")
endif()

# Compile Options
option(WITH_SSL "Compile with SSL support" ON)

# Path variables
set(CONFIG_PATH "${CMAKE_INSTALL_SYSCONFDIR}/${PROJECT_NAME}")
set(PLUGIN_PATH "${CMAKE_INSTALL_LIBDIR}/${PROJECT_NAME}/plugins")

# Configure build header
configure_file(
	"${PROJECT_SOURCE_DIR}/src/build.h.in"
	"${PROJECT_BINARY_DIR}/build.h"
	@ONLY
)

# Add compile definitions
add_compile_definitions(
	PLUGIN_DIR="${CMAKE_INSTALL_PREFIX}/${PLUGIN_PATH}"
	CONFIG_DIR="${CMAKE_INSTALL_PREFIX}/${CONFIG_PATH}"
	WITH_SSL=${WITH_SSL}
)

# Dependencies
find_package(Threads REQUIRED)
if(WITH_SSL)
	find_package(OpenSSL REQUIRED)
	include_directories(${OPENSSL_INCLUDE_DIR})
endif()

# Output directories
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin")
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib")

# Include directories
include_directories(${CMAKE_BINARY_DIR})

# Define plugins list
set(PLUGINS
	auth_pam
	auth_passdb
	filer_local
)

# Add main source directory which includes plugins
add_subdirectory(src)

# Installation
install(
	FILES 
		"${PROJECT_SOURCE_DIR}/conf/ftp.conf"
		"${PROJECT_SOURCE_DIR}/conf/motd"
	DESTINATION 
		"${CONFIG_PATH}"
)

install(
	TARGETS ${PROJECT_NAME}
	RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
)

install(
	TARGETS ${PLUGINS}
	LIBRARY DESTINATION ${PLUGIN_PATH}
)