find_package(libmicrohttpd QUIET)

add_compile_definitions(
    WIN32_LEAN_AND_MEAN
    NOMINMAX
)

set(srvname "drawpile-srv")
set(srvlib "${srvname}lib")

add_executable(${srvname} main.cpp)
dp_sign_executable(${srvname})

add_library(${srvlib})

target_sources(${srvlib} PRIVATE
	database.cpp
	database.h
	dblog.cpp
	dblog.h
	extbans.cpp
	extbans.h
	initsys.h
	multiserver.cpp
	multiserver.h
	templatefiles.cpp
	templatefiles.h
	headless/configfile.cpp
	headless/configfile.h
	headless/headless.cpp
	headless/headless.h
)

# https://gitlab.kitware.com/cmake/cmake/-/issues/19813
if(UNIX)
	target_sources(${srvlib} PRIVATE
		headless/unixsignals.cpp
		headless/unixsignals.h
	)
endif()

target_link_libraries(${srvlib} PUBLIC
	cmake-config
	dpshared
	dpserver
	drawdance_server
	${QT_PACKAGE_NAME}::Core
	${QT_PACKAGE_NAME}::Network
)

target_link_libraries(${srvname} PRIVATE ${srvlib})

if(SERVERGUI)
	find_package(${QT_PACKAGE_NAME} REQUIRED COMPONENTS Gui Widgets)

	target_sources(${srvlib} PRIVATE
		gui/res/icon.svg
		gui/res/resources.qrc
		gui/accountdialog.ui
		gui/accountlistmodel.cpp
		gui/accountlistmodel.h
		gui/accountlistpage.cpp
		gui/accountlistpage.h
		gui/authdialog.cpp
		gui/authdialog.h
		gui/authdialog.ui
		gui/banlistmodel.cpp
		gui/banlistmodel.h
		gui/banlistpage.cpp
		gui/banlistpage.h
		gui/gui.cpp
		gui/gui.h
		gui/ipbandialog.ui
		gui/jsonlistmodel.cpp
		gui/jsonlistmodel.h
		gui/localserver.cpp
		gui/localserver.h
		gui/mainwindow.cpp
		gui/mainwindow.h
		gui/pagefactory.h
		gui/remoteserver.cpp
		gui/remoteserver.h
		gui/server.cpp
		gui/server.h
		gui/serverlogmodel.cpp
		gui/serverlogmodel.h
		gui/serverlogpage.cpp
		gui/serverlogpage.h
		gui/serversummarypage.cpp
		gui/serversummarypage.h
		gui/sessionlistmodel.cpp
		gui/sessionlistmodel.h
		gui/sessionlistpage.cpp
		gui/sessionlistpage.h
		gui/sessionpage.cpp
		gui/sessionpage.h
		gui/settings.ui
		gui/sidebaritemdelegate.cpp
		gui/sidebaritemdelegate.h
		gui/sidebarmodel.cpp
		gui/sidebarmodel.h
		gui/singleinstance.cpp
		gui/singleinstance.h
		gui/subheaderwidget.cpp
		gui/subheaderwidget.h
		gui/trayicon.cpp
		gui/trayicon.h
		gui/userlistmodel.cpp
		gui/userlistmodel.h
		gui/userlistpage.cpp
		gui/userlistpage.h
	)

	target_compile_definitions(${srvlib} PUBLIC HAVE_SERVERGUI)
	target_link_libraries(${srvlib} PUBLIC
		${QT_PACKAGE_NAME}::Gui
		${QT_PACKAGE_NAME}::Widgets
	)
endif()

if(UNIX AND NOT APPLE)
	if(INITSYS STREQUAL "systemd")
		find_package(PkgConfig)
		if(PKGCONFIG_FOUND)
			pkg_check_modules(libsystemd REQUIRED IMPORTED_TARGET libsystemd)
		else()
			message(FATAL_ERROR "pkg-config is required for INITSYS=systemd")
		endif()
	elseif(INITSYS)
		message(FATAL_ERROR "Unknown INITSYS value '${INITSYS}', must be 'systemd' or ''")
	endif()
	add_feature_info("Server init system integration (INITSYS)" "TARGET PkgConfig::libsystemd" "")
endif()

if(TARGET PkgConfig::libsystemd)
	target_sources(${srvlib} PRIVATE
		initsys_systemd.cpp
	)
	target_link_libraries(${srvlib} PRIVATE PkgConfig::libsystemd)

	configure_file(systemd/service.in ${srvname}.service @ONLY)
	install(FILES
		"${CMAKE_CURRENT_BINARY_DIR}/${srvname}.service"
		DESTINATION "${CMAKE_INSTALL_LIBDIR}/systemd/system/"
	)
else()
	target_sources(${srvlib} PRIVATE
		initsys_dummy.cpp
	)
endif()

if(TARGET libmicrohttpd::libmicrohttpd)
	target_sources(${srvlib} PRIVATE
		webadmin/qmhttp.cpp
		webadmin/qmhttp.h
		webadmin/webadmin.cpp
		webadmin/webadmin.h
	)
	target_compile_definitions(${srvlib} PRIVATE HAVE_WEBADMIN)
	target_link_libraries(${srvlib} PRIVATE libmicrohttpd::libmicrohttpd)
endif()
add_feature_info("Server web-admin support" "TARGET libmicrohttpd::libmicrohttpd" "")

dp_install_executables(TARGETS "${srvname}")

# No trailing slash on DIRECTORY is required or else it will strip the last path
# of the directory
install(
	DIRECTORY contrib
	DESTINATION ${INSTALL_APPDATADIR}
)

function(add_man_section name condition out_last_modified)
	if(condition)
		file(TIMESTAMP "${CMAKE_CURRENT_SOURCE_DIR}/man/thinsrv.1.${name}" last_modified_section "%Y-%m-%d" UTC)
		file(READ "man/thinsrv.1.${name}" ${name}_section)
		set(${name}_section ${${name}_section} PARENT_SCOPE)
		if(${${out_last_modified}} STRLESS ${last_modified_section})
			set(${out_last_modified} ${last_modified_section} PARENT_SCOPE)
		endif()
	endif()
endfunction()

if(INSTALL_DOC AND UNIX)
	string(TOUPPER ${srvname} srvname_upper)
	file(TIMESTAMP "${CMAKE_CURRENT_SOURCE_DIR}/man/thinsrv.1.in" last_modified "%Y-%m-%d" UTC)
	add_man_section(gui SERVERGUI last_modified)
	add_man_section(sodium libsodium_FOUND last_modified)
	add_man_section(webadmin libmicrohttpd_FOUND last_modified)
	configure_file(man/thinsrv.1.in ${srvname}.1 @ONLY)
	install(FILES
		"${CMAKE_CURRENT_BINARY_DIR}/${srvname}.1"
		DESTINATION "${CMAKE_INSTALL_MANDIR}"
	)
	install(FILES
		"${PROJECT_SOURCE_DIR}/LICENSE.txt"
		"${PROJECT_SOURCE_DIR}/ChangeLog"
		"${PROJECT_SOURCE_DIR}/README.md"
		DESTINATION "${CMAKE_INSTALL_DOCDIR}"
	)
	# Trailing slash is required or else it will install into `doc` subdirectory
	install(DIRECTORY "${PROJECT_SOURCE_DIR}/doc/"
		DESTINATION "${CMAKE_INSTALL_DOCDIR}"
	)
endif()

if(TESTS)
	add_subdirectory(tests)
endif()

directory_auto_source_groups()
